【发布时间】:2020-06-11 16:50:57
【问题描述】:
我正在尝试使用 C# 安静地安装 .msi 文件,而无需任何用户输入。我在尝试通过许可协议以继续安装时遇到问题。有没有办法传递参数,以便在没有任何用户输入的情况下接受协议?
【问题讨论】:
标签: c# visual-studio c#-4.0 windows-installer visual-studio-2019
我正在尝试使用 C# 安静地安装 .msi 文件,而无需任何用户输入。我在尝试通过许可协议以继续安装时遇到问题。有没有办法传递参数,以便在没有任何用户输入的情况下接受协议?
【问题讨论】:
标签: c# visual-studio c#-4.0 windows-installer visual-studio-2019
注意:我会避免从应用程序二进制文件中触发软件安装 - 除非您正在制作实际的安装启动器应用程序。它可以工作,但可能会引发反病毒和恶意软件扫描程序的严重问题。我以前见过。我假设您还需要以 管理员权限 运行提升权限来启动您的安装(每台机器安装)。
一些题外话和建议先:MSI可以通过msiexec.exe commands、Powershell、DTF C#(见下文)、WMI、MSI API(COM、Win32 >)。
批处理:话虽如此,您为什么不直接使用常规批处理文件进行安装? /QN 开关将绕过整个设置 GUI 序列,然后应该不需要接受任何许可协议。 MSI logging information(短版:打开日志并搜索“value 3”查找错误)。
此命令必须从提升的命令提示符(管理员权限)运行:
msiexec.exe /I "Installer.msi" /QN /L* "C:\msilog.log" ALLUSERS=1
Setup.exe:您也可以创建一个WiX Burn bundle(参见代码模型链接)或使用其他工具来创建一个setup.exe将依次安装您的原始应用程序和其他组件 - 因此无需触发从应用程序安装。
交互式安装:如果您想通过一些用户交互进行安装,您可以找到控制许可协议接受状态的属性并将其设置为适当的值 -通常为 1 - 表示接受的许可证。
DTF:现在是代码答案。有一个与WiX toolkit 一起安装的组件,名为DTF - Desktop Tools Foundation。它有许多 C# 类,旨在通过托管代码处理 MSI 文件。 This answer 解释了要在 Visual Studio 中添加作为参考的文件,并简要描述了 DTF 的不同文件/程序集。 Another DTF sample.
与您描述的目的相关的文件是:"Microsoft.Deployment.WindowsInstaller.dll"。
注意!
You must launch Visual Studio with admin rights to install per machine。"%ProgramFiles(x86)%\WiX Toolset v3.11\bin\Microsoft.Deployment.WindowsInstaller.dll"。以下代码在VS2017中测试(a more elaborate version with admin check here - zipped):
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:\n\n " + ex.Message);
}
}
}
}
链接:
【讨论】:
通常你只是默默地运行 msi,就像
msiexec /i foo.msi /qn
如果 MSI 实施了额外的同意,您可能需要传递类似的属性
msiexec /i foo.msi /qn ACCEPTEULA=1
此属性的确切名称取决于 MSI,因此您需要查阅供应商文档或使用 ORCA 等工具检查 MSI。
【讨论】: