【问题标题】:Is there a way to accept the license agreement to a silent installation of a .msi file using C#?有没有办法接受使用 C# 静默安装 .msi 文件的许可协议?
【发布时间】:2020-06-11 16:50:57
【问题描述】:

我正在尝试使用 C# 安静地安装 .msi 文件,而无需任何用户输入。我在尝试通过许可协议以继续安装时遇到问题。有没有办法传递参数,以便在没有任何用户输入的情况下接受协议?

【问题讨论】:

    标签: c# visual-studio c#-4.0 windows-installer visual-studio-2019


    【解决方案1】:

    注意:我会避免从应用程序二进制文件中触发软件安装 - 除非您正在制作实际的安装启动器应用程序。它可以工作,但可能会引发反病毒和恶意软件扫描程序的严重问题。我以前见过。我假设您还需要以 管理员权限 运行提升权限来启动您的安装(每台机器安装)。


    一些题外话和建议先:MSI可以通过msiexec.exe commandsPowershellDTF C#(见下文)、WMIMSI APICOMWin32 >)。

    批处理:话虽如此,您为什么不直接使用常规批处理文件进行安装? /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"

    注意!

    1. You must launch Visual Studio with admin rights to install per machine
    2. 将项目引用添加到"%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);
                }
            }
        }
    }
    

    链接

    【讨论】:

      【解决方案2】:

      通常你只是默默地运行 msi,就像

      msiexec /i foo.msi /qn

      如果 MSI 实施了额外的同意,您可能需要传递类似的属性

      msiexec /i foo.msi /qn ACCEPTEULA=1

      此属性的确切名称取决于 MSI,因此您需要查阅供应商文档或使用 ORCA 等工具检查 MSI。

      【讨论】:

      • 谢谢!但是,如果我需要更改的属性是私有的怎么办?我无法在 CMD 上更改它。
      • 创建转换并更改行为,以便您可以。
      猜你喜欢
      • 2019-04-14
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 2021-08-30
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多