根据是否禁用 windows 服务安装 MSI

Install a MSI based on whether a windows service is disabled or not

我有一个 Bundle 设置,它安装了大约 4 个 msis 的组合,比如 MSI_1 -> MSI_2 -> MSI_3 -> MSI_4。

我希望仅在未禁用特定 windows 服务时才安装 MSI_4,即如果 windows 服务(例如 ABC)被禁用,则不要安装。我或许可以使用 CustomAction 和 运行 命令

"Get-WMIObject win32_service -filter "name='ABC'" -computer "." | select -expand state" 

检查状态。但是我如何使用它(我可以使用它吗?)来确定是否执行安装程序。请注意,所有 4 个 MSI 都有自己的项目,并且它们合并在一个 VS 解决方案的保护伞下。我不必走 CustomAction 路线,所以如果您还有其他想法,我也愿意尝试。

提前感谢您抽出宝贵时间提供帮助。如果有什么不清楚的地方,请告诉我。

我会在这里回答我自己的问题,因为我找到了解决方案。我不知道的是,服务列表在注册表设置中也可用,并且可以在我们正在处理 Chain 元素的 wxs 中使用 Util:RegistrySearch 元素。可以修改服务的状态,从 运行 Disabled 观察值的变化,并可以相应地设置 InstallCondition。

<util:RegistrySearch Root="HKLM"
                     Key="System\CurrentControlSet\Services\ABC"
                     Win64="yes"
                     Value="Start"
                     Variable="State" />

Chain 元素将如下所示:

<MsiPackage Id="package"
              Cache="no" Vital="yes"
              DisplayInternalUI="no"
              ForcePerMachine="yes"
              SourceFile="package.msi"
              InstallCondition="(State = <condition>)" />

希望对您有所帮助。