我们有一个在C++和.NET中编写的应用程序,它为程序文件文件夹中的所有用户安装。这个应用程序下载自己的新版本(作为msi安装程序),并生成新的安装程序进程来替换自己。
目前的安装过程:
-
将Install Manager应用程序(C,.NET 2.0)复制到temp目录。称之为“经理”
-
经理以提升的权限执行
per this article
.
-
原始应用程序退出。
-
管理器生成MSI安装程序(具有提升的权限,因为副本已提升)
-
管理器生成应用程序的新版本。
错误:
新安装的应用程序正在提升状态下运行。这导致了一些我在这里不想列举的问题。
理想情况下,新安装的应用程序的启动将以原始用户的权限运行。
我不知道如何在提升后将应用程序降级回标准用户。
一个不雅的黑客:
(是的,是的,整个过程都很糟糕)
-
将安装管理器复制到临时目录
-
使用标准用户权限运行安装管理器。让我们称此实例为“LowlyManager”。
-
原始应用程序退出。
-
LowlyManager生成应用程序
再一次
,这一次是提升的私人空间。让我们将此实例命名为“uppermanagement”
-
上层管理生成安装程序
-
uppermanagement优雅地退出,返回安装程序的退出代码。
-
LowlyManager从UpperManagement解释错误代码,并生成新安装的应用程序。这次作为原始调用程序。
有更好的方法吗?
(在这些步骤之前和之后,我遗漏了一些其他的细节,这些细节使流程对用户更加顺畅,但这足以理解我要解决的问题的核心。)
其他要求:
-
我们无法按用户应用程序安装
-
如果UAC只是简单地询问“您确定要允许这样做吗?”,则不应向用户显示身份验证对话框。。我认为这可能会扼杀使用WindowsImpersonationContext的解决方案,但我不确定。
-
系统需要在xp、vista和windows 7上工作(即使xp有单独的进程)。