加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

WiX MajorUpgrade的Windows服务,保留.config并避免重新启动

发布时间:2020-12-14 04:33:26 所属栏目:Windows 来源:网络整理
导读:我正在努力使MajorUpgrade,ServiceControl,.config文件一起工作. After my other question,我现在有一个相反的问题了. 之前,文件没有被覆盖,因为AssemblyFileVersions是静态的,所以我修正了. 1)即使现在的文件修改日期与文件创建日期不同,它被设置为KeyPath,
我正在努力使MajorUpgrade,ServiceControl,.config文件一起工作. After my other question,我现在有一个相反的问题了.

之前,文件没有被覆盖,因为AssemblyFileVersions是静态的,所以我修正了. 1)即使现在的文件修改日期与文件创建日期不同,它被设置为KeyPath,即使使用Schedule =“afterInstallExecute”,我的KeyPath =’yes’.config文件仍被覆盖.我目前不得不覆盖.config文件,并在安装后重新启动服务.

2)即使我解决了这个问题,我仍然有一个避免重启的问题.如果我说Schedule =“afterInstallInitialize”,那么我相信.config文件一定会随着服务一起被删除.如果我说Schedule =“afterInstallExecute”,那么服务不会停止,安装后需要重启. (没错,对吗?)在安装之前手动停止服务让我避免重启.添加一个net stop自定义动作可以用来替换ServiceControl我猜,但获得所有条件正确似乎很复杂.

3)作为奖金,我希望在升级过程中根本不会删除该服务.我可以停止服务,更换二进制文件,并重新启动服务?这将避免重新输入升级的服务帐户凭据.但是,当然,它仍然需要安装在第一次安装和卸载功能删除.

这是它的肉(后来也捆绑在一起,以防某种方式):

<MajorUpgrade DowngradeErrorMessage="A newer version is already installed." 
              Schedule="afterInstallExecute" />

<ComponentGroup Id="ServiceCG">
    <Component Id="Service" Guid='*' Win64='yes' Directory='INSTALLDIR'>
        <File Id='ServiceEXE' Source='$(var.root)Service.exe' />
        <ServiceInstall Id="ServiceInstall"
                          Name="MyService"
                          DisplayName="My Server"
                          Type="ownProcess"
                          Start="auto"
                          ErrorControl="normal"
                          Description="My Server Service"
                          Interactive="no"
                          Account="[...]"
                          Password="[...]" />
        <ServiceControl Id="StopService" Name="MyService" Start="install" 
                        Stop="uninstall" Wait="yes" Remove="both" />
        <util:User Id="UpdateServiceAccountLogonAsService" UpdateIfExists="yes"
                   CreateUser="no" Name="[SERVICEACCOUNTFULL]" 
                   LogonAsService="yes"/>
    </Component>
    <Component Id="ServiceConfig" Guid='*' Win64='yes' Directory='INSTALLDIR'>
        <File Id='FileServiceConfig' KeyPath='yes' 
              Source='$(var.root)Service.exe.config' />
    </Component>
</ComponentGroup>

相关但未答复:

> Prevent service removal/install during WiX major upgrade – service not stopping

WiX版本3.8.1128.0

编辑:似乎这个同样的问题的解释,至少在同一个话题上,可能会更容易理解: Msiexec: automatic rollback to previous version on installation failure

你在这里碰到几个核心的MSI使用问题.

>文件版本控制:在安装过程中,默认文件覆盖模式(由REINSTALLMODE property定义)将不会替换默认版本相同的文件.这可以通过设置REINSTALLMODE =“emus”来更改.这将替换版本文件的版本相同的文件.未修改的文件将被保留,如果修改和创建日期不同.
>升级行为:像Chris所说,由于主要的升级配置,似乎被恢复为默认的文件实际上被卸载并重新安装.如果RemoveExistingProducts放置在InstallExecuteSequence的后期,文件保存只能在主要升级中进行.然后,版本之间的共享文件将不会被卸载,并且第1点中描述的文件版本控制规则适用于覆盖.
>服务配置保护:避免重新进入服务凭证信息是早期在InstallExecuteSequence中卸载的主要升级的常见问题.换句话说,产品被卸载,然后重新安装擦除更改的文件.我不推荐它,但有些人认为这个解决方案:How to only stop and not uninstall windows services when major upgrade in wix?(Rob Mensching是WIX和Orca作者 – 我认为他建议这个解决方案作为选择,而不一定是推荐,请在链接的帖子中确定).正确的组件引用和卸载安装在InstallExecuteSequence的后期,这个问题通常是完全避免的,这是一个首选的方法(正常的组件引用会阻止组件完全卸载服务设置并修改配置文件 – 如果只有,组件引用是正确的 – 参见下面这个概念的描述).但是,如果您正在使用用户帐户来运行服务,那么我首选的方法仍然是使用单独的MSI进行服务安装和配置,那么它是一个自包含的部署单元,可以包含在引导程序中并自行更新,最重要的是:它不受任何其他应用程序更改或修补程序的干扰.最后,我想指出,运行用户帐户的服务不是推荐的开始 – 为了安全和部署的原因.

组件引用:指的是分配给MSI组件的GUID以及它们必须匹配一个,并且在所有升级时始终只有一个(绝对)路径.看到更好的讨论,这里有几个例子:Change my component GUID in wix?

我没有提到将安装服务的MSI组件设置为永久性的选项,以防止在卸载时删除它们,原因很简单,这完全不是很好的做法.然后文件和注册将保持最终卸载,您需要自定义操作来清理.非常糟糕的做法,必然会造成大量额外的工作和悬挂组件引用的问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读