无需卸载Windows服务即可进行重大升级

时间:2017-11-20 11:31:58

标签: service wix windows-installer uninstall major-upgrade

我真的很抱歉多余。我在本网站本身以及其他一些网站上查了很多其他帖子。没有卸载& amp;我无法使大型升级工作。重新安装服务。我正在更改产品代码和版本,而UpgradeFileComponent是升级的一部分。所有剩余的都与1.0.0中的相同。我正在进行POC,因此只想进行这一小改动(不是作为补丁,而是作为主要升级)。以下是我的Product.wxs。我不包括ServiceAccountDlg,Variables.wxi或en-us.wxl等其他内容的标记,因为它可能会使它很长。谁能帮帮我吗?我已经尝试过WIX_UPGRADE_DETECTED,UPGRADINGPRODUCTCODE等等,但是无法让它工作。每次都会卸载并重新安装该服务。我正在通过以下方式验证这一点。服务启动后,它会在ProgramData中创建一个日志文件,并每隔5秒继续附加一次。在卸载MSI期间,我正在删除此日志文件及其文件夹。重新安装并重新启动服务后,将再次创建日志文件。有了这个,我能够发现服务正在重新安装,总是与主要升级。我只希望部署新文件,而无需重新安装服务或任何其他正在卸载的组件。我从某些人那里听说工具集会检查更改的文件,并且只有在发生更改时才重新安装。但事实似乎并非如此。我也尝试过使用带有各种值的Schedule属性,但没有运气。任何帮助都会非常棒。我这么多天都没试过,没有运气。如果我需要更多信息,请告诉我。

<?xml version="1.0" encoding="UTF-8"?>
<?include Variables.wxi ?>

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util='http://schemas.microsoft.com/wix/UtilExtension'>
  <Product Id="$(var.ProductCode)" Name="$(var.ProductName)" Language="!(loc.LANG)" Version="$(var.ProductVersion)" Manufacturer=" MyCompany" UpgradeCode="$(var.UpgradeCode)">

    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" Id="*" />

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

    <!--<Upgrade Id="$(var.UpgradeCode)">
      <UpgradeVersion OnlyDetect="yes" Minimum="1.0.0" Maximum="2.0.0" IncludeMinimum="yes" IncludeMaximum="yes" Property="NEWERFOUND"   />
    </Upgrade>-->

    <InstallExecuteSequence>
      <!--<RemoveExistingProducts After="InstallExecute" />
      <DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices>-->
      <!--<InstallServices>NOT UPGRADINGPRODUCTCODE,NOT WIX_UPGRADE_DETECTED</InstallServices>-->
      <DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices>
    </InstallExecuteSequence>

    <Condition Message='This application only runs on Windows 7 or higher OS versions.'>
      <![CDATA[Installed OR (VersionNT64 >= 601)]]>
    </Condition>

    <MediaTemplate />

    <Property Id="MSIFASTINSTALL" Value="1"/>
    <Property Id="MsiLogging" Value="v" />
    <Property Id="MSIENFORCEUPGRADECOMPONENTRULES" Value="1" />
    <Property Id="INSTALLDIR">
      <RegistrySearch Id='MyCompanyMSISampleRegistry' Type='raw' Root='HKLM' Key='SOFTWARE\MyCompany\CustomApp' Name='INSTALLDIR' Win64='yes' />
    </Property>

    <WixVariable Id="WixUILicenseRtf" Value="License.rtf" />
    <Feature Id='Complete' Title='Foobar 1.0' Description='The complete package.'
    Display='expand' Level='1' ConfigurableDirectory='INSTALLDIR' AllowAdvertise='no' InstallDefault='local' Absent='disallow'>

      <Feature Id="FileFeature" Title="File Feature" Level="1" AllowAdvertise='no' InstallDefault='local' Absent='disallow' Display='expand'>
        <ComponentRef Id="FileComponent"/>
        <ComponentRef Id="UpgradeFileComponent"/>
      </Feature>
      <Feature Id="ServiceFeature" Title="Service Feature" Level="1" AllowAdvertise='no' InstallDefault='local' Absent='disallow' Display='expand'>
        <ComponentRef Id="ServiceComponent"/>
        <ComponentRef Id="deleteFolder"/>
      </Feature>
      <Feature Id="RegistryFeature" Title="Registry Feature" Level="1" AllowAdvertise='no' InstallDefault='local' Absent='disallow' Display='expand'>
        <ComponentRef Id="RegistryComponent"/>
      </Feature>           
      <Feature Id='Documentation' Title='Description' Description='The instruction manual.' Level='2' AllowAdvertise='no' InstallDefault='followParent' Absent='disallow'>
        <ComponentRef Id='Manual' />
      </Feature>

    </Feature>
    <!--<UIRef Id="WixUI_Mondo"/>
    <UIRef Id="WixUI_ErrorProgressText" />-->

    <UI Id="MyWixUI_Mondo">
      <UIRef Id="WixUI_Mondo" />

      <DialogRef Id="ServiceAccountDlg" />

      <Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="ServiceAccountDlg" Order="2">LicenseAccepted = "1"</Publish>
      <Publish Dialog="SetupTypeDlg" Control="Back" Event="NewDialog" Value="ServiceAccountDlg">1</Publish>
    </UI>
    <UIRef Id="WixUI_ErrorProgressText" />

    <Icon Id="MyCompanyBanner.ico" SourceFile="Binary\MyCompanyBanner.ico" />

  </Product>

  <Fragment>
    <Component Id='Manual' Guid='7470A2CD-B07C-4AB4-9152-8C6AA53FA0F7' Directory='INSTALLDIR'>
      <File Id='Manual' Name='Manual.pdf' DiskId='1' Source='1.0.0\Manual.pdf' KeyPath='yes'>
        <Shortcut Id="startmenuManual" Directory="DesktopFolder" Name="Instruction Manual" Advertise="yes" />
      </File>
    </Component>
  </Fragment>

  <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLDIR" Name="$(var.InstallFolderName)" />
      </Directory>
      <Directory Id="DesktopFolder" Name="Desktop" />
      <Directory Id="CommonAppDataFolder">
        <Directory Id="MyCompanyTestInstallerLogs" Name="MyCompanyTestInstallerLogs">
          <Component Id="deleteFolder" Guid="323549D2-90B7-4D5D-8A36-EEA0ACCCC35E">
            <RemoveFile Id="deleteServiceFile" Name="MyCompanyTestWinSvcLog.txt" On="both" Directory="MyCompanyTestInstallerLogs"/>
            <RemoveFolder Directory="MyCompanyTestInstallerLogs" Id="MyCompanyTestInstallerLogs" On="both"/>
          </Component>
        </Directory>
      </Directory>
    </Directory>
  </Fragment>

  <Fragment>
    <Component Id="FileComponent" Directory="INSTALLDIR" Guid="F143BE3C-48D6-4138-B4E6-5CF44773CBA5" >      
      <File Id="SampleTextFile.txt" Name="Sample.txt" Source="$(var.Version)\Sample.txt" KeyPath="yes">
        <Shortcut Id="startmenuSampleText" Directory="DesktopFolder" Name="MyCompany MSI Sample" WorkingDirectory='INSTALLDIR' Icon='MyCompanyBanner.ico' Advertise='yes' />
      </File>
    </Component>
  </Fragment>

  <Fragment>
    <Component Id="UpgradeFileComponent" Directory="INSTALLDIR" Guid="4582597C-2CE0-451E-8B89-83BA4ABCE464">    
      <File Id="SampleXMLFile.xml" Name="Sample.xml" Source="$(var.Version)\Sample.xml" KeyPath="yes" />
    </Component>
  </Fragment>

  <Fragment>
    <Component Id='ServiceComponent' Directory="INSTALLDIR" Guid="AEA0E53F-3D70-4010-8592-9A01FE49344D">
      <util:User Domain="[DOMAIN]" Id="svcUser" Name="[USER_NAME]" Password="[PASSWORD]" LogonAsService="yes" CreateUser="no"/>
      <File Id='MyCompanyTestWinSvc' Name='MyCompanyTestWinSvc.exe' Source='Binary\MyCompanyTestWinSvc.exe' KeyPath='yes' />
      <ServiceInstall Id="installMyCompanyTestWinSvc" Name="MyCompanyTestWinSvc" DisplayName="MyCompany Install Test Windows Service" Start="auto" ErrorControl="normal" Type="ownProcess" Account="[DOMAIN]\[USER_NAME]" Password="[PASSWORD]" />
      <ServiceControl Id="sc_MyCompanyTestWinSvc" Name="MyCompanyTestWinSvc" Start="install" Stop="both" Remove="uninstall" Wait="yes" />
      <ServiceControl Id="stopAndStartIIS" Name="IISADMIN" Start="uninstall" Stop="install" Wait="yes" />
      <ServiceControl Id="stopAndStartSQL" Name="MSSQLSERVER" Start="uninstall" Stop="install" Wait="yes" />
    </Component>
  </Fragment>

  <Fragment>
    <Component Id="RegistryComponent" Directory="INSTALLDIR" Guid="8D8D93A4-09F5-4511-B291-720A7BC70529">
      <RegistryValue Root='HKCU' Key='Software\[Manufacturer]\[ProductName]' Type='string' Value='' KeyPath='yes' />
    </Component>
  </Fragment>

</Wix>

2 个答案:

答案 0 :(得分:1)

您的MajorUpgrade未指定计划的位置。正如文档所说,默认值是在InstallValidate之后,“此安排在安装升级产品之前完全删除已安装的产品。”因此,您的主要升级将完全卸载旧产品,删除该服务,然后安装升级。

因此,您应该首先在安装执行后安排主要升级,因为这将在现有已安装产品的基础上更新,并且引用计数应最大限度地减少对服务的干扰。这意味着您必须遵循组件规则,并增加需要替换的版本化文件的文件版本。

话虽如此,升级始终是旧产品的卸载,因此旧版本中的ServiceControl将运行,并且Remove =“both”可能是问题,在升级期间删除服务。所以原来的WiX ServiceControl很重要。

此外,如果未遵循组件规则,则升级afterInstallValidate将正常工作,因为它会卸载所有内容,然后安装新产品。但是,如果在升级后没有遵循组件规则,则可能会卸载服务组件(由于组件ID不同),并且可能会出现其他不遵循规则的影响。

为清楚起见,您在新安装中不需要删除服务的条件。我会从一个更好的地方对主要升级进行排序开始。此外,UPGRADINGPRODUCTCODE作为新升级中的条件绝对没有效果。如果通过升级卸载此属性,则在旧产品中设置此属性。如果你想使用这个属性,它应该是已经安装的原始产品,所以如果它已经发货和安装,现在改变代码为时已晚(没有补丁等)。

更详细的MSI日志会显示有关正在发生的事情和按什么顺序的更多详细信息,请将字符串指定为voicewarmup。

答案 1 :(得分:0)

我将此添加到我的<InstallExecuteSequence>

<!-- http://stackoverflow.com/questions/15965539/how-to-only-stop-and-not-uninstall-windows-services-when-major-upgrade-in-wix don't change service config on upgrade -->
<DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices>            
<InstallServices>NOT WIX_UPGRADE_DETECTED</InstallServices>

似乎为我工作,但由于产品的变化,我不再使用它了。您必须确保不会在版本之间更改服务配置,因为当您更改配置时,执行需要在升级期间卸载和安装服务。

仅在真正卸载时删除服务(Rob [评论问题回答者]注意事项您不需要在删除状态周围进行调整,因为组件中记录了服务的安装/卸载状态)

我们只在第一次安装时安装服务。