installation - Wix 安装程序问题 : Why does RestartManager mark Service as RMCritical and not RMService

标签 installation wix windows-installer

我试图阻止我们的 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/

相关文章:

build - 在 Cygwin 上编译 node.js

windows-installer - 在 Windows 上安装 Tensorflow 错误

wix - msiexec : Default to "do not close application" in silent mode

installation - 运行 RemovePreviousVersion 时,MSI 不会安装所有文件

installation - 高级安装程序的可靠性如何?

windows-7 - Wix - 不要在安装时删除固定任务栏

c# - 通过 XPath 在任意深度选择 XML 节点

c# - 将 IsWix 模板添加到 Visual Studio 2015

c# - Windows 安装程序禁止某些安装位置

.net - 为客户提供 .NET 的替代方案