【问题标题】:Writing config file in C:\Program Files (x86)\MyApp\myapp.cfg, vs. Administrator privilege在 C:\Program Files (x86)\MyApp\myapp.cfg 中写入配置文件,与管理员权限对比
【发布时间】:2014-02-28 12:30:01
【问题描述】:

我已经为我的软件做了一个安装程序(使用 Inno Setup),最终安装在

C:\Program Files (x86)\MyApp\myapp.exe

像往常一样在 Windows 平台上运行,并且完美运行。

当我的软件尝试在此处写入其配置文件时出现问题:

C:\Program Files (x86)\MyApp\myapp.cfg

这里出现Permission denied 错误!

我找到的唯一解决方案是“以管理员身份运行软件”,但我不喜欢这个解决方案:我不想要求最终用户每次都必须“以管理员身份运行”他们将使用该软件。

是否有一个干净的解决方案可以在不要求最终用户“以管理员身份运行”的情况下在C:\Program Files (x86)\MyApp\myapp.cfg 中写入?

【问题讨论】:

  • 是的。有一个解决方案。永远不要将配置文件保存到应用程序文件夹!将其存储在应用程序数据文件夹中应有的位置。该应用程序将可写入您的应用程序。
  • 感谢@TLama 的回答。您是否知道文档/教程/文档显示所有此类事情的良好做法是什么?也许有一些官方的微软文档?此外,我正在寻找适用于 WinXP、WinVista、Win7、Win8 的解决方案:它们都有“应用程序数据文件夹”吗?最后一个问题:你知道如何在 Python(或任何其他语言)中获取“应用程序数据文件夹”路径吗?
  • 我已从您的最后两个问题中删除了 Inno Setup 标签,因为它们与安装程序本身无关。
  • 谢谢@TLama,你是对的。你对下面的评论有什么想法吗? stackoverflow.com/questions/22095286/… ?

标签: windows winapi uac privileges


【解决方案1】:

正如@TLama 所说,永远不要尝试写入应用程序文件夹。这从来都不是推荐的做法,而且由于 Vista 微软已经禁用它(首先允许您写入,但实际上将写入重定向到另一个目录,在以后的操作系统版本中似乎已删除的功能 - 也是一件好事,因为它正在制作支持地狱)。

要检索已知文件夹路径,请使用SHGetFolderPath 函数。根据应用程序数据是在所有用户之间共享还是仅由运行应用程序的用户使用,您应该分别使用CSIDL_COMMON_APPDATACSIDL_LOCAL_APPDATA 调用SHGetFolderPath。避免直接在这些文件夹中写入,而是创建像 <your company>\<your app> 这样的子文件夹并使用它们。

请注意,SHGetFolderPath 已被弃用,应使用 SHGetKnownFolderPath 代替它,但前提是您不需要与 Vista 之前的 Windows 版本兼容。

为了完整起见,this thread 还描述了如何将 SHGetFolderPath 导入 Python。

更新:已更正以避免使用环境变量和 SHGetFolderPath,而不是 @RemyLebeau @TLama 的每个 cmets

【讨论】:

  • 您无需关心该文件夹的物理位置,也无需对其进行硬编码。您需要做的是通过预定义的方式找到该位置,这适用于讨论的 Python,例如在this question.
  • 我同意@TLama 不需要知道正确的位置,只需要求操作系统将您引导到正确的位置。即使是为了获得支持,您也不想(尽管我过去曾这样做过)告诉您的用户发送给您,例如,在 XP 上来自C:\Documents and Settings\All Users\MyApp\myapp.log 的日志或在 Vista 或更高版本上来自C:\ProgramData\MyApp\myapp.log 的日志。这些路径可以更改,因此您唯一可以依赖的是操作系统。从应用程序本身向用户提供为他们打开应用程序目录。
  • 是的,如果您想在所有用户之间共享配置,使用%ALLUSERPROFILE%\MyApp\myapp.cfg 是存储配置的好地方。
  • 在代码中,不要使用%ALLUSERPROFILE%\MyApp。请改用SHGetFolderPath(CSIDL_COMMON_APPDATA)SHGetKnownFolderPath(FOLDERID_ProgramData),然后将\MyApp 附加到该路径。
  • 在这种情况下使用 %ALLUSERSPROFILE% 不是正确的解决方案。它提供了共享配置文件本身的路径,这不是您要查找的路径。您正在共享配置文件中寻找允许保存应用程序数据的路径。这就是CSIDL_COMMON_APPDATAFOLDERID_ProgramData 的用途。所以,C:\Documents and Settings\All Users\Application Data\MyApp 是正确的路径,而不是 C:\Documents and Settings\All Users\MyApp
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 2019-08-06
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
相关资源
最近更新 更多