UAC,requireAdministrator和files访问

时间:2011-04-06 22:04:17

标签: c++ windows winapi windows-vista uac

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

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

2 个答案:

答案 0 :(得分:1)

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

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

对于每台计算机的安装,将任何内容放入特定用户的AppData文件夹或用户配置文件位置下的任何位置都没有意义。安装应用程序后,新用户可以登录计算机,并且没有任何内容。

那就是说,你有三个解决方案(实际上是两个解决方案和一个黑客):

  1. 使用每用户安装。设置ALLUSERS = 2和MSIINSTALLPERUSER = 1。您的MSI将不会升级。 MSI可以自由地将任何状态文件放在AppData文件夹中。
  2. 使用每台机器安装。不要写入用户的appdata。而是将初始状态文件写入%ALLUSERSPROFILE%。它们对应用程序是只读的。修改您的应用程序,以便在首次运行时将初始状态从%ALLUSERPROFILE%复制到当前用户配置文件。
  3. 向安装程序添加自定义操作,以将用户添加到ACL。
  4. (#3)是一个黑客,我不推荐它,因为你的应用程序会被新用户破坏,或者当用户在机器上重新创建他的个人资料时。

答案 1 :(得分:1)

如果不需要管理员权限,则不应启动主应用程序。你使用什么类型的安装程序?

MSI以当前用户权限运行,仅提升以更改系统。安装完成后,您可以启动主应用程序,它将作为当前用户运行,不提升。

如果您自定义setup.exe,则可以非升级启动安装程序。当需要安装文件时,启动另一个进程(可以是相同的可执行文件)来安装文件并进行系统范围的更改。完成此步骤后,您可以从初始过程中重新启动主应用程序。

或者,使用当前设置和更新程序运行升级的方法,按照How do I start a program as the desktop user from an elevated app上的说明启动主应用非提升

注意:ProgramData的默认权限允许每个人创建文件和文件夹,但只有创建它们的用户才能修改文件(或管理员)。要解决这个问题,您有两种选择:

  1. 直接在用户个人资料中创建数据文件。每个用户都有自己的数据。
  2. 从存储在ProgramData中的通用模板创建用户配置文件数据,为suggested by Seva in option 2。在这种情况下,每个用户也将拥有自己的数据。
  3. 或修改ProgramData目录中应用程序数据的ACL,以允许所有人修改,而不仅仅是创建文件夹和文件的用户。