使用自定义凭据安装服务

时间:2012-11-06 14:38:42

标签: windows service wix install

我的安装程序要安装服务。在UI上,用户可以选择将此服务安装为LocalSystem或使用指定的用户凭据。 我的Wix代码如下所示:

<Component Id="C.MyService.exe" Guid="{Guid}">
        <File Id="MyService.exe" Name="MyService.exe" KeyPath="yes" Vital="yes"
              Source="MyServicePath" />
        <ServiceInstall Id="MyServiceInstall" DisplayName="[SERVICE_NAME]" Account="[SERVICE_ACCOUNT]" Password="[SERVICE_PASSWORD]" Name="[SERVICE_NAME]" ErrorControl="normal" Start="auto" Type="ownProcess" Vital="yes" Interactive="no">
        </ServiceInstall>
        <ServiceControl Id="MyServiceStart" Name="[SERVICE_NAME]" Start="install" Wait="no" />
        <ServiceControl Id="MyServiceStop" Name="[SERVICE_NAME]" Stop="both" Wait="yes" />
        <ServiceControl Id="MyServiceRemove" Name="[SERVICE_NAME]" Remove="uninstall" Wait="yes" />
      </Component>
      <Component Id="SetStartServicePermission" Guid="{Guid}">
        <CreateFolder/>
        <Condition>NOT USE_LOCALSYSTEM_ACCOUNT</Condition>
        <util:User Id="ServiceUser" Name="[SERVICE_ACCOUNT]" Password="[SERVICE_PASSWORD]" CreateUser="no" LogonAsService="yes" UpdateIfExists="yes" />
      </Component>

当我选择LocalSystem时,服务安装并正常工作。但是使用自定义用户凭据服务安装,但无法启动错误“Service ServiceName无法启动。验证您是否具有足够的权限来启动系统服务”。 自定义用户已存在且属于Administrators组。 当我使用LocalSystem安装并手动更改服务的登录凭据时,它会成功启动。

3 个答案:

答案 0 :(得分:1)

为了完整性 - 我成功使用以下代码授予LogonAsService权限:

<util:User Id="ProcessingServiceUser" Domain="[APP_USER_DOMAIN]" Name="[APP_USER_NAME]" Password="[APP_USER_PASSWORD]" CreateUser="no" LogonAsService='yes' UpdateIfExists='yes' />

因此CreateUser应为'no',但UpdateIfExists ='yes'。

虽然我认为这不是你的问题,因为你说用户已经拥有此权限。

您的安装程序是否以提升的权限启动?你安装什么操作系统版本?我假设您创建了每用户安装,以便它不会要求提升权限,但之后您尝试启动服务。尝试从管理命令行(msiexec / i YourInstaller.msi)启动MSI,而不是双击它。

答案 1 :(得分:0)

您将createuser属性设置为false。因此,WiX不会创建/更新用户以使SeLogonAsService正确。当你进入Services.msc并输入信用证时,它隐含地为你做这件事并开始工作。

答案 2 :(得分:0)

固定。我在ServicePassword属性名称和安装程序中错误打印了服务用户的空密码。