尽管有人在没有评论的情况下投了反对票,但这是一个非常彻底的答案 IMO:也许有人误解了,因为答案很长。短读建议:选择选项 2) 。
首先,一般来说,尽量避免 RunAs。使用 RunAs,您正在创建并非所有场景和应用程序/流程都支持的混合用户情况。对于比 XP 更新的操作系统,这并不是必需的。要求 UAC 的管理员权限(例如 .exe 中的正确清单)至少是 MS 推荐的!(只是一个安全说明:最安全的方法仍然是将管理员帐户完全分开,因此通常不需要 RunAs 和 UAC。)
1)确保 MSI 安装的管理员权限的最简单(但不是我推荐的)方法是什么都不做,让 UAC 工作。
如果 MSI 需要管理员权限,UAC 通常会在一段时间后自行启动(并非安装过程的每个部分都需要管理员权限,因此需要一些时间。
为了确保 UAC 请求出现在子进程中,有点像 UAC 继承,您必须在基线中使用 ShellExecute。这是 Windows 的事情,与 MSI 或 C# 无关。
在 C# 中,您可以这样做:
ProcessStartInfo startInfo = new ProcessStartInfo(exeFile, arguments);
StartInfo.UseShellExecute = true;
如果您想要一个没有安装对话框(例如“/qn”)的静默安装,这没什么用处。
而且这么晚的UAC有一些小缺点,所以推荐使用以下方法并且非常安全:
2)从一开始就具有管理员权限,例如在引导程序 .exe 中:如果确定应该启动设置,或者一般来说,您的应用程序需要对其自己或子进程的管理员权限,最好确保,您的应用程序本身从一开始就已经拥有管理员权限。
换句话说,启动应用程序时会出现 UAC。然后你的子进程也有管理员权限,它也适用于 CreateProcess 类型的子进程,而不仅仅是 ShellExecute 类型。
为此,只需将清单添加到您的应用程序中,其中包含以下行。
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
怎么做?
鉴于整个 Windows 7 宣传都是基于清单的事实(“生命的意义是什么?给应用程序一个清单。”),Visual Studio 在过去几年的不同版本中并没有很好地支持这一点. 每个版本都不同,对于 C#、C++、VB 应用程序也是不同的。
对于 VS 2010 和 C#,要走的路是:(对于 VB.Net,它位于解决方案的“应用程序”选项卡中的“查看 Windows 设置”中,我已在此处阅读。)
在解决方案资源管理器中,右键单击项目并选择“添加新项目”、“新元素”并选择“应用程序清单文件”。
通过单击在 VS 中打开它,您将找到现有的节点以及描述替代方案的注释行。如果您不了解它们,最好通过谷歌搜索了解有关现代 Windows 的最重要的知识之一。
更改该行,以便配置level="requireAdministrator",您就完成了。您的应用现在需要提升权限。构建后试用。
(“uiAccess”属性,您可以忽略,直到您的应用程序控制/自动化其他应用程序的 UI,例如在远程控制或 UI 测试应用程序中。)
使用“msiexec.exe ...”正常启动 MSI 安装。不要忘记正确位置的引号并捕获错误和重新启动的返回代码。
msiexec 的替代方法是使用 MSI API(所谓的外部 UI),但它更复杂。
3)根本没有管理员权限。不幸的是,这是不可能的,或者会破坏标准应用程序的安全策略,这些应用程序应该可以安装在程序目录中的机器范围内。当然,还有很多要说的细节。