windows - 在C :\Program Files (x86)\MyApp\myapp. cfg中写入配置文件,与管理员权限

标签 windows winapi uac privileges

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

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

在 Windows 平台上和往常一样,它运行得很好。

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

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

这里出现权限被拒绝错误!

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

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

最佳答案

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

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

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

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

更新:已更正以避免使用环境变量和 SHGetFolderPath相反,根据 @RemyLebeau @TLama 的评论

关于windows - 在C :\Program Files (x86)\MyApp\myapp. cfg中写入配置文件,与管理员权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22095286/

相关文章:

c++ - 如何为 QT Windows 应用程序设置不同的桌面快捷方式图标和不同的任务栏图标?

windows - 如何在本地创建一个telnet服务器?

wpf - 如何在 WPF 应用程序中设置 TextBlock 和标签的默认颜色、字体系列和字体大小?

c++ - 我应该为 WNDCLASSEX 结构中的 hIcon 和 hIconSm 使用什么值?

c++ - 使用 Win32 将 GDI 绘图大小缩放到窗口大小

windows-7 - 计划任务中UAC阻止的exe名称,如update.exe

python - Windows错误 : [Error 126] when loading a DLL with ctypes

c++ - 无法在堆栈上创建 std::list

windows-7 - Windows 7 将保存到 Program Files 的文件放在哪里

mfc - 如何使 MFC 应用程序在 Windows 7 和 Vista 中绕过 UAC