.NET - 启用UAC时,应用程序如何自行更新(Windows7 / Vista)?

时间:2011-07-12 20:12:00

标签: .net windows-7 windows-vista windows-installer uac

以下是该方案:

我编写了一个应用程序并从Visual Studio Installer项目创建了一个安装程序(我生成了一个MSI文件)。我以管理员身份将应用程序安装到Program Files目录中。

当用户使用该应用程序时,我希望它能够自动更新(不需要打扰管理员)。现在,Windows 7和Windows Vista都有UAC来保护Program Files目录。所以,我不确定从哪里开始。

我想我读过某个地方,ClickOnce能够安装应用程序的更新,而不会打扰用户获得管理权限。

  1. 有没有可以帮助自动更新的应用程序?
  2. 如果有类似的应用程序,他们如何能够绕过提升的权限?基本上,难道不可能以某种方式复制这些应用程序在.NET(C#)中的作用吗?

  3. 我真的只是希望有一种简单的方法来使用MSI文件进行静默更新,因为我不希望普通用户拥有管理访问权限,而且我不希望管理员对此任务感到困扰。此外,显然事情不能硬编码,因为用户名和密码很容易改变。

3 个答案:

答案 0 :(得分:6)

你可以做的一件事当然是创建一个以localsystem身份运行的更新服务。这个肯定会绕过UAC。

另一个选择(因为安装服务可能被视为过于侵入)是安排任务,再次通过W7任务调度程序作为本地系统运行。

在任何一种情况下,都必须在安装期间完成,否则UAC将再次被触发。

编辑:我只是想到了另一种处理方法:你可以做Chrome风格。不要在程序文件中安装任何东西,将所有应用程序二进制文件和数据保存在用户文件夹这样,您可以只使用用户级权限并且不会触发UAC来随意升级

答案 1 :(得分:6)

如果使用相同的数字证书对安装程序和更新包进行签名,则可以使用MSI更新您的应用程序而无需管理员权限。

这称为UAC修补。 This是MSDN上的相关页面。

答案 2 :(得分:0)

ClickOnce不会将您的应用程序安装到程序文件中(如果有人需要稍后尝试找到该文件夹​​,这会非常烦人)这就是它避免它的方式。没有任何方法可以“绕过”UAC,我建议您这样做:使用icacls和takeown将安装文件夹的所有权授予本地用户,这就是Steam允许自己将游戏安装到其文件夹中的功能

修改:您还可以使用SetSecurityInfo向代码中的本地用户授予所有权。