【问题标题】:Wix Major Upgrade: how do I prevent Windows service reinstallation?Wix 主要升级:如何防止重新安装 Windows 服务?
【发布时间】:2015-03-31 19:18:58
【问题描述】:

我正在开发一个应该安装多个 Windows 服务的安装程序。我们经常进行新的构建(使用新的 .msi 文件),并且我们使用重大升级来使其更易于安装,而不是以前的安装。

问题是我们需要更新服务文件而不覆盖服务配置(例如帐户用户名和密码)。

我们在保存服务exe 文件的组件内使用ServiceInstallServiceControl。有没有办法让ServiceInstall 有条件的执行(使用REMOVE="ALL" AND NOT UPGRADINGPRODUCTCODE 之类的条件),这样升级时服务不会被卸载(只是停止以便我们可以升级文件)?

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

谢谢!

【问题讨论】:

    标签: wix windows-installer


    【解决方案1】:

    看来我找错地方了。我的问题的解决方案是将NOT UPGRADINGPRODUCTCODE 添加到DeleteServices 标准操作中。

    这解决了我的问题。这种方法的警告是当前msi 文件安装的所有服务都被删除(或不删除)。所以我不能在升级时有选择地删除/保留服务。不过,这对我来说很好 - 我在升级期间保留服务登录信息(但不是实际服务代码)的要求得到了满足。

    更新:DeleteServices 的条件可从 WiX 中的 InstallExecuteSequence 元素访问。

    【讨论】:

    • 我不敢相信我没有想到这一点。非常感谢分享这个!
    • Miron,你能举个例子吗?我正在尝试在升级之间保存服务帐户。
    • @MuriloLima 抱歉,这是几年前的事了。这个问题来自前世 :) 我无法再访问该源代码树了。
    【解决方案2】:

    我为同一个 exe 创建了 2 个组件,每个组件都有一个条件。一种用于 WIX_UPGRADE_DETECTED,另一种用于 NOT WIX_UPGRADE_DETECTED。在 WIX_UPGRADE_DETECTED 中,我将不包含 serviceinstall 元素,而在 NOT WIX_UPGRADE_DETECTED 中,将包含 serviceinstall 元素。

    【讨论】:

      【解决方案3】:

      这是解决方案的外观:

      <DeleteServices><![CDATA[NOT UPGRADINGPRODUCTCODE]]></DeleteServices>
      

      在 InstallExecuteSequence 标签下添加这个。

      注意:确保最初的第一版 MSI 有这个标签,否则你必须完全卸载和安装,然后这个配置才会在升级时生效。

      注意2:你不必使用CDATA标签它也可以是这样的:

      <DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices>
      

      【讨论】:

      • 提示“旧的和新的 msi 必须有这个块”是一个重要的提示,因为在升级过程中旧的将被卸载,因此这个块在旧的 msi 中评估。
      • 查看这个答案以获得更完整的解决方案:stackoverflow.com/a/57517308/670028
      【解决方案4】:

      WiX 只会更新版本较新的组件。它只检查一个字段(程序集版本的文件版本,我不记得了),因此您可以将当前版本信息保存在一个字段中,并将其保持在另一个字段中。这可能是适合您的 hack...

      【讨论】:

      • 嗯,问题是我需要替换文件,而不是配置。如果我可以控制配置的存储方式,我会在这些文件上使用 NeverOverwrite 和 Permanent。但这里的问题是密码是 LSA 存储的 - 因此需要使 ServiceInstall 有条件。
      【解决方案5】:

      在服务标准操作上使用条件不会超出一项服务。

      解决此问题的方法是在 InstallFinalize 之前安排 RemoveExistingProducts。然后确保您的较新版本具有与要替换的版本相同的服务 EXE。这样,Windows Installer 就不会卸载/重新安装该组件。

      最后将您的配置数据放入另一个组件中,该组件将被安装并对您的服务进行编码,以注意数据的配置已更改,并在需要时重新加载。

      我个人不这样做。我一直停止、重新安装、启动服务,没有可怕的后果,只是安装时间要长几秒钟。

      【讨论】:

      • 我同意,每次重大升级都重新安装服务是可行的方法,但如果您必须保留用户在第一次安装时提供的凭据,则不能这样做。
      猜你喜欢
      • 1970-01-01
      • 2014-06-14
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      • 1970-01-01
      • 2013-04-30
      相关资源
      最近更新 更多