【问题标题】:Prevent service removal/install during WiX major upgrade - service not stopping在 WiX 主要升级期间防止服务删除/安装 - 服务未停止
【发布时间】:2014-03-01 16:39:33
【问题描述】:

我有一个我想象的常见场景,但无法让事情完全正常运行。

场景很简单,我想对产品进行重大升级,无需更改服务设置,也无需重启。

  • 在正常安装时,服务应该安装并启动
  • 在卸载时,服务应该停止并被删除
  • 升级时应停止(而不是删除)服务,写入新文件,然后重新启动服务

我主要通过在 DeleteServices 上使用条件 NOT UPGRADINGPRODUCTCODE 来实现这一点。但是,升级期间服务并未停止,因此需要重新启动。

在升级过程中是否有某种方法可以停止服务、安装新文件并重新启动服务而不删除/安装服务?

【问题讨论】:

  • 首先要查看服务停止需要多长时间。如果它没有及时停止,您需要先查看它。
  • 服务及时停止不是问题 - 当我在 DeleteServices 上使用指定条件时,在升级继续之前没有尝试停止服务。
  • 嗨@snae,您在此期间找到解决方案了吗?
  • @PetervanKekem,不怕。我不再在这个产品上工作,所以不确定它是否像以前一样成功。我现在确实在另一个产品上工作,该产品也有需要升级的服务,但在这种情况下,我们不关心它在重新安装之前被删除。抱歉,我无法提供更多帮助。
  • 好的,谢谢!我有以下(临时)解决方案:升级时,安装程​​序将请求停止服务的权限。不是最好的解决方案,但至少服务没有被卸载。

标签: wix


【解决方案1】:

您是否为 Windows 安装程序启用了 等待标志 以等待服务正确停止? http://msdn.microsoft.com/en-us/library/aa371634(v=vs.85).aspx 。即使启用了此标志,您的服务也必须在 30 秒内停止,否则主要升级继续进行。有一些方法可以实现您自己的延迟以提供更多时间,但如果没有必要,请不要这样做。本质上,这可能只是一个自定义操作,其中包含一些实现属性表中自定义属性中指定的延迟的代码。

请注意,DeleteServices 上的 NOT UPGRADINGPRODUCTCODE 可能看起来没有副作用,但可能发生的情况是重大升级不会删除计划在升级过程中卸载的服务。换句话说,您删除了一项服务,也许添加了一项新服务,而旧的服务将无法正确卸载。像这样乱用标准的 Windows Installer 操作并不是最佳做法,而且几乎肯定会产生意外的副作用。在与 Windows Installer 作斗争时,您会将自己画到一个角落以等待以后的更新。

如果我是你,我宁愿将服务安装拆分到一个单独的 MSI 中,以防它处于不应该受主安装影响的状态。然后将 MSI 文件与引导程序链接在一起。如果您将来需要添加新服务或删除旧服务,这将非常灵活。而且它完全是普通的,不会与 Windows Installer 设计抗争。这是从企业的角度考虑的问题,即当每个服务的发布时间表可能非常不同时,能够可靠地控制每个服务。如果您将安装程序作为第三方产品交付给某人,这可能不是您所希望的。

【讨论】:

  • 服务在 30 秒内停止,它被明确设计为使用服务控制命令正常运行。问题是在我最初描述的场景中没有调用 StopServices。它确实在卸载时停止,所以这不是问题。
【解决方案2】:

这应该可以正常工作(暂时将删除放在一边),但在不知道您在哪里有用于升级的 RemoveExistingProducts 操作的情况下,不清楚发生了什么,特别是如果您正在添加条件并且您的 StopService 不适用于某些人原因。但是,DeleteServices 有什么问题?如果服务无论如何都没有运行,那么对系统的瞬时影响是最小的。您是否尝试保留有关稍后添加的服务的某些内容,例如帐户?如果那是您正在做的事情,则存在问题,因为修复可能会失败。

无论如何,如果您的 REP 位于最后,那么适用于您的服务的简化事件序列类似于:

传入安装停止旧服务,删除服务,安装任何更新的文件,再次安装服务并启动新服务。

REP 之后停止服务,不删除它,因为它是 ref 计数,然后启动它。 但是有一个瞬时删除,所以问题是为什么停止不起作用,问题是删除有什么不好?

【讨论】:

  • 有几个人问过同样的问题。我想问题主要是丢失的凭据和糟糕的引用计数和 REP,就像你指出的那样。我绝对不会搞乱调节标准动作。
  • DeleteServices 的问题在于 Glytzhkof 假设通过升级保留服务设置。如果服务帐户已更改,则升级不会对此产生影响。在 InstallValidate 之后进行 REP。在升级方案中这是否为时过早?请注意,如果我不关心保留服务设置,安装程序“工作正常” - 但这在我的场景中很重要。
  • 试试我建议的方法:修改服务凭证后对产品进行维修。此修复很可能会失败,因为 Windows 无法重新安装该服务,如果成功,您可能会发现它丢失了用户提供的凭据。换句话说,这整个区域都很混乱,最可靠的选择可能就是告诉用户在升级到新产品后重新输入凭据。这也不是每天都会发生的事,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 2017-01-23
  • 2016-08-25
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
相关资源
最近更新 更多