我正在尝试使用 C# 悄悄地安装一个.msi文件,而无需任何用户输入。我在尝试通过许可协议以便安装可以继续时遇到问题。有没有办法传递参数,以便在没有任何用户输入的情况下接受协议?
注意 :我会避免从应用程序二进制文件中触发软件安装 -除非您正在制作实际的安装启动器应用程序。它可以工作,但它可能会引发防病毒和恶意软件扫描程序的严重问题。我以前见过。我假设您还需要以管理员权限运行提升以启动安装(每台计算机安装(。
首先是一些题外话和建议
:MSI可以通过msiexec.exe commands
,Powershell
,DTF C#
(见下文(,WMI
,MSI API
(COM
,Win32
(安装。
批处理:话虽如此,为什么不直接使用常规批处理文件进行安装?/QN 开关将绕过整个安装程序 GUI 序列,然后无需接受任何许可协议。MSI 日志记录信息(简短版本:打开日志并搜索"值 3"以查找错误(。
此命令必须从提升的命令提示符(管理员权限(运行:
msiexec.exe /I "Installer.msi" /QN /L* "C:msilog.log" ALLUSERS=1
设置.exe:您还可以制作WiX Burn捆绑包(请参阅代码模型链接(或使用某种其他工具来制作将安装原始应用程序然后按顺序安装其他组件的setup.exe
- 因此无需触发从应用程序安装。
交互式安装:如果要通过某些用户交互进行安装,则可以找到控制许可协议接受状态的属性,并将其设置为适当的值(通常为 1(以指示接受的许可证。
DTF:现在是代码答案。WiX工具包安装了一个名为DTF - Desktop Tools Foundation
的组件 它具有许多C#类,旨在通过托管代码处理MSI文件。这个答案解释了在Visual Studio中添加什么文件作为参考,并简要描述了DTF的不同文件/程序集。另一个 DTF 示例。
用于您描述目的的相关文件是:"Microsoft.Deployment.WindowsInstaller.dll"
。
注意!
You must launch Visual Studio with admin rights to install per machine
.- 将项目引用添加到
"%ProgramFiles(x86)%WiX Toolset v3.11binMicrosoft.Deployment.WindowsInstaller.dll"
。
以下代码在VS2017中测试(更详细的版本,管理员检查在这里 - 压缩(:
using System;
using Microsoft.Deployment.WindowsInstaller;
// RUN WITH ADMIN RIGHTS
namespace DTFTest
{
class Program
{
static void Main(string[] args)
{
try
{
Installer.SetInternalUI(InstallUIOptions.Silent);
Installer.EnableLog(InstallLogModes.Verbose, @"E:Install.log");
Installer.InstallProduct(@"E:Install.msi", "");
}
catch (Exception ex)
{
Console.WriteLine("Exception:nn " + ex.Message);
}
}
}
}
链接:
- 重新启动时启动的问题
- 通过 VBScript COM、DTF、Win32 安装
通常,您只是像默默运行 msi 一样
msiexec/i foo.msi/qn
如果 MSI 已实施其他同意,则可能需要传递类似
msiexec/i foo.msi/qn ACCEPTEULA=1
此属性的确切名称取决于 MSI,因此您需要查阅供应商文档或使用 ORCA 等工具检查 MSI。