WiX MSI无需启动即可安装Windows服务

时间:2015-12-02 15:42:01

标签: wix windows-services windows-installer

我正在尝试为我的Windows服务创建一个WiX MSI安装程序,它将安装该服务,但不能启动它。我无法在任何地方找到解释如何做到这一点或是否有可能。

我尝试删除用于启动服务的ServiceControl,以及在没有运气的情况下切换ServiceInstall上的Start属性。必须有可能做到这一点,对吗?我只是希望MSI文件安装该服务,并让用户在需要时启动它。

<Component Id="ServiceInstaller" Guid="9e578e3d-0339-425c-8633-f54ffaaa4921">

    <ServiceInstall Id="ReportingServiceInstaller"
                    Type="ownProcess"
                    Vital="yes"
                    Name="WindowsService.exe"
                    DisplayName="WindowsService"
                    Description="Wickedly awesome and amazing service."
                    ErrorControl="ignore"
                    Account="NT AUTHORITY\LocalService"
                    Start="auto"
                    Interactive="no" />

    <ServiceControl Id="ServiceControl_Stop"
                    Name="WindowsService.exe"
                    Stop="both"
                    Remove="uninstall"
                    Wait="no" />

</Component>

2 个答案:

答案 0 :(得分:7)

不要使用ServiceControl元素,因为它将启动和停止服务。通过调用它,您要求安装程序对服务执行某些操作。您只需要调用ServiceInstall来创建服务。正如Stefan Wanitzek建议的那样,您应该在ServiceInstall的Start属性中使用demand。这是为了在用户重新启动计算机时使您的服务无法开始运行。如果您的安装程序也使用安装服务安装.exe作为文件。我建议您使用以下代码:

<Component Id="ServiceInstaller" Guid="3e412e3d-0339-325c-8633-f54ffaaa4921">
        <File Id="WindowsService.exe" 
         Name="WindowsService.exe" 
         KeyPath="yes"
         Source="Path to the EXE"/>
        <ServiceInstall Id="ReportingServiceInstaller"
                Type="ownProcess"
                Vital="yes"
                Name="WindowsService"                    
                DisplayName="WindowsService"
                Description="Wickedly awesome and amazing service."
                ErrorControl="ignore"
                Account="NT AUTHORITY\LocalService"
                Start="demand"
                Interactive="no" />
</Component>

答案 1 :(得分:1)

devfunkd的解决方案是正确的,但是首先要讨论几个问题。

一个,您可以删除ServiceControl,但也可以仅删除Start属性。这有助于在更新时停止服务。而且,Start没有“ none”选项,写Start =“”也无效,这将允许使用简单变量而不是复制粘贴整个组件。

二,每当更新服务时,都会涉及RestartManager。如果该服务正在运行,则该服务将停止,然后安装程序将执行其指示的操作,包括不启动该服务,然后RestartManager还原该服务的原始状态(已启动)。我花了一天时间才弄清楚。

请注意,您可以禁用安装程序与RestartManager的交互 (请参阅https://docs.microsoft.com/en-us/windows/desktop/Msi/msirestartmanagercontrol),但是如果安装程序发现正在使用的文件时,您需要确保不需要重新启动。

换句话说,是完全删除ServiceControl还是仅删除Start属性,为了确保更新后服务没有启动,您需要在安装之前手动将其停止。