UAC, requireadadministrator和文件访问

UAC, requireAdministrator and files access

本文关键字:文件 访问 requireadadministrator UAC      更新时间:2023-10-16

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

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

您是仅为当前用户安装应用程序还是为计算机上的所有用户安装应用程序?

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

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

也就是说,你有三个解决方案(实际上是两个解决方案和一个hack):
  1. 使用每个用户安装。设置ALLUSERS=2, MSIINSTALLPERUSER=1。您的MSI将在非升高状态下运行。MSI可以自由地将任何状态文件放在AppData文件夹中。
  2. 使用单机安装。不要写入用户的appdata。相反,将初始状态文件写入%ALLUSERSPROFILE%。它们对应用程序是只读的。修改应用程序,在首次运行时将初始状态从%ALLUSERPROFILE%复制到当前用户配置文件。
  3. 在安装程序中添加自定义操作以将用户添加到acl。

(#3)是一个hack,我不推荐这样做,因为你的应用程序会因为新用户而崩溃,或者当用户在机器上重新创建他的配置文件时。

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

MSI以当前用户权限运行,仅在对系统进行更改时才提升。安装完成后,你可以启动你的主应用程序,它将作为当前用户运行,非提升。

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

或者,在你当前的方法中,安装和更新程序是高架运行的,请按照桌面用户如何从高架应用程序启动程序来启动你的主应用程序非高架

注意:ProgramData的默认权限允许每个人创建文件和文件夹,但只有创建它们的用户可以修改文件(或管理员)。为了克服这个问题,您有两个选项:

  1. 直接在用户配置文件中创建数据文件。每个用户都有自己的数据。
  2. 根据选项2中Seva的建议,从存储在ProgramData中的公共模板创建用户配置文件数据。在这种情况下,每个用户也有自己的数据。
  3. 或者修改ProgramData目录中应用程序数据的acl,以允许所有人修改,而不仅仅是创建文件夹和文件的用户。