Wix 使用Windows服务更新包将重置服务';帐户和密码

Wix 使用Windows服务更新包将重置服务';帐户和密码,wix,Wix,我正在用WiX安装MSI。我正试图让开发过程尽可能简单:这是一个内部产品,我的用户是我们的IT人员 该产品包括一个Windows服务,必须将其配置为在每台计算机的不同帐户下运行 我为我的用户(首次安装)计划的工作流程如下: 运行安装程序 (安装程序在默认帐户下设置服务) 通过sc或本地服务小程序停止服务 更新服务属性以在正确的计算机特定帐户下运行。 (每台机器的帐户不同,只有IT人员可以访问密码。) 重新启动服务 后续更新包括从更新的MSI文件安装 在测试“小型”更新时,我惊讶地发现安装程序将服

我正在用WiX安装MSI。我正试图让开发过程尽可能简单:这是一个内部产品,我的用户是我们的IT人员

该产品包括一个Windows服务,必须将其配置为在每台计算机的不同帐户下运行

我为我的用户(首次安装)计划的工作流程如下:

  • 运行安装程序 (安装程序在默认帐户下设置服务)
  • 通过
    sc
    或本地服务小程序停止服务
  • 更新服务属性以在正确的计算机特定帐户下运行。 (每台机器的帐户不同,只有IT人员可以访问密码。)
  • 重新启动服务
  • 后续更新包括从更新的MSI文件安装

    在测试“小型”更新时,我惊讶地发现安装程序将服务重置为在默认帐户下运行。这对我来说是个大问题,因为这让我的用户很难更新他们的服务器。每次更新时,他们都必须在每台机器上重新输入帐户信息。我希望这会发生在一个“主要”的更新上,但不会发生在一个“小”的更新上

  • 是否有办法配置安装程序,使其在“小型”或“小型”更新期间不会更改服务的现有帐户/密码配置?

  • 在“修复”过程中是否也会发生这种情况(我没有尝试过)

  • 以下是我的组件在
    .wxs
    文件中的外观:

    <Component Id="cmpService" Guid="{MYGUIDHERE}">
      <File Id="filService" KeyPath="yes" Name="ServiceApp.exe" />
      <ServiceInstall Id="ServiceInstall" Name="ServiceApp" DisplayName="My Service"
                      Type="ownProcess" Start="auto" ErrorControl="normal"
                      Account="LocalSystem">
        <util:PermissionEx ... attributes here... />
      </ServiceInstall>
      <ServiceControl Id="StartService" Start="install" Stop="both" Remove="uninstall"
                      Name="ServiceApp" Wait="yes" />
    </Component>
    
    
    
    我原以为
    Remove=“uninstall”
    会在没有更改的情况下保留服务。显然不是。(如果这种情况发生在“重大”更新中,我并不太担心)

    我还注意到,
    ServiceConfig
    元素的属性(
    OnReinstall
    )似乎符合要求,但根据错误消息,很明显,
    OnReinstall
    只影响元素的配置成员(
    PreShutdownDelay
    ,等等)而不是整个服务安装

    我已经研究过这些:

    奇怪的是,这表明这只是“重大”升级的问题。那不是我的经验。我的经历是偶然的吗


    在安装过程中提示输入帐户和密码是可以的,但在这种情况下,将密码存储在注册表或其他地方并不是一个真正的选项,每次更新都必须重新输入凭据,这与手动重新配置服务一样具有破坏性。

    我今天与FireGiant通了一个咨询电话,就这个问题进行了咨询,我们找到了解决方案

    背景故事:
    • 我们的应用程序安装MSI最初使用
      LocalService
      安装Windows服务,但是我们的实际桌面软件将其更改为
      NetworkService
      ,甚至在某些网络环境中可能需要自定义用户帐户
    • 我们的
      元素具有
      Account=“NT AUTHORITY\LocalService”
      ,如下所示:

      <Component Id="Comp_File_OurServiceExe" Guid="*">
      
          <File Source="$(var.TargetDir)OurService.exe" id="File_OurServiceExe" KeyPath="yes" />
      
          <ServiceInstall
              Id           = "ServiceInstall_OurServiceExe"
              Vital        = "yes"
      
              Name         = "RussianSpyingService"
              DisplayName  = "Russian Spying Service"
              Description  = "Crawls your network for incriminating files to send to the FSB"
              Account      = "NT AUTHORITY\LocalService"
              Type         = "ownProcess"
              Arguments    = "-mode service"
              Interactive  = "no"
              Start        = "auto"
              ErrorControl = "normal"
          >
      
              <ServiceConfig DelayedAutoStart="yes" OnInstall="yes" OnUninstall="no"  OnReinstall="yes" />
              <util:ServiceConfig FirstFailureActionType="restart" SecondFailureActionType="restart" ThirdFailureActionType="none" ResetPeriodInDays="1" />
          </ServiceInstall>
      </Component>
      

    • 更新你的
      最终为我工作的是

        <DeleteServices><![CDATA[REMOVE ~= "ALL" AND (NOT UPGRADINGPRODUCTCODE)]]> </DeleteServices>
        <InstallServices><![CDATA[NOT Installed]]> </InstallServices>
      
      
      
      我通过一系列尝试和错误的尝试,以及其他几个具有类似答案的线索的组合,得出了这个答案


      唯一不起作用的可能原因之一是WIX在重新安装时也会删除该服务。。我们只想在初始安装期间安装一次服务。我们还希望确保卸载时删除该服务。这是唯一对我有效的条件组合,允许服务保留其设置和用户帐户。

      您是否了解过这一点?您是否得到了这一点的答案。面对同样的问题…任何线索都很好…@user2717225,我没有其他线索。我们不需要发布很多更新,所以这对我们来说并不像我担心的那样重要。这是一个讨厌的问题。不幸的是,使用自定义用户帐户,我无法使其完全工作。实现此解决方案后,它将保留服务帐户名,但无法启动服务,我怀疑这是因为缺少密码。它会在安装过程中失败,提示重试/忽略。我只能手动打开services.msc,导航到该服务,在安装程序提示/警告无法成功安装该服务时输入正确的密码,然后单击“重试”,才能使安装成功。这对我来说很有效!这两个答案也有助于理解为什么这样做:stackoverflow.com/a/17608049/670028和stackoverflow.com/a/321874/670028
      <ServiceInstall
          Id           = "ServiceInstall_OurServiceExe"
          Vital        = "yes"
      
          Name         = "RussianSpyingService"
          DisplayName  = "Russian Spying Service"
          Description  = "Crawls your network for incriminating files to send to the FSB"
          Account      = "[SERVICE_ACCOUNT_NAME]"
          Type         = "ownProcess"
          Arguments    = "-mode service"
          Interactive  = "no"
          Start        = "auto"
          ErrorControl = "normal"
      >
      
          <ServiceConfig DelayedAutoStart="yes" OnInstall="yes" OnUninstall="no"  OnReinstall="yes" />
          <util:ServiceConfig FirstFailureActionType="restart" SecondFailureActionType="restart" ThirdFailureActionType="none" ResetPeriodInDays="1" />
      
      </ServiceInstall>
      
        <DeleteServices><![CDATA[REMOVE ~= "ALL" AND (NOT UPGRADINGPRODUCTCODE)]]> </DeleteServices>
        <InstallServices><![CDATA[NOT Installed]]> </InstallServices>