使用 WiX 工具集升级服务时不要覆盖服务帐户

Don't override the service account when upgrading a service using WiX toolset

我正在尝试设置一个 WiX 安装程序来安装 windows 服务并处理升级和更新。

安装程序工作起来很神奇,用户在 LocalSystem 帐户下安装服务,然后服务工程师必须为该服务分配一个域帐户。

这是我的服务安装程序组件:

  <Component Id="my_exe_Component">
    <File Id="Myexe" Source="$(var.Myproject.TargetPath)" KeyPath="yes" />
    <ServiceInstall Id="my_exe" Type="ownProcess" Vital="no" Name="NME" DisplayName="My intaller" Description="My installer description" Start="auto" Account="LocalSystem" ErrorControl="ignore" Interactive="no">
      <util:ServiceConfig
        FirstFailureActionType="restart"
        SecondFailureActionType="restart"
        ThirdFailureActionType="restart"
        RestartServiceDelayInSeconds="0"
        ResetPeriodInDays="1"/>
    </ServiceInstall>
    <ServiceControl Id="my_exe" Stop="both" Remove="uninstall" Name="NME" Wait="yes" />
  </Component>

当我对安装程序执行升级时,为服务设置的帐户被覆盖回 LocalSystem 帐户,如何在执行时保留为我的服务设置的帐户升级?

我的升级条款是这样设置的:

 <MajorUpgrade AllowSameVersionUpgrades="yes" AllowDowngrades="no" DowngradeErrorMessage="A newer version of [ProductName] is already installed." Schedule="afterInstallExecute" />

如有任何帮助,我们将不胜感激。

这是一个经典的真理来源问题。 MSI 希望成为真相的来源,并且其代码中没有任何内容来说明这种情况。它认为该服务应该是 LocalSystem,因此它想要修复它。 (这不只是升级……维修也能起到同样的作用。)

那么,怎么办?

选项A:

将用户名/密码配置引入 MSI。 UI 工作,凭证验证和凭证加密将其保存在某处机器上,以便后续交易可以解密和重用凭证。

注意:风险。信用可以被逆向工程。虽然我得到了消息...... windows LSA 秘密和应用程序池身份等也可以。

选项B:

使用自定义操作创建服务。这样您就可以在后续交易中执行不接触服务的逻辑。

选项 C:

在 CreateServices 标准操作上放置条件表达式以仅在首次安装期间应用,而不适用于重大升级。

风险:如果您更改了服务的任何其他内容,升级将无法部署该服务,因为它已被绕过。这也适用于您 MSI 中的所有服务,而不仅仅是这个服务。

选项 D:

拥抱 运行 作为内置服务帐户,并使用活动目录权限授予该计算机对象对其连接的任何对象的权限。

选项E:

如果用户在安装后申请信用,那么他们可以在升级后再次申请。他们可以处理它。