【问题标题】:Self updating application and UAC - optimal implementation自我更新应用程序和 UAC - 最佳实施
【发布时间】:2011-12-09 09:40:41
【问题描述】:

我正在寻求一些指导,以使自更新应用程序符合 UAC 标准。 我有一个应用程序可以在启动时检查更新,然后自动下载任何新的二进制文件并用较新的二进制文件替换它们。 问题在于,在 Windows 7 下,任何写入 Program Files 文件夹的应用程序似乎都需要管理员 UAC 提升。 我们已将代码添加到应用程序清单以自动请求 UAC 提升以使更新工作,但这自然不是最佳解决方案,因为如果用户启用了 UAC 提示,用户将看到管理员提示。 我有哪些选择可以符合 UAC 并仍保持应用程序的自我更新属性?

谢谢,

汤姆

【问题讨论】:

标签: .net windows-7 uac


【解决方案1】:

基本上,如果您想安装到 Program Files,则需要显示 UAC 提示。

当然,您可以修改安装文件夹的访问控制设置(即您在资源管理器属性对话框的安全页面中设置的内容)以使其可写。但这将违反所有已知的最佳实践。我不会提倡它。

另一种方法是执行 Chrome 的操作并在用户配置文件下安装。这种方法有缺点。这样做需要机器上的每个用户都安装软件,然后每个用户都需要单独更新。您也失去了 UAC 提供的一些保护。

【讨论】:

  • 这是唯一的方法吗?是否有任何选项可以使用特定证书等对应用程序进行签名?
  • 签名只是改变提示的外观,而不是是否有提示。
  • 您可以修改安装文件夹的访问控制以使其可写,但这将违反所有已知的最佳实践。我不会提倡它。用户已经习惯了需要提升才能更新的应用程序。 Firefox 就是一个典型的例子。
  • 您可以安装到公共配置文件。这就是《魔兽世界》所做的,这意味着他们不必提示用户许可,也可以写入自己的安装目录。
  • @Ramhound 二进制文件再次变得容易受到攻击,因为它们没有写保护,就像 Chrome 的情况一样。要么您安装到 Program Files,然后安装程序和更新程序必须运行提升,但因此它们受到更多保护,或者您安装到用户或公共配置文件,在这种情况下,该过程对用户来说更方便。
【解决方案2】:

除了大卫所说的之外,您还可以安装一个后台服务来为您管理更新。该服务将从您的应用程序接收更新请求并管理将文件写入安装目录。从用户的角度来看,这将是完全无缝的,没有 UAC 提示(除了一个,在初始安装时)。

【讨论】:

    【解决方案3】:

    您不应该要求管理员权限来运行您的应用程序,因此您的应用程序清单应该包含asInvoker 级别。否则受限用户将无法运行您的应用程序,这肯定不是您想要的。

    David 提到 Firefox,这是它自动更新的方式。它不需要管理员权限即可运行。 Firefox 在后台下载更新并将其保存在硬盘上。下次用户启动 Firefox 时,它会看到已准备好安装更新并启动较新版本的安装程序。安装程序必须运行提升,这就是用户看到 UAC 提升提示的原因。更新完成后,Firefox 会再次启动非提升

    棘手的部分是在更新完成时以非提升方式启动 Firefox。我不建议使用技巧从提升的进程开始非提升的进程。您应该使用常规用户安全令牌保留一个进程。我不知道 Firefox 是如何处理它的,但最简单的方法是:启动非提升的更新程序(在清单中用 asInvoker 标记它),然后更新程序用 ShellExecute 函数和 runas 动词提升自身重新启动.当提升的进程完成后,它会启动更新的应用程序。

    【讨论】:

      【解决方案4】:

      我真的很喜欢 Google 的做法。

      Google 现在使用作为本地系统运行的 Google 更新服务来更新 Chrome 及其其他产品。 UAC 在安装时触发,然后再也不会触发。应用程序安装到程序文件中,这解决了使用 AppData 的双重问题:首先,许多企业阻止从 AppData 启动的可执行文件;而且,更重要的是,一台机器上的多个用户都必须单独安装到该机器上的 AppData。

      当有新版本可用时,Updater Service 会在基本目录下静默添加版本文件夹(例如,Program Files\Google\Chrome\Application\45.0.2454.93,然后是 Program Files\Google\Chrome\Application \45.0.2454.101)。 Chrome 启动器只是从最高版本的文件夹中运行 Chrome 应用程序。

      【讨论】:

        猜你喜欢
        • 2011-08-22
        • 1970-01-01
        • 2011-05-02
        • 2010-10-17
        • 1970-01-01
        • 2011-10-03
        • 2012-12-10
        • 1970-01-01
        • 2015-02-11
        相关资源
        最近更新 更多