WIX启用Windows功能

WIX启用Windows功能,wix,wix3.7,wix-extension,dism,Wix,Wix3.7,Wix Extension,Dism,在安装软件之前,我必须检查是否启用了某些windows功能 我可以使用dism命令行工具检查或安装它 我创建了一个自定义操作来实现这一点,但是有没有一种方法可以用“WIX原生方式”来实现呢 未安装 问题是命令会启动命令提示符,这对最终用户来说非常难看。 我怎样才能让它变得更好?我不知道我是否需要一个引导程序来完成这项工作(比如安装.NET Framework) 管理这些事情有什么扩展吗 我现在正在使用WIX 3.7。我这样做的方式是创建一个DTF自定义操作来调用dism.exe进程。您将得到

在安装软件之前,我必须检查是否启用了某些windows功能

我可以使用dism命令行工具检查或安装它

我创建了一个自定义操作来实现这一点,但是有没有一种方法可以用“WIX原生方式”来实现呢


未安装
问题是命令会启动命令提示符,这对最终用户来说非常难看。 我怎样才能让它变得更好?我不知道我是否需要一个引导程序来完成这项工作(比如安装.NET Framework)

管理这些事情有什么扩展吗


我现在正在使用WIX 3.7。

我这样做的方式是创建一个DTF自定义操作来调用dism.exe进程。您将得到相同的结果,并且不会启动任何命令提示

[自定义操作]
公共静态ActionResult运行DISM(会话)
{
Log(“开始RunDism”);
字符串参数=会话[“CustomActionData”];
尝试
{
ProcessStartInfo=newProcessStartInfo();
info.FileName=“dism.exe”;
Log(“调试:尝试运行{0}”,info.FileName);
info.Arguments=参数;
Log(“调试:传递以下参数:{0}”,info.Arguments);
info.UseShellExecute=false;
info.RedirectStandardOutput=true;
info.CreateNoWindow=true;
流程部署流程=新流程();
deployProcess.StartInfo=info;
deployProcess.Start();
StreamReader outputReader=deployProcess.StandardOutput;
deployProcess.WaitForExit();
如果(deployProcess.hasExit)
{
字符串输出=outputReader.ReadToEnd();
会话日志(输出);
}
如果(deployProcess.ExitCode!=0)
{
Log(“错误:退出代码为{0}”,deployProcess.ExitCode);
返回操作结果。失败;
}
}
捕获(例外情况除外)
{
Log(“错误:尝试启动进程时出错。”);
session.Log(例如ToString());
返回操作结果。失败;
}
返回操作结果。成功;
}

DISM参数是通过自定义动作数据设置的。

< P>您可以考虑< /P> < P> David Gardiner的回答暗示了我的正确解决方案。不需要创建自己的自定义操作。以下是64位Windows安装的操作方法:

首先确定是否安装了MSMQ:

<Property Id="MSMQINSTALLED">
  <RegistrySearch Id="MSMQVersion" Root="HKLM" Key="SOFTWARE\Microsoft\MSMQ\Parameters" Type="raw" Name="CurrentBuild" />
</Property>

声明您的自定义操作。你需要两个。一个用于将属性设置为dism路径,另一个用于执行该属性:

<CustomAction Id="InstallMsmq_Set" Property="InstallMsmq" Value="&quot;[System64Folder]dism.exe&quot; /online /enable-feature /featurename:msmq-server /all" Execute="immediate"/>
<CustomAction Id="InstallMsmq" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check"/>

最后,在安装顺序中指定自定义操作:

<InstallExecuteSequence>
  <Custom Action="InstallMsmq_Set" After="CostFinalize"/>
  <Custom Action="InstallMsmq" After="InstallInitialize">NOT REMOVE AND NOT MSMQINSTALLED</Custom> 
</InstallExecuteSequence>

不拆卸也不安装
因为这可能需要一点时间,所以我添加了以下内容来更新安装程序状态文本:

<UI> 
  <ProgressText Action="InstallMsmq">Installing MSMQ</ProgressText> 
</UI> 

安装MSMQ

如果要在安装失败时删除MSMQ,还可以指定回滚操作

看看安静执行自定义操作:@Yansklayarenko刚刚注意到你在发布了一个带有相同链接的答案后的评论!对于那些希望安装不同windows功能的人,我发现上面的内容很有帮助,这个问题也很有用:
<UI> 
  <ProgressText Action="InstallMsmq">Installing MSMQ</ProgressText> 
</UI>