我正在尝试阻止我们的wix安装程序在卸载时提示用户重新启动。我们的服务设置为在卸载时卸载和删除。对我们来说不幸的是,RestartManager提示用户在InstallValidate操作期间需要重新启动。此操作发生在StopServices和DeleteServices操作之前。
检查日志,似乎RestartManager认为我们的服务是一个关键过程:
“检测到ID为1234的应用程序,友好名称'abc',服务短名称'xyz',类型为RmCritical,状态1保存文件[s]正在使用中。”
服务已在本地系统帐户下安装并运行。我不确定,但我认为如果RestartManager返回RmService而不是RmCritical,那么它就不会提示重启。
任何帮助都非常感激。
修改 MSDN声明对于RMCritical: 需要重新启动系统才能完成安装,因为无法关闭进程。由于以下原因,无法关闭该过程。该过程可能是一个关键过程。当前用户可能没有权限关闭该进程。该进程可能属于启动Restart Manager的主安装程序。
用户确实有权关闭服务,这些服务与msiexec无关,所以我只能假设我们的服务被认为是一个关键过程......但为什么呢?
答案 0 :(得分:4)
您可以通过设置MSI属性MSIRESTARTMANAGERCONTROL =来禁止窗口的RestartManager “禁用”(请参阅此处的文档 - http://msdn.microsoft.com/en-us/library/windows/desktop/aa370377(v=vs.85).aspx)。这种方法本身唯一的问题是,它们不会提示用户使用需要重启的对话框,而是会看到正在使用的文件对话框(并要求关闭可能正在使用这些文件/服务的任何应用程序)。在InstallExecute序列的InstallValidate标准操作期间显示此对话框。
如果你想偷偷摸摸地绕过这些对话框中的任何一个,你可以在InstallValidate之前安排一个自定义操作,它在RestartManager有机会检查系统之前手动关闭所有正在运行的服务。这不遵循标准的MSI实践,因为通常您会标记一个自定义操作,将系统修改为“延迟”操作,但MSI不允许在InstallValidate之前运行任何延迟操作。因此,您必须将操作标记为“立即”,但在代码中您将继续并通过关闭服务来修改系统。这里的缺点是没有立即回滚操作,所以如果卸载/升级失败并且回滚,则停止的服务将保持停止状态。好处是用户在卸载/升级过程中永远不会看到任何其他对话框。
答案 1 :(得分:0)
也参与其中。
问题是重启管理器认为用户没有权限停止服务,即使它确实如此,因为在检查(InstallValidate)时,安装尚未提升。
我的解决方案是授予Users组启动和停止服务的权限。我使用sc sdset
命令来更改服务权限。
或者您可以使用引导程序在提升后启动MSI。
答案 2 :(得分:0)
对于标记为在当前操作中停止的服务,
Restart Manager通常不会提示任何正在使用的文件情况。换句话说,它通过ServiceControl表来查看服务是否将被停止,并且不会自动提示正在使用的文件。
不幸的是,这种行为一度被一个错误所破坏 - 只检查了ServiceControl表中的第一个条目。我不知道这个bug是否有记录,所以我不能引用任何东西。最初的问题是在2011年发布的,所以我认为这个问题已得到纠正。现在出现的这类问题往往是这样的情况:服务在某种意义上是多进程的,或者是夹套的(某些java服务是这样的),或者服务确实不再是服务但是包含的进程没有及时完成,或ServiceControl没有完全等待,它仍然在运行。