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

Sam*_*Dev 1 installation windows-services wix

我正在尝试设置安装 Windows 服务并处理升级和更新的 WiX 安装程序。

安装程序就像一个魅力,用户在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>
Run Code Online (Sandbox Code Playgroud)

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

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

 <MajorUpgrade AllowSameVersionUpgrades="yes" AllowDowngrades="no" DowngradeErrorMessage="A newer version of [ProductName] is already installed." Schedule="afterInstallExecute" />
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激。

Chr*_*ter 5

这是一个经典的真理来源问题。MSI 希望成为事实的来源,并且在其代码中没有任何内容来说明这种情况。它认为服务应该是 LocalSystem,所以它想修复它。(这不仅仅是升级……维修也会做同样的事情。)

那么该怎么办?

选项A:

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

注:风险。凭证可以进行逆向工程.. 我得到了消息...... Windows LSA 机密和应用程序池身份等也可以。

选项 B:

使用自定义操作来创建服务。通过这种方式,您可以执行逻辑以在后续事务期间不接触服务。

选项 C:

将条件表达式放在 CreateServices 标准操作上,以仅在首次安装时应用,而不是在重大升级时应用。

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

选项 D:

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

选项 E:

如果用户在安装后应用凭据,则他们可以在升级后再次执行此操作。他们可以处理。

  • 是的,它正在通过自定义操作重新发明 MSI(通常不受欢迎),但在这种情况下,MSI 无法满足您的需求。只需彻底测试即可。安装、卸载、重新安装、修复和升级。 (2认同)