我试图阻止我们的 wix 安装程序在卸载时提示用户重新启动。我们的服务设置为在卸载时卸载和删除。不幸的是,RestartManager 提示用户在 InstallValidate 操作期间需要重新启动。此操作发生在 StopServices 和 DeleteServices 操作之前。
查看日志,RestartManager 似乎认为我们的服务是一个关键进程:
“检测到 ID 为 1234、友好名称为 'abc'、服务短名称为 'xyz'、类型为 RmCritical 且状态为 1 的应用程序包含正在使用的文件[s]。”
这些服务在本地系统帐户下安装和运行。我不确定,但我认为如果 RestartManager 返回 RmService 而不是 RmCritical,那么它不会提示重新启动。
非常感谢任何帮助。
编辑:
MSDN 指出,对于 RMCritical:
由于无法关闭进程,因此需要重新启动系统才能完成安装。由于以下原因,该进程无法关闭。该过程可能是一个关键过程。当前用户可能没有关闭进程的权限。该进程可能属于启动 Restart Manager 的主安装程序。
用户确实有关闭服务的权限,而这些服务与 msiexec 没有任何关系,所以我只能假设我们的服务被认为是一个关键进程......但为什么呢?
最佳答案
您可以通过设置 MSI 属性 MSIRESTARTMANAGERCONTROL= 来抑制窗口的 RestartManager
“禁用”(请参阅此处的文档 - http://msdn.microsoft.com/en-us/library/windows/desktop/aa370377(v=vs.85).aspx)。这种方法本身的唯一问题是,他们不会通过需要重新启动的对话框提示用户,而是会看到文件使用中对话框(并被要求关闭可能正在使用这些文件/服务的任何应用程序)。此对话框在 InstallExecute 序列的 InstallValidate 标准操作期间显示。
如果您想偷偷摸摸地绕过这些对话框中的任何一个,您可以在 InstallValidate 之前安排一个自定义操作,在 RestartManager 有机会检查系统之前手动关闭任何正在运行的服务。这不遵循标准的 MSI 实践,因为通常您会将修改系统的自定义操作标记为“延迟”操作,但 MSI 不允许在 InstallValidate 之前运行任何延迟操作。因此,您必须将操作标记为“立即”,但在代码中,您将继续通过关闭服务来修改系统。这里的缺点是没有立即回滚操作这样的事情,所以如果您的卸载/升级失败并回滚,您停止的服务将处于停止状态。好处是用户在卸载/升级期间永远不必看到任何其他对话框。
关于installation - Wix 安装程序问题 : Why does RestartManager mark Service as RMCritical and not RMService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6913332/