当服务启动失败时,如何使WiX安装程序失败?

当服务启动失败时,如何使WiX安装程序失败?,wix,windows-services,windows-installer,wix3.10,Wix,Windows Services,Windows Installer,Wix3.10,我的wxs文件中的代码段: <ServiceInstall Id="ServiceInstall" Type="ownProcess" Vital="yes" Name="service name" DisplayName="service display name" Description="service description" Start="auto" Account="[SERVICEUSERNAME]" Password="[SERVICEPAS

我的wxs文件中的代码段:

<ServiceInstall Id="ServiceInstall" Type="ownProcess" Vital="yes"
    Name="service name"
    DisplayName="service display name"
    Description="service description"
    Start="auto" Account="[SERVICEUSERNAME]" Password="[SERVICEPASSWORD]"
    ErrorControl="normal" Interactive="no" />

<ServiceControl Id="StartService"
    Start="install" Stop="uninstall" Remove="uninstall"
    Name="service name" Wait="yes">
    <ServiceArgument>arguments for first run</ServiceArgument>
</ServiceControl>

第一次运行的参数

如果服务无法启动,安装程序会等待几分钟,然后才会失败,而它应该能够检测到它处于停止状态,并且从那时起,如果没有手动干预,就永远无法达到启动状态。然而,它一直在等待。有没有办法解决这个问题?

服务控制是一种基于消息的方案。Windows Installer和服务控制机制等待服务从开始消息响应。不清楚“检测其处于停止状态”是什么意思,因为代码可能正在执行合法工作,可能已崩溃但具有恢复代码,或者可能已配置为在故障后重新启动(请参阅ChangeServiceConfig2 Win32 API)

在您的情况下,wait=yes显式地导致安装程序等待服务完全初始化。正如MSDN文档所说:

“将此字段保留为空或输入值1将导致安装程序在继续之前最多等待30秒以完成服务。此等待可用于为关键事件返回故障错误留出额外时间。此字段中的值为0表示仅等待服务控制管理器(SCM)完成。”报告此服务处于挂起状态,然后继续安装。“


因此,更改等待值可能会有所帮助。在任何情况下,代码良好的服务正常启动时的正常情况都不会导致任何这些问题。服务被破坏的事实不仅是一种罕见的情况(或者应该如此),而且当事物被破坏时,它们实际上是被破坏的,并且常常因此而不可预测

服务控制是一种基于消息的方案。Windows Installer和服务控制机制等待服务从开始消息响应。不清楚“检测其处于停止状态”是什么意思,因为代码可能正在执行合法工作,可能已崩溃但具有恢复代码,或者可能已配置为在故障后重新启动(请参阅ChangeServiceConfig2 Win32 API)

在您的情况下,wait=yes显式地导致安装程序等待服务完全初始化。正如MSDN文档所说:

“将此字段保留为空或输入值1将导致安装程序在继续之前最多等待30秒以完成服务。此等待可用于为关键事件返回故障错误留出额外时间。此字段中的值为0表示仅等待服务控制管理器(SCM)完成。”报告此服务处于挂起状态,然后继续安装。“


因此,更改等待值可能会有所帮助。在任何情况下,代码良好的服务正常启动时的正常情况都不会导致任何这些问题。服务被破坏的事实不仅是一种罕见的情况(或者应该如此),而且当事物被破坏时,它们实际上是被破坏的,并且常常因此而不可预测

据我所知,服务可以处于7种状态之一:开始、继续、暂停、暂停、运行、开始、停止、停止。如果服务到达StartPending,然后移动到Stopped,则服务无法启动,我希望安装在该点失败,而不是继续等待。服务未配置为在发生故障后重新启动(虽然可能应该是…),而且-WiX不允许值为1,它会给出错误“错误CNDL0015:ServiceControl/@Wait属性的值“1”不是合法的是/否值。唯一合法的值是“否”和“是”。”我假设ServiceControl安装程序表中的“是”转换为1,“否”转换为0。正如我所说,我指的是源MSDN文档,而不是用于指定等待值的WiX语法。您描述的服务状态不是自动检测到的,它们是由QueryServiceStatus等API报告的,因此必须对服务进行编码以返回这些值,并且显然是活动的以返回这些值。按照我的理解,服务可以处于7种状态之一:开始、继续、暂停、暂停、运行、开始、停止、停止。如果服务到达StartPending,然后移动到Stopped,则服务无法启动,我希望安装在该点失败,而不是继续等待。服务未配置为在发生故障后重新启动(虽然可能应该是…),而且-WiX不允许值为1,它会给出错误“错误CNDL0015:ServiceControl/@Wait属性的值“1”不是合法的是/否值。唯一合法的值是“否”和“是”。”我假设ServiceControl安装程序表中的“是”转换为1,“否”转换为0。正如我所说,我指的是源MSDN文档,而不是用于指定等待值的WiX语法。您描述的服务状态不是自动检测到的,它们是由QueryServiceStatus等API报告的,因此必须对服务进行编码以返回这些值,并且显然是活动的以返回这些值。否则将应用超时规则。