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