在安装过程中启动 Msiexec 的自定义操作

Custom action to launch Msiexec during setup

我完成了我的软件,但我找不到正确的方法来创建它的设置。

我在网上和此处进行了搜索,但我发现只有旧的 post 指的是旧的 visual studio 版本。

据我所知,在 VS 2013 社区版中我有一个有限的 Installshield 插件,我也能够下载 Visual Studio 安装程序插件。创建一个简单的设置相对容易,但我需要在设置过程中静默安装一个小软件。本软件为Double Agent(Microsoft Agent更新版),开发者推荐使用以下方式启动设置:

简单运行:

msiexec /i DoubleAgent_x86.msi /qb-!

在你的设置过程中(我认为最好的地方应该是 Commit 事件)。

顺便说一下,无法通过操作启动 .msi 安装程序,我真的不明白创建自定义操作的最佳做​​法。

我阅读了有关创建 class 的内容,但大多数文章都提到了 Visual Studio 2008 或 Wix 插件。我正在寻找一种将 Msiexec 与 Visual Studio 安装程序或 installshield 一起使用的方法。

编辑:我找到了这个解决方案并且效果很好:https://msdn.microsoft.com/it-it/library/vstudio/d9k65z2d%28v=vs.100%29.aspx

它是意大利语,但使用右上角的单选按钮很容易翻译成原始语言(英语)。它与 Visual Studio 安装插件和 VS 社区版 2013 完美配合。

目前我没有 post 的代码,因为我只构建了他们的示例,但我会尽快 post 使用 msiexec 进行隐藏安装。

我创建了一个测试 winform 项目,我使用以下代码添加了安装程序 class:

        [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
        public override void Commit(IDictionary savedState)
        {
            base.Commit(savedState);
            // Use ProcessStartInfo class
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.CreateNoWindow = false;
            startInfo.UseShellExecute = false;
            startInfo.FileName = "msiexec.exe";
            startInfo.WindowStyle = ProcessWindowStyle.Hidden;
            startInfo.Arguments = "/i DoubleAgent.msi /qb-!";

            try
            {
                // Start the process with the info we specified.
                // Call WaitForExit and then the using statement will close.
                using (Process exeProcess = Process.Start(startInfo))
                {
                    exeProcess.WaitForExit();
                }
            }
            catch
            {
                // Log error.
            }
        }

并且我使用 Visual Studio 安装程序创建了设置。在主要安装结束时,开始说还有另一个安装,但双重代理没有安装。

再次编辑:我没有静默执行 msiexec 的管理员权限。我认为是因为双重间谍设置需要管理员权限。我不想使用清单来提升权限,那么我认为唯一的解决方案是显示 DoubleAgent 安装程序(即使输出最少)。

顺便说一句,我在表单 1 按钮中使用了这段代码:

private void button1_Click(object sender, EventArgs e)
{
    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.CreateNoWindow = true;
    startInfo.UseShellExecute = false;
    startInfo.FileName = "msiexec.exe";
    startInfo.WindowStyle = ProcessWindowStyle.Hidden;
    startInfo.Arguments = "/i DoubleAgent.msi /qn";

    try
    {
        // Start the process with the info we specified.
        // Call WaitForExit and then the using statement will close.
        using (Process exeProcess = Process.Start(startInfo))
        {
            exeProcess.WaitForExit();
            MessageBox.Show("Finish");
        }
    }
    catch
    {
        // Log error.
    }
}

但是相同的代码在安装过程中不起作用。

这行不通!一个 MSI 设置无法启动另一个 MSI 设置。当它说 "another install is in progress" 时,它指的是您已经 运行。这与管理员权限无关——无论开发人员怎么说,您都无法通过安装程序自定义操作安装另一个 MSI。

通常这就是引导程序的作用,在安装主 MSI 之前安装先决条件。这就是为什么即使 VS 安装程序也允许您在安装 MSI 之前生成 setup.exe 来安装先决条件(其中许多是基于 MSI 的)。

因此您需要找到一个引导程序(不知道 InstallShield LE 是否有)来安装该 MSI。曾经有一个名为 Bootstrap Manifest Generator 的工具,您可以使用它来定制 setup.exe 以安装像您一样的自定义先决条件。或者您可以使用 WiX 的引导程序安装该 MSI,然后安装您的 MSI。或者您可以将该 MSI 复制到系统,并让您的应用程序在第一次使用时安装它。

或者该代理软件可能作为合并模块提供,在这种情况下,您只需将合并模块添加到您的 MSI 构建中。