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

本文关键字:自定义 操作 Msiexec 启动 安装 过程中 | 更新日期: 2023-09-27 17:50:55

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

我搜索了网页和这里,但我发现只有旧的帖子提到旧的visual studio版本。

据我所知,在VS 2013社区版中,我有一个有限的Installshield插件,我也能够下载Visual Studio Installer插件。创建一个简单的设置是相对容易的,但我需要静默安装一个小软件在我的设置。该软件是Double Agent (Microsoft Agent的更新版本),开发人员建议以这种方式启动设置:

简单地运行:

msiexec /i DoubleAgent_x86.msi /qb-!

在你的设置(我认为最好的地方应该是提交事件)。

顺便说一下,用一个动作启动。msi安装程序是不可能的,我真的不明白创建一个自定义动作的最佳实践。

我读过一些关于创建类的文章,但大多数文章都提到了Visual Studio 2008或Wix插件。我正在寻找一种方法来使用Msiexec与Visual Studio Installer或installshield。

编辑:我找到了这个解决方案,它工作得很好:https://msdn.microsoft.com/it-it/library/vstudio/d9k65z2d%28v=vs.100%29.aspx

这是意大利语,但很容易通过右上方的单选按钮翻译成原始语言(英语)。它可以完美地与Visual Studio Setup插件和VS Community edition 2013一起工作。

我现在没有代码可以发布,因为我只构建了他们的示例,但我会尽快发布它,使用msiexec进行隐藏安装。

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

        [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安装程序创建了这个设置。在主安装程序结束时,开始显示有另一个安装程序,但双重代理程序没有安装。

再次编辑:我没有Admin权限静默执行msiexec。我想是因为双重间谍的设置需要管理员权限。我不想使用manifest来提升特权,那么我认为唯一的解决方案是显示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.
    }
}

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

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

这行不通!一个MSI安装程序不能启动另一个MSI安装程序。当它说"另一个安装正在进行中"时,它指的是已经在运行的安装。这与管理员权限无关——无论开发人员说什么,您都不能通过安装程序自定义操作安装另一个MSI。

一般来说,这就是引导程序的作用,在安装主MSI之前安装先决条件。这就是为什么即使是VS设置也让你在安装MSI之前生成一个setup.exe来安装先决条件(其中许多是基于MSI的)。

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

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