在wix中进行重大升级时如何只停止而不卸载Windows服务?

Posted

技术标签:

【中文标题】在wix中进行重大升级时如何只停止而不卸载Windows服务?【英文标题】:How to only stop and not uninstall windows services when major upgrade in wix? 【发布时间】:2013-04-12 07:29:56 【问题描述】:

我正在开发一个应该在 wix v3.8 中安装 Windows 服务的安装程序。问题是我们需要在不卸载服务的情况下进行重大升级才能停止它。

我们在包含服务 exe 文件的组件中使用 ServiceInstall 和 ServiceControl。有没有办法使 ServiceInstall 的执行有条件(使用 REMOVE="ALL" AND NOT UPGRADINGPRODUCTCODE 之类的条件),以便在升级时不卸载服务(只是停止以便我们可以升级文件)?

一种解决方案是使用自定义操作,但也许有更好的方法?

谢谢!

【问题讨论】:

类似线程:***.com/questions/22117138/… 【参考方案1】:

您必须覆盖处理这些元素的操作。如果适用于您的 MSI 软件包中的所有服务(如果您只有一项服务,那么对您来说很好),只要您没问题,以下内容可能会起作用:

<InstallExecuteSequence>
   <DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices>
</InstallExecuteSequence>

您不需要为删除设置条件,因为 DeleteServices 已经考虑了组件的状态。

【讨论】:

如果在主要升级期间删除服务会怎样?也许是添加了一个新的,而删除了旧的?我看不出这将如何删除实际的服务注册 - 但文件可能会被删除?乱用标准动作总是很可怕,但这种部署场景可能应该被设计和考虑 - 似乎很正常。可能是升级安装最预期的升级行为,不重新创建服务注册。 它对我不起作用。它仍在卸载服务并重新安装。 这是推荐的/最好的方法,还是这个问题的最佳选择@Ron Mensching【参考方案2】:

最终为我工作的是

  <DeleteServices><![CDATA[REMOVE ~= "ALL" AND (NOT UPGRADINGPRODUCTCODE)]]> </DeleteServices>
  <InstallServices><![CDATA[NOT Installed]]> </InstallServices>

我通过一系列试错尝试以及结合其他一些具有类似答案的线程得出了这个答案。

only 不起作用的一个可能原因是,WIX 在重新安装时也会删除该服务。我们只想在初始安装期间安装该服务一次。我们还希望确保在卸载时删除该服务。这是唯一对我有用的条件组合,允许服务保留其设置和用户帐户。

【讨论】:

这对我有用!这两个答案也有助于理解为什么会这样:***.com/a/17608049/670028 和 ***.com/a/321874/670028 如果用户在大升级过程中更改了安装路径,服务不会被孤立吗?

以上是关于在wix中进行重大升级时如何只停止而不卸载Windows服务?的主要内容,如果未能解决你的问题,请参考以下文章

如何实现 WiX 安装程序升级?

如何获得 Wix Burn 捆绑包以阻止升级

如何在 Wix 的重大升级中让 PathwaysMDF 和 LDF 覆盖旧副本?

卸载升级时如何摆脱wix中未使用的dll

Wix 重大升级,无论文件版本较新,都替换文件

如何防止 wix 自定义引导程序卸载 UI 在升级过程中显示