Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Installation Wix安装程序问题:为什么RestartManager将服务标记为RMCritical而不是RMService_Installation_Wix_Windows Installer - Fatal编程技术网

Installation Wix安装程序问题:为什么RestartManager将服务标记为RMCritical而不是RMService

Installation Wix安装程序问题:为什么RestartManager将服务标记为RMCritical而不是RMService,installation,wix,windows-installer,Installation,Wix,Windows Installer,我试图阻止我们的wix安装程序在卸载时提示用户重新启动。我们的服务设置为在卸载时卸载和删除。不幸的是,对于我们来说,RestartManager正在提示用户在InstallValidate操作期间需要重新启动。此操作发生在StopServices和DeleteServices操作之前 查看日志,RestartManager似乎认为我们的服务是一个关键流程: 检测到id为1234、友好名称为“abc”、服务短名称为“xyz”、类型为RmCritical且状态为1的应用程序包含正在使用的文件 这些服

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

查看日志,RestartManager似乎认为我们的服务是一个关键流程:

检测到id为1234、友好名称为“abc”、服务短名称为“xyz”、类型为RmCritical且状态为1的应用程序包含正在使用的文件

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

非常感谢您的帮助

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


用户确实有权关闭服务,而服务与msiexec无关,因此我只能假设我们的服务被认为是一个关键流程。。。。但是为什么呢?

您可以通过设置MSI属性MSIRestrManagerControl来抑制窗口的RestartManager= “禁用”(请参阅此处的文档-)。这种方法本身的唯一问题是,用户将看到“正在使用的文件”对话框(并被要求关闭可能正在使用这些文件/服务的任何应用程序),而不是用需要重新启动的对话框提示用户。此对话框在InstallExecute序列的InstallValidate标准操作期间显示

如果您想偷偷绕过这些对话框中的任何一个,可以在InstallValidate之前安排一个自定义操作,在RestartManager有机会检查系统之前手动关闭任何正在运行的服务。这不符合标准MSI实践,因为通常您会将修改系统的自定义操作标记为“延迟”操作,但MSI不允许在InstallValidate之前运行任何延迟操作。因此,您必须将操作标记为“立即”,但在代码中,您将继续并通过关闭服务来修改系统。这里的缺点是没有立即回滚操作,因此,如果卸载/升级失败并执行回滚,则停止的服务将保持在停止状态。好处是用户在卸载/升级过程中不必看到任何附加对话框。

也遇到了这种情况

问题在于,重新启动管理器认为用户没有停止服务的权限,即使它有权限,因为在检查(InstallValidate)时,安装尚未提升

我的解决方案是授予用户组启动和停止服务的权限。我使用
sc sdset
命令更改服务权限


或者,您可以使用引导程序在提升后启动MSI。

对于在当前操作中标记为停止的服务,重新启动管理器通常不会提示在使用情况下输入任何文件。换句话说,它通过ServiceControl表查看服务是否仍将停止,并且不会自动提示正在使用的文件

不幸的是,这个行为曾经被一个bug破坏——只检查了ServiceControl表中的第一个条目。我不知道这个bug是否有文档记录,所以我不能引用任何东西。最初的问题是在2011年发布的,所以我认为这个问题已经得到了纠正。现在出现的唯一此类问题往往是服务在某种意义上是多进程的,或者是被屏蔽的(一些java服务是这样的),或者当服务确实不再是服务但包含的进程没有及时完成时,或者ServiceControl没有执行完全等待,实际上它仍在运行