c++ - UAC,需要管理员和文件访问

标签 c++ windows winapi windows-vista uac

我在 Vista/7 上遇到 UAC 问题。我的 UAC 执行级别 = requireAdministrator 的安装程序安装并运行我的应用程序。应用程序 UAC 执行级别 = asInvoker。所以第一次由安装程序运行的应用程序——它以管理员身份运行。然后,应用程序创建一些文件来存储自身状态。后来——如果应用程序是由用户启动的,而不是管理员——应用程序只能从创建的文件中读取,但不能覆盖它们。我试图在应用程序 list 中禁用 UAC,或者构建没有 list 的应用程序,但结果仍然相同—— - 当应用程序以用户身份运行时,无法覆盖以管理员身份运行应用程序时创建的每个文件。我尝试了其他一些安装程序,如 Inno Setup,但没有遇到像我的问题那样的问题......所以我的问题 - 为什么它会发生在我的案例中以及如何解决它?谢谢。

附言重要笔记 1.实际上它不是安装程序。这是更新主要应用程序可执行文件的实用程序。主应用程序检查服务器是否有更新(如果有)——将更新下载到临时文件夹,然后启动具有提升权限的实用程序 (http://www.codeproject.com/KB/vista-security/UAC__The_Definitive_Guide.aspx) 以替换Program Files 文件夹中的可执行文件。主应用程序在启动实用程序后立即终止。 2. 所有文件应用程序存储在 ProgramData\myAppName 文件夹中。

最佳答案

您安装的应用程序是仅针对当前用户还是针对机器上的所有用户?

对于每用户安装,安装程序在用户的 AppData 文件夹中创建初始应用程序状态是有意义的。 MSI 以非提升的方式运行每用户安装,因此应用程序无法修改的 AppData 文件夹中的文件没有问题。

对于每台机器安装,将任何内容放入特定用户的 AppData 文件夹或用户配置文件位置下的任何位置都没有意义。新用户可以在安装应用程序后登录机器,他们不会有任何东西。

也就是说,您有三种解决方案(实际上是两种解决方案和一种 hack):

  1. 使用每用户安装。设置 ALLUSERS=2 和 MSIINSTALLPERUSER=1。您的 MSI 将以非提升的方式运行。 MSI 可以自由地将任何状态文件放在 AppData 文件夹中。
  2. 使用每台机器安装。不要写入用户的应用程序数据。相反,将初始状态文件写入 %ALLUSERSPROFILE%。它们对应用程序是只读的。修改您的应用程序以在首次运行时将初始状态从 %ALLUSERPROFILE% 复制到当前用户配置文件。
  3. 将自定义操作添加到您的安装程序以将用户添加到 ACL。

(#3) 是一个 hack,我不推荐它,因为你的应用程序对于新用户来说会被破坏,或者当用户在机器上重新创建他的配置文件时。

关于c++ - UAC,需要管理员和文件访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5573532/

相关文章:

c++ - 我可以用 native 代码扩展 Corona 吗?

c++ - C++中的内部函数内存限制

windows - 如何在 Windows 中执行 .r 文件

c - LoadLibraryExW 加载 User32.dll 失败

javascript - 编程语言中变量提升的优点和缺点是什么?

c++ - 无法在 Apache Ignite 中安装 ODBC 驱动程序 C++

mysql - 如何将数据库名称从批处理传递到mysql脚本

c++ - char 和 wchar_t 之间的转换在 Windows 中如何工作?

delphi - 我可以在 Delphi 中即时编译代码并执行它吗?

winapi - LogonUser 使用 LOGON32_LOGON_NEW_CREDENTIALS 对远程不受信任的域机器起作用