WiX - 升级服务

WiX - upgrade services

我在 1.0.0.0 版本中安装了我的应用程序。服务已安装在用户帐户上(使用用户名/密码)。

如何进行更新,使用户不必再次指定登录名和密码?

<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />

      <Component Id="MyService" Guid="MyGUID" Win64="yes">
        <File Id="FileID" Name="MyService.exe" Source="Path\MyService.exe" KeyPath="yes" />
      
        <ServiceInstall Id="InstallService"
                        Type="ownProcess"
                        Name="SERVICENAME"
                        DisplayName="XXX"
                        Description="XXX XXX"
                        Account="NT SERVICE\XXXACCOUNT"
                        ErrorControl="normal"
                        Start="auto" />
      
        <ServiceControl Id="Controlervice" Name="SERVICENAME" Start="install" Stop="both" Remove="uninstall" Wait="yes" />
      </Component>

我试过了:

<InstallExecuteSequence>
    <!-- Without overwriting the service configuration -->
    <DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices> 
</InstallExecuteSequence>

但是没有用。

如果您在升级设置中使用该条件,则该条件不正确。 UPGRADINGPRODUCTCODE 是在已安装的旧产品中设置的,该产品正在被替换和卸载,而不是在新的传入升级中。为此,您需要升级元素中的 属性,如果您使用 MajorUpgrade 元素,则需要 WIX_UPGRADE_DETECTED。然而...

影响旧产品的卸载(正在升级)为时已晚,因为它的 DeleteServices 已经在卸载中,准备好发生了,你无法阻止它从你的新产品中发生升级安装。如果您在旧安装中有 DeleteServices 条件,它就有可能工作,这样它就不会作为升级卸载的一部分被删除。如果有多个服务,人们通常不会这样做,因为它会影响所有服务。

一般来说,人们通过在某处保存和加密凭据来做到这一点,这样它们就可以恢复到具有帐户名和密码的属性中,这样它们就可以在升级、补丁、修复等时恢复。如果你没有'救了他们现在修复它可能为时已晚。例如,如果您对安装的旧产品进行维修会怎样?它会再次要求提供凭据还是会失败?或者使用默认帐户将服务恢复到 运行?

从长远来看,将这些凭据存储在某个地方是人们采用的方法,Win32 CredWrite 和 CredRead 以及托管代码等价物比注册表更安全。

根据发布的信息,我认为没有适合您的解决方案。如果我理解正确,那么旧的卸载将无条件地调用 DeleteServices,除非您更新旧产品(例如使用补丁)以防止 DeleteServices,否则您无法阻止删除。然后在传入升级中,您需要跳过调用 InstallServices。并完全确保服务二进制文件将位于完全相同的位置(可能不是可浏览的应用程序目录!),因为您不希望旧安装创建的服务设置引用升级可能安装到的二进制文件不同的位置。