回滚时如何重新启动依赖的Windows服务?

问题描述 投票:0回答:1

我有一个 WiX 4 捆绑包,它安装了多个 MSI(也是使用 WiX 4 编写的),我们将它们命名为 MsiA、MsiB 和 MsiC。所有组件都在我的控制之下。所有 MSI 中的更新均被编写为

MajorUpgrade
Schedule="afterInstallInitialize"

  1. MsiA 安装 Windows 服务 (MsiAService)。
  2. MsiB 还安装了一个依赖于 MsiAService 的 Windows 服务 (MsiBService)。
  3. MsiC 不包含服务。

这个顺序也反映在我的包的

Chain
元素中。所有服务均使用
ServiceInstall
ServiceDependency
ServiceControl
元素进行配置。

MsiA 的创作:

                   <ServiceInstall Id="S.MsiA.Service"
                                      Name="MsiAService"
                                      DisplayName="MSI A service"
                                      Description="MSI A service"
                                      Type="ownProcess"
                                      Start="auto"
                                      Account="LocalSystem"
                                      ErrorControl="normal"                                      
                                      Vital="yes">
                  </ServiceInstall>
                  <ServiceControl Id="S.MsiA.Service"
                                  Start="install"
                                  Stop="both"
                                  Remove="both"
                                  Name="MsiAService"
                                  Wait="yes" />
                  <util:ServiceConfig ServiceName="MsiAService"
                                      FirstFailureActionType="none"
                                      SecondFailureActionType="none"
                                      ThirdFailureActionType="none" />

MsiB 的创作(具有服务依赖性):

               <ServiceInstall Id="S.MsiB.Service" Name="MsiBService"
                                DisplayName="MSI B Service"
                                Description="MSI B Service"
                                Type="ownProcess" Start="auto" Account="LocalSystem"
                                ErrorControl="normal" Vital="yes">                    
                    <ServiceDependency Id="MsiAService"/>
                </ServiceInstall>               
                <ServiceControl Id="S.MsiB.Service"
                                Start="install"
                                Stop="both"
                                Remove="both"
                                Name="MsiBService"
                                Wait="yes" />               
                <util:ServiceConfig ServiceName="MsiBService"
                                    FirstFailureActionType="none"
                                    SecondFailureActionType="none"
                                    ThirdFailureActionType="none" />

现在,如果我升级捆绑包,并且 MsiB 失败,则会发生回滚,这是所期望的。
但在这个过程中,会发生以下情况:

  1. MsiB 回滚并启动它的 MsiBService。
  2. 启动先前版本的捆绑包并重新安装 MsiA:它会停止其 MsiAService,并且由于 MsiBService 依赖于它,因此它也会被关闭。
    回滚后,它启动其 MsiAService。
  3. -> 问题: 依赖服务 MsiBService 保持停止状态。

我查找了 WiX 4 文档中的服务控制元素,但找不到此问题的解决方案。
另外在Google结果中我找不到解决方案。

我考虑过使用

CustomAction
来重新启动服务(通过“net start”),但我不知道如何制定此用例的条件以及我应该将其添加到哪个 MSI。

有人偶然发现这个问题吗?你是如何解决的?
或者WiX 4中有内置的解决方案吗?

wix wix4
1个回答
0
投票

您可以为您未安装的服务添加一个服务控制元素,如果找到,MSI 也会处理该问题。因此,如果您在安装程序 A 中为服务 B 编写 ServiceControl,它应该会为您提供您正在寻找的内容。

© www.soinside.com 2019 - 2024. All rights reserved.