在安装过程中启动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.
}
}
但是相同的代码在安装过程中不起作用
这行不通!一个MSI安装程序不能启动另一个MSI安装程序。当它说"另一个安装正在进行中"时,它指的是已经在运行的安装。这与管理员权限无关——无论开发人员说什么,您都不能通过安装程序自定义操作安装另一个MSI。
一般来说,这就是引导程序的作用,在安装主MSI之前安装先决条件。这就是为什么即使是VS设置也让你在安装MSI之前生成一个setup.exe来安装先决条件(其中许多是基于MSI的)。
所以你需要找出一个引导程序(不知道InstallShield LE是否有一个)来安装MSI。曾经有一个叫做Bootstrap Manifest Generator的工具,您可以使用它来定制setup.exe来安装像您这样的自定义先决条件。或者您可以使用WiX的引导程序来安装该MSI,然后安装您的MSI。或者你可以将MSI复制到系统中,让你的应用程序在第一次使用它时安装它。
或者代理软件作为合并模块可用,在这种情况下,您只需将合并模块添加到MSI构建中。