用于停止和启动 运行 windows 服务的 Wix 自定义操作 - 问题是在哪里调用它们?

Wix Custom Actions to stop and start running windows services - issue where to call them?

我们的安装程序当前 "installs" 一个 windows 服务 exe,即它只是将文件复制到用户 PC 上,但不会启动它。

然后当我们的应用程序是 运行 时,它会 "install" 使用 InstallUtil 服务多次,并且服务的每个实例都会有不同的服务名称。

所以当我们升级我们的应用程序时,我们不知道这些服务中有多少 运行ning 以及它们叫什么 - 但我们知道它们的服务名称将以 [=44 开头=].

因此,我创建了两个 VB.NET 自定义操作 - 一个名为 "stopServices",一个名为 "startServices"。第一个将扫描用户的 PC 以查找以 "ABCService_" 开头的任何 windows 服务,并将其名称存储在临时文件夹中的 XML 文件中,同时还有一个属性表明该服务是否 运行宁与否。然后它将停止每个 运行ning 服务。

然后将继续正常安装 - windows 服务 exe 将升级等

第二个自定义操作将执行相反的操作 - 它将读取 xml 文件并启动任何最初 运行ning.

的服务

现在理论上(在我看来)这应该可行 - 但我遇到的问题是将这些自定义操作放在 wix msi 代码中的什么位置。我目前得到的是:

    <InstallExecuteSequence>
      <Custom Action="CA_StopWindowsServices"
              After="InstallInitialize" />

      <Custom Action="CA_StartWindowsServices"
              Before="InstallServices">
        <![CDATA[NOT Installed]]>  
      </Custom>
    </InstallExecuteSequence>

因为自定义操作会改变 PC 的状态,所以它们必须放在 InstallExecuteSequence 中,Visual Studio 告诉我停止操作必须在 InstallInitialize 之后,我认为在 InstallServices 之前启动一个可能是个好地方!?

但是 - 这是我的问题 - 当我 运行 msi; Windows 抱怨需要升级的文件之一(即 windows 服务 exe)正在被多少服务实例使用 运行ning - 我知道会成为一个问题,因此我编写自定义操作的原因;但我似乎无法在 windows 抱怨他们正在使用之前打电话给阻止他们的人?!

只是认为了解我如何定义自定义操作可能是相关的:

    <CustomAction
        Id="CA_StopWindowsServices"
        BinaryKey="CustomActionDLL"
        DllEntry="CustomActionStopServices"
        Execute="deferred"
        Return="check" />

    <CustomAction
        Id="CA_StartWindowsServices"
        BinaryKey="CustomActionDLL"
        DllEntry="CustomActionStartServices"
        Execute="commit"
        Return="check" />

现在说所有这些 - 我只是 运行 我的 msi & 当 windows 抱怨 2 个服务实例正在使用需要替换的文件时 - 我选择了第一个选项,这是为了windows 关闭它们并在最后启动它们 - 这基本上是我想要做的:) 所以另一个问题是 - 我是否可以告诉 windows 自动执行此操作- 没有询问用户?如果有帮助,msi 实际上是 运行 来自 burn bootsrapper。

非常感谢。

干杯,

大克里斯

Windows 安装程序检查在 InstallExecute 序列之前发生的 InstallValidate 期间是否正在使用将被替换的文件。

问题是如果您在 InstallValidate 之前(通常)安排自定义操作,则需要提升才能停止您没有的服务。

但是,在引导程序中,您可以安排任务在 InstallValidate 之前停止服务,因为 MSI 始终从您单击安装时启动的提升的引导程序进程运行。

我没有检查过,但是在 MSI 中为服务添加 <ServiceControl> 可能会在 "StopServices" 标准操作期间自动停止服务,并且还会避免 InstallValidate 中的 FilesInUse 对话框。我还没有抽出时间来测试这个,因为我已经有了一个可以使用引导程序的解决方案。

因此请尝试您的自定义操作解决方案,但安排您的自定义操作在 InstallValidate 之前停止服务。