【问题标题】:Installer cannot start the service under User安装程序无法在用户下启动服务
【发布时间】:2011-10-05 06:01:20
【问题描述】:

安装程序安装 Windows 服务。 我向用户提供表单以选择其中一个帐户来启动服务:

  1. 本地服务
  2. 本地系统
  3. 网络系统
  4. 用户帐号

安装过程中选择User,输入Domain\Administrator账号+pwd,服务无法启动。

当我选择本地服务时,它开始正常。在此之后,我可以手动将帐户更改为相同的域\管理员帐户,并且它开始正常。 为什么会有如此不同的行为? 在安装过程中如何在任何用户帐户下启动服务?

【问题讨论】:

    标签: service installation wix


    【解决方案1】:

    看看 Util Extensions User 元素。您可以将 CreateUser 属性设置为 no,将 Name 属性设置为您在 UI 中用于 UserName 输入的 [PROPERTY],并将 LogonAsService 属性设置为 yes。这将指示 WiX 授予您的用户 LogOnAsService 权限,而无需编写自定义操作来调用 ntrights.exe。

    这是一个按要求提供的示例:

    <?xml version="1.0" encoding="utf-8"?>
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
      <Product Id="*" Name="Setup" Language="1033" Version="1.0.0.0" Manufacturer="test" UpgradeCode="5c6b0f52-d024-4f1b-bfae-2dbb96b3ef15">
        <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
        <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
        <MediaTemplate EmbedCab="yes" />
        <UIRef Id="WixUI_Minimal" />
        <Feature Id="ProductFeature" Title="Setup" Level="1">
          <ComponentRef Id="serviceComponent" />
        </Feature>
        <Directory Id="TARGETDIR" Name="SourceDir">
          <Directory Id="ProgramFilesFolder">
            <Directory Id="INSTALLFOLDER" Name="Setup">
              <Component Id="serviceComponent" Guid="380bbddd-daa7-0744-517b-37da768f5570">
                <File Id="serviceFile" Source="$(var.WindowsService.TargetPath)" KeyPath="yes" />
                <ServiceInstall Id="serviceInstall" Name="WindowsService" DisplayName="WindowsService" Start="auto" Type="ownProcess" ErrorControl="ignore" Account=".\serviceaccount" Password="p2Ekutrekac34ph2" />
                <ServiceControl Id="serviceControl" Name="WindowsService" Start="install" Stop="both" Remove="both" Wait="no" />
                  <util:User Id="user" CreateUser ="yes" Name ="serviceaccount" Password="p2Ekutrekac34ph2" LogonAsService="yes" UpdateIfExists="yes" RemoveOnUninstall="yes" PasswordNeverExpires="yes" FailIfExists="no" Domain="[ComputerName]" CanNotChangePassword="yes" Disabled="no" PasswordExpired="no"/> 
              </Component>
            </Directory>
          </Directory>
        </Directory>
      </Product>
    </Wix>
    

    【讨论】:

    • 这真的有效吗?我无法让它在安装服务的同时工作,因为设置权限似乎被安排为自定义操作,因此,发生在 Wix 尝试安装服务之后。还是我错过了什么?
    • 我已经在干净的 VM 快照上对此进行了测试,没有任何问题。
    • 您的意思是您可以为用户帐户设置权限并在相同的 .msi/Wix 安装中安装服务。拜托,你能和我分享你的代码吗?我在那里问了一个类似的问题:stackoverflow.com/questions/12949478/…
    • 是的,做了很多次。使用(经过测试的)样本更新了答案。
    • 谢谢。我发现它在创建服务帐户的同时安装服务本身时有效。当我们只想在安装服务时更新现有帐户时仍然没有运气...感谢您花时间更新您的答案。
    【解决方案2】:

    您需要确保所选用户帐户拥有log on as a service 的权限。不管你是不是管理员,如果没有给他登录权,你就不能为他安装服务。

    如果设置此策略有效,您还需要在安装期间动态执行此操作。一种解决方案是使用ntrights.exe 作为自定义操作。此自定义操作可以使用包含用户帐户信息的自定义属性。

    【讨论】:

      【解决方案3】:

      如果有人想知道为什么@Christopher Painter 的代码他的答案不起作用。我有类似的代码不适用于错误 1923。

      错误 1923。无法安装服务 '' ()。验证您是否有足够的权限来安装系统服务。 MSI (s) (10:08) [15:55:00:161]:产品:“”(64 位)--错误 1923。无法安装服务“”()。验证您是否有足够的权限来安装系统服务。

      直到我发现安装过程中需要关闭services.msc对话框

      不知道为什么,但它有效。 在开发过程中 services.msc 一直打开,所以我没注意到。

      【讨论】:

      • 有趣。也许服务管理单元会锁定服务控制管理器 api。我从来没有听说过这个。好琐事让我有一天可以测试。您使用的是什么版本的 Windows?
      • 使用 Windows 10 x64 Pro Anniv.Update。如果你在 Bing 上搜索一下,你会发现其他人过去也遇到过同样的问题。例如见:conetrix.com/Blog/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 2018-11-05
      • 2014-11-20
      • 2012-05-19
      相关资源
      最近更新 更多