c# - 使用 msiexec 和 c# 安装 msi

标签 c# uac windows-installer

在 C# 应用程序中以静默模式安装 .msi 的最佳方法是什么。我想使用 msiexec 安装 .msi 文件,但我不知道如何执行此操作。问题是使用 msiexec 和/qn 时,您必须在 cmd.exe 进程中运行它,以“以管理员身份”启动,并且我不知道如何使用 C# 应用程序完成类似的操作(有关更多详细信息,请参阅 wpf 项目在 VS 2010 中)。我得到的最好的结果是:

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

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

谢谢

最佳答案

尽管有人在没有评论的情况下投票否决,但在我看来,这是一个非常彻底的答案: 也许有人误解了,因为答案很长。 短读建议:选择选项 2) 。

首先,一般来说,尽量避免使用 RunAs。使用 RunAs,您将创建一种混合用户情况,并非所有场景和应用程序/进程都支持这种情况。对于比 XP 更新的操作系统,实际上没有必要。需要 UAC 的管理员权限(例如 .exe 中的正确 list )至少是 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) 从一开始就具有管理员权限,例如在 Bootstrap .exe中: 如果确定应该启动设置,或者一般来说,您的应用程序需要其自身或子进程的管理员权限,那么最好的想法是确保您的应用程序本身从一开始就已经拥有管理员权限。
换句话说,UAC 在启动应用程序时出现。那么你的子进程也拥有管理员权限,它也适用于 CreateProcess 类型的子进程,而不仅仅是 ShellExecute 类型。

要实现此目的,只需将包含以下行的 list 添加到您的应用程序即可。

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

怎么做?

考虑到整个 Windows 7 宣传都是基于 list 的(“生命的意义是什么?给应用程序一个 list 。”),Visual Studio 在过去几年的不同版本中并没有真正做得很好。支持这一点。每个版本都不同,C#、C++、VB 应用程序也不同。

对于 VS 2010 和 C#,要走的路是: (对于 VB.Net,它位于解决方案“应用程序”选项卡的“查看 Windows 设置”中,我已在此处阅读。)

在解决方案资源管理器中,右键单击项目并选择“添加新项”、“新元素”,然后选择“应用程序 list 文件”。

通过单击在 VS 中打开它,您将找到现有节点以及描述替代方案的注释行。如果您不了解它们,最好通过谷歌搜索来了解有关现代 Windows 的最重要的事情之一。
更改该行以配置 level="requireAdministrator",然后就完成了。您的应用程序现在需要提升权限。构建后尝试。

(您可以忽略“uiAccess”属性,直到您的应用程序控制/自动化其他应用程序的 UI,例如在远程控制或 UI 测试应用程序中。)

使用“msiexec.exe ...”正常启动 MSI 安装。不要忘记正确位置的引号,并捕获错误的返回代码并重新启动。

msiexec 的替代方法是使用 MSI API(所谓的外部 UI),但它更复杂。

3) 根本没有管理员权限。不幸的是,这是不可能的,或者会破坏标准应用程序的安全策略,这些应用程序应该在程序目录中安装在机器范围内。当然,对此还有很多细节要说。

关于c# - 使用 msiexec 和 c# 安装 msi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18089746/

相关文章:

unicode - 无法使用自定义操作将 MSI 安装到用户名中包含非 ascii 字符的非管理员

c# - 如何判断请求的目录是否可写?

c# - 使用 Mailkit : "The SMTP server has unexpectedly disconnected."

c# - 将字符串映射到实体以与通用方法一起使用

c# - 搜索继承者使用的继承类的方法/属性

windows - 如何自动提升我的批处理文件,以便它在需要时从 UAC 管理员权限请求?

c# - 如何保证我的 WPF 应用程序的永久管理员权限

windows-installer - 强制用户运行 setup.exe 而不是 *.msi

windows-installer - 如何让 InstallShield LE 自动卸载现有安装?

c# - 如何从字符串设置 Border.BorderBrush