使用 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:
如果用户在安装后申请信用,那么他们可以在升级后再次申请。他们可以处理它。
我正在尝试设置一个 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:
如果用户在安装后申请信用,那么他们可以在升级后再次申请。他们可以处理它。