【问题标题】:.NET - How are applications able to update themselves when UAC is enabled (Windows7/Vista)?.NET - 启用 UAC (Windows7/Vista) 时应用程序如何自我更新?
【发布时间】:2011-10-03 23:17:00
【问题描述】:

这是场景:

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

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

我想我在某处读到 ClickOnce 能够安装应用程序更新,而无需打扰用户获得管理权限。

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

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

【问题讨论】:

  • ClickOnce 应用程序未安装到 c:\program 文件中。所以这很容易。谷歌浏览器是另一个例子,安装在 C:\Users\YourName\AppData\Local

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


【解决方案1】:

您可以做的一件事肯定会奏效,那就是创建一个作为本地系统运行的更新服务。这个肯定会绕过 UAC。

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

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

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

【讨论】:

  • 是的,我考虑过,但这意味着如果其他用户登录,则必须重新安装。
  • @myermian:这样想:如果它是一个用户应用程序,那么由用户来安装它。同样,Chrome 确实以这种方式工作。如果是系统应用,那么创建更新服务可能就可以了
  • 实际上chrome不再安装到appdata中,它安装到程序文件中并且仍然能够静默更新自己。
【解决方案2】:

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

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

【讨论】:

  • 获取签名证书不花钱吗?或者,有没有办法通过 Visual Studio 做到这一点?
  • 您可以生成自己的证书进行测试,但用户可能会收到不可信的警告。 startssl.com 有相当便宜的证书。 (暂时离线)
  • 他们只会在首次安装或更新期间收到警告吗?
  • ZippyV:非常有趣!感谢您分享。
【解决方案3】:

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

编辑:您还可以在代码中使用SetSecurityInfo 将所有权授予本地用户。

【讨论】:

    猜你喜欢
    • 2011-01-16
    • 2011-12-09
    • 2011-05-02
    • 2012-02-15
    • 2014-06-08
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    相关资源
    最近更新 更多