在 WIX 升级期间重新启动 Windows 服务

Posted

技术标签:

【中文标题】在 WIX 升级期间重新启动 Windows 服务【英文标题】:Restarting windows service during WIX upgrade 【发布时间】:2018-06-09 03:48:15 【问题描述】:

我们在我们的 msi WIX 安装程序中安装了一个 Windows 服务。在升级过程中,我们只是尝试重新启动服务,而不是完全重新安装,以保护服务用户的信誉。

在这方面讨论了很多帖子,但没有任何结论。

尝试通过以下操作在升级期间禁用 DeleteServices,

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

注意:以上代码也在旧的 MSI 中

但仍然看到服务被实际删除并重新安装。尝试在升级过程中禁用安装服务,如下所示

<InstallServices>NOT WIX_UPGRADE_DETECTED</InstallServices>

但服务处于停止状态,安装程序无法运行,ExecServiceConfig 代码为 1603,因为服务未处于运行状态。

对此的任何指示都会有所帮助

【问题讨论】:

请发布完整的详细日志,以及显示您的 util serviceconfig 序列(在组件下?)的 WiX 和 ServiceControl。该服务不需要运行即可进行配置(正如您的帖子所建议的那样),但必须安装它,所以我怀疑正在发生其他事情。例如,如果您尝试覆盖可执行文件但不停止服务,则旧安装的服务可能会被标记为禁用且不可配置。作为健全性检查,我还将验证是否成功检测到升级,否则将不会设置 UPGRADINGPRODUCTCODE 和 WIX_UPGRADE_DETECTED。 【参考方案1】:

不久前我写了一个类似(我认为)的答案:Wix: Windows Service sometimes uninstalled when upgrading。请阅读该链接以获得几个不同的建议。

次要升级:除了链接答案中的选项外,您还可以使用次要升级 - 如果这是一个可行的选择。在次要升级中,产品不会被卸载然后重新安装,而是“就地”升级。要使较小的升级正常工作,您需要严格遵守组件规则 - 这可能很难做到,但您绝对可以升级而不会失去您的服务信誉。 See bottom here for how a minor upgrade is applied。我只会链接到an answer with a little bit of info on late REP。

永久组件:正如上面链接的答案所述,您可以将具有服务配置设置的组件设置为永久。在这种情况下,它永远不会在升级期间被卸载,但也不会在真正的卸载期间被卸载。因此,您必须在“真正的”卸载时手动清除服务安装和文件安装(与设置UPGRADINGPRODUCTCODE 的主要升级启动卸载相反)。一种我不太喜欢的简单方法。

(托管)服务帐户:不是我用过的东西,而是上面描述的较新的concept of managed service accounts,可以调查链接的答案吗? Step-by-step.

延迟 REP/服务 MSI:正确延迟安排 RemoveExistingProducts 意味着在升级方案期间不应卸载您的服务(有关详细信息,请参阅链接答案)。严格遵守所有组件规则可能很困难,但您可以通过将您的服务放在自己的最小服务安装 MSI 中,然后通过 WiX Burn 包安装(按顺序安装 MSI 文件)来缓解这一点。


如多次所述,请务必阅读此类似答案:Wix: Windows Service sometimes uninstalled when upgrading。

【讨论】:

以上是关于在 WIX 升级期间重新启动 Windows 服务的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Wix 主要升级期间防止数据库丢失

卸载时未删除Windows服务(WIX 3)

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

如何使用 WiX 安装和启动 Windows 服务

自动化 wix 小更新和小升级

Wix - 在安装/升级期间,自定义操作的条件在不应该的情况下解析为False