2

以静默模式在 ac# 应用程序中安装 .msi 的最佳方法是什么。我想使用 msiexec 安装一个 .msi 文件,但我不知道该怎么做。问题在于将 msiexec 与 /qn 一起使用,您必须在 cmd.exe 进程中以“管理员身份”启动它,并且我不知道如何使用 ac# 应用程序完成类似的操作(有关更多详细信息,请参阅 wpf 项目在 VS 2010 中)。我来的最好的是:

Process p = new Process();
p.StartInfo.FileName = "runas.exe";
p.StartInfo.Arguments = "/user:Administrator cmd";
p.Start();

会弹出一个窗口并要求输入密码,但我发现这种行为非常难看。我的意思是,我不想向用户询问他的密码。有没有办法启动我的项目,将其设置为一种“以管理员身份运行”(UAC 会弹出,但没关系)然后运行 ​​msiexec 命令?或者有没有其他方法可以静默安装 .msi 文件?

谢谢

4

1 回答 1

4

尽管有人在没有评论的情况下投了反对票,但这是一个非常彻底的答案 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)根本没有管理员权限。不幸的是,这是不可能的,或者会破坏标准应用程序的安全策略,这些应用程序应该可以安装在程序目录中的机器范围内。当然,还有很多要说的细节。

于 2013-08-07T10:29:56.750 回答