使用msiexec和c#安装msi

时间:2013-08-06 20:23:24

标签: c# uac msiexec

在静默模式下在c#应用程序中安装.msi的最佳方法是什么。我想使用msiexec安装.msi文件,但我不知道如何做到这一点。问题是将msiexec与/ qn一起使用,你必须在cmd.exe进程中以“管理员”的方式运行它,我不知道如何用ac#application完成类似的事情(更多细节,一个wpf项目在VS 2010)。我遇到的最好的是:

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

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

谢谢

1 个答案:

答案 0 :(得分:2)

尽管有人在没有评论的情况下投票,但这是一个非常彻底的回答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)管理员权限从一开始,例如在bootstrapper .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)根本没有管理员权限。遗憾的是,这是不可能的,或者会破坏标准应用程序的安全策略,这些应用程序应该可以在程序目录中的机器范围内安当然,还有很多内容要详细说明。