0

我们有一个用 C++ 和 .NET 编写的应用程序,它为 Program Files 文件夹中的所有用户安装。此应用程序下载其自身的新版本(作为 MSI 安装程序)并生成新的安装程序进程以替换自身。

今天存在的安装过程:

  1. 将安装管理器应用程序(C#、.NET 2.0)复制到临时目录。称此“经理”
  2. 根据本文,Manager 以提升的权限执行。
  3. 原始应用程序退出。
  4. 管理器生成 MSI 安装程序(具有提升的权限,因为副本已提升)
  5. Manager 生成新版本的应用程序。

错误:

新安装的应用程序正在提升状态下运行。这会导致我不会在这里列举的问题。

理想情况下,新安装的应用程序的启动将以原始用户的权限运行。

我不知道如何在提升后将应用程序降级为标准用户。

一个不雅的hack:

(是的,是的,这整个过程无论如何都不优雅)

  1. 将安装管理器复制到临时目录
  2. 使用标准用户权限运行安装管理器。让我们将此实例称为“LowlyManager”。
  3. 原始应用程序退出。
  4. LowlyManager再次生成应用程序,这次是提升权限。让我们将此实例命名为“UpperManagement”
  5. UpperManagement 生成安装程序
  6. UpperManagement 正常退出,返回安装程序的退出代码。
  7. LowlyManager 解释来自 UpperManagement 的错误代码,并生成新安装的应用程序。这次作为原始调用者。

有一个更好的方法吗?

(我在这些步骤之前和之后遗漏了许多其他细节,这些步骤使用户的过程更顺畅,但这应该足以理解我要解决的问题的核心。)

其他需求:

  • 我们无法安装为每用户应用程序
  • 如果 UAC 只是询问“您确定要允许此操作吗?”,则不应向用户显示身份验证对话框。我认为这可能会破坏使用 WindowsImpersonationContext 的解决方案,但我不确定。
  • 系统需要在 XP、Vista 和 Windows 7 上运行(即使 XP 有单独的进程)。
4

1 回答 1

1

一种方式: http: //www.codeproject.com/KB/vista-security/VistaElevator.aspx

另一种方式(在上一篇文章的最新评论中提到):http ://brandonlive.com/2008/04/27/getting-the-shell-to-run-an-application-for-you-part-2-how /

于 2010-03-31T23:50:59.533 回答