我使用Wix开发了Windows服务安装程序。安装后,服务设置为自动启动。安装程序具有自定义对话框,该对话框将接受用户输入和更新.config文件。输入是可选的。
如果未提供输入,则不会更新配置文件。我可以从services.msc重新启动Windows服务。如果用户提供输入,则自定义操作(延迟)将更新配置文件。此自定义操作以Impersonate =“no”模式运行。
在这种情况下,Windows服务会在安装后自动启动,一切正常。但是当我重新启动服务时,它会抛出错误。
以下是安装服务的代码:
<Component Id="CMPFa85281c3_a329_4a93_a1d7_203fbccec31f" Guid="*" Directory="INSTALLLOCATION">
<Condition>
<![CDATA[Installed OR (SVCINSTALL <> 0)]]>
</Condition>
<RemoveFile Id="RmFa85281c3_a329_4a93_a1d7_203fbccec31f" Name="MyService.exe" On="both" />
<File Id="Fa85281c3_a329_4a93_a1d7_203fbccec31f" Source="$(var.BaseDir)\MyService.exe" KeyPath="yes" />
<ServiceInstall Id="InstallWindowsService" Name="MyService"
DisplayName="MyService"
Start="auto"
ErrorControl="normal"
Type="ownProcess"
Account="[USER_DOMAIN]\[SERVICEUSER]"
Password="[PASSWORD]"
Description="MyService"/>
<ServiceControl Id="sc_InstallWindowsService" Name="MyService"
Start="install" Remove="uninstall" Stop="both" Wait="no"/>
</Component>
以下是自定义操作的代码。
<CustomAction Id="UpdateConfigFiles"
Return="check"
Execute="deferred"
Impersonate="no"
BinaryKey="MyCustomAction.dll"
DllEntry="UpdateFilePath"
HideTarget="yes">
</CustomAction>
<InstallExecuteSequence>
<Custom Action="PassData" Before="UpdateConfigFiles">NOT Installed AND NOT PATCH AND NOT REMOVE</Custom>
<Custom Action="UpdateConfigFiles" Before="InstallFinalize">NOT Installed AND NOT PATCH AND NOT REMOVE</Custom>
</InstallExecuteSequence>
答案 0 :(得分:0)
从这种事情来判断:
https://support.microsoft.com/en-us/kb/2478117
错误可能与启动服务的权限不足有关。自定义操作或配置步骤没有理由产生影响,除非它导致服务以新帐户启动或导致它在同一进程中共享两个服务,这就是消息说。它似乎与安装无关,因为没有机制可以产生这种效果。
重现的方案对我来说仍然不明确,但似乎安装可以启动服务(并且安装使用本地系统帐户运行)因此它成功,但根据知识库文章的错误消息意味着尝试启动它的用户没有足够的权限,否则错误说该进程正在尝试使用两个帐户,可能是配置文件中的一个帐户和安装配置的帐户。