我们有一个用 C++ 和 .NET 编写的应用程序,它为 Program Files 文件夹中的所有用户安装。此应用程序下载其自身的新版本(作为 MSI 安装程序)并生成新的安装程序进程以替换自身。
今天存在的安装过程:
- 将安装管理器应用程序(C#、.NET 2.0)复制到临时目录。称此“经理”
- 根据本文,Manager 以提升的权限执行。
- 原始应用程序退出。
- 管理器生成 MSI 安装程序(具有提升的权限,因为副本已提升)
- Manager 生成新版本的应用程序。
错误:
新安装的应用程序正在提升状态下运行。这会导致我不会在这里列举的问题。
理想情况下,新安装的应用程序的启动将以原始用户的权限运行。
我不知道如何在提升后将应用程序降级为标准用户。
一个不雅的hack:
(是的,是的,这整个过程无论如何都不优雅)
- 将安装管理器复制到临时目录
- 使用标准用户权限运行安装管理器。让我们将此实例称为“LowlyManager”。
- 原始应用程序退出。
- LowlyManager再次生成应用程序,这次是提升权限。让我们将此实例命名为“UpperManagement”
- UpperManagement 生成安装程序
- UpperManagement 正常退出,返回安装程序的退出代码。
- LowlyManager 解释来自 UpperManagement 的错误代码,并生成新安装的应用程序。这次作为原始调用者。
有一个更好的方法吗?
(我在这些步骤之前和之后遗漏了许多其他细节,这些步骤使用户的过程更顺畅,但这应该足以理解我要解决的问题的核心。)
其他需求:
- 我们无法安装为每用户应用程序
- 如果 UAC 只是询问“您确定要允许此操作吗?”,则不应向用户显示身份验证对话框。我认为这可能会破坏使用 WindowsImpersonationContext 的解决方案,但我不确定。
- 系统需要在 XP、Vista 和 Windows 7 上运行(即使 XP 有单独的进程)。