我试图阻止我们的wix安装程序在卸载时提示用户重新启动。我们的服务设置为要卸载,并在卸载时删除。对于我们来说不幸的是,RestartManager提示用户在InstallValidate操作期间需要重新启动。此操作在StopServices和DeleteServices操作之前发生。

检查日志,似乎RestartManager认为我们的服务是关键过程:

“检测到ID为1234,友好名称'abc',服务简称'xyz'且类型为RmCritical且状态为1的应用程序正在使用文件。”

这些服务是在本地系统帐户下安装和运行的。我不确定,但是我认为如果RestartManager返回RmService而不是RmCritical,那么它将不会提示重新启动。

任何帮助,不胜感激。

编辑:
MSDN指出,对于RMCritical:
由于无法关闭进程,因此需要重新启动系统才能完成安装。由于以下原因,无法关闭该过程。该过程可能是关键过程。当前用户可能无权关闭该进程。该进程可能属于启动重新启动管理器的主要安装程序。

用户确实有权关闭服务,并且这些服务与msiexec无关,因此我只能假定我们的服务被认为是关键过程。

最佳答案

您可以通过设置MSI属性MSIRESTARTMANAGERCONTROL =来禁止窗口的RestartManager。
“禁用”(请参见此处的文档-http://msdn.microsoft.com/en-us/library/windows/desktop/aa370377(v=vs.85).aspx)。这种方法本身的唯一问题是,他们将看到“正在使用文件”对话框(并被要求关闭可能正在使用这些文件/服务的所有应用程序),而不是提示用户重新启动对话框。在InstallExecute Sequence的InstallValidate标准操作期间显示此对话框。

如果您想在这两个对话框中使用一个偷偷摸摸的方法,可以在InstallValidate之前安排一个自定义操作,该操作在RestartManager有机会检查系统之前手动关闭所有正在运行的服务。这不遵循标准的MSI惯例,因为通常您会将将修改系统的自定义操作标记为“延迟”操作,但是MSI不允许在InstallValidate之前运行任何延迟的操作。因此,您必须将操作标记为“立即”,但是在代码中,您将继续通过关闭服务来修改系统。此处的缺点是没有立即回滚操作之类的东西,因此,如果卸载/升级失败并回滚,则您停止的服务将保持停止状态。好处是,用户在卸载/升级过程中不必再看到任何其他对话框。

08-27 17:33