自我更新应用程序和UAC - 最佳实现

时间:2011-10-17 15:24:11

标签: .net windows-7 uac

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

谢谢,

汤姆

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

我真的很喜欢谷歌这样做。

Google现在使用作为本地系统运行的Google更新服务更新Chrome及其他产品。 UAC在安装时触发,然后再也不会触发。应用程序安装在Program Files上,这就破坏了使用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应用程序。