我正在尝试为我的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>
答案 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属性,为了确保更新后服务没有启动,您需要在安装之前手动将其停止。