简体   繁体   English

Wix Burn:安装MsuPackage后如何重启

[英]Wix Burn: How to reboot after installing a MsuPackage

I currently have a scenario whereby I need to do the following using burn 我目前有一个场景,我需要使用刻录执行以下操作

  1. Install Windows Imaging Component 安装Windows映像组件
  2. Install Windows Installer 4.5 安装Windows Installer 4.5
  3. Install .Net 4 Web 安装.Net 4 Web
  4. Run my installer (created using Wix 3.6) 运行我的安装程序(使用Wix 3.6创建)

I would like to know if there is a way to force a restart after installing a MsuPackage... 我想知道在安装MsuPackage后是否有办法强制重启...

In my scenario, when the bootstrapper installs Windows6.0-KB942288-v2-x86.msu on windows vista and subsequently tries to install the .Net Framework without restarting it throws an error: 0x8007064d - This installation package cannot be installed by the windows installer service... 在我的方案中,当引导程序在Windows Vista上安装Windows6.0-KB942288-v2-x86.msu并随后尝试安装.Net Framework而不重新启动时会抛出错误:0x8007064d - Windows安装程序无法安装此安装包服务...

If I restart after the error and run the setup again it works correctly. 如果我在错误后重新启动并再次运行安装程序它可以正常工作。 Note that with a ExePackage a InstallCommand can be specified as well as a ExitCode, How can I achieve the same behavior in a MsuPackage? 请注意,使用ExePackage可以指定InstallCommand以及ExitCode,如何在MsuPackage中实现相同的行为?

Please see the contents of my wxs file below: 请参阅下面我的wxs文件的内容:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" 
     xmlns:bal="http://schemas.microsoft.com/wix/BalExtension" 
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
  <Bundle Name="$(var.MyProject.ProjectName)" Version="2.6.0.0" Manufacturer="Awesome Software (Pty) Ltd" UpgradeCode="6a77118d-c132-4454-850b-935edc287945">
    <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense">
      <bal:WixStandardBootstrapperApplication
        LicenseFile="$(var.SolutionDir)Awesome.EULA\Awesome CE Eula.rtf"
        SuppressOptionsUI="yes"/>
    </BootstrapperApplicationRef>

    <util:FileSearch Path="[SystemFolder]\windowscodecs.dll" Variable="windowscodecs" Result="exists" />

    <Chain>
      <!-- Windows Imaging Component-->
      <ExePackage Cache="no" Compressed="no" PerMachine="yes" Permanent="yes" Vital="yes"
        SourceFile="redist\wic_x86_enu.exe"
        DownloadUrl="http://download.microsoft.com/download/f/f/1/ff178bb1-da91-48ed-89e5-478a99387d4f/wic_x86_enu.exe"
        InstallCondition="VersionNT &lt; v5.2 AND NOT VersionNT64"
        DetectCondition="windowscodecs"
        InstallCommand="/quiet /norestart">
      </ExePackage>
      <ExePackage Cache="no" Compressed="no" PerMachine="yes" Permanent="yes" Vital="yes"
        SourceFile="redist\wic_x64_enu.exe"
        DownloadUrl="http://download.microsoft.com/download/6/4/5/645FED5F-A6E7-44D9-9D10-FE83348796B0/wic_x64_enu.exe"
        InstallCondition="VersionNT &lt; v5.2 AND VersionNT64"
        DetectCondition="windowscodecs"
        InstallCommand="/quiet /norestart">
      </ExePackage>
      <!-- Windows Installer 4.5 -->
      <ExePackage Cache="no" Compressed="no" PerMachine="yes" Permanent="yes" Vital="yes"
          SourceFile="redist\WindowsXP-KB942288-v3-x86.exe"
          DownloadUrl="http://download.microsoft.com/download/2/6/1/261fca42-22c0-4f91-9451-0e0f2e08356d/WindowsXP-KB942288-v3-x86.exe"
          InstallCondition="VersionNT=v5.1 AND NOT VersionNT64 AND VersionMsi &lt; v4.5"
          InstallCommand="/quiet /norestart">
        <ExitCode Behavior="forceReboot"/>
      </ExePackage>
      <ExePackage Cache="no" Compressed="no" PerMachine="yes" Permanent="yes" Vital="yes"
          SourceFile="redist\WindowsServer2003-KB942288-v4-x86.exe"
          DownloadUrl="http://download.microsoft.com/download/2/6/1/261fca42-22c0-4f91-9451-0e0f2e08356d/WindowsServer2003-KB942288-v4-x86.exe"
          InstallCondition="VersionNT=v5.2 AND NOT VersionNT64 AND VersionMsi &lt; v4.5"
          InstallCommand="/quiet /norestart">
        <ExitCode Behavior="forceReboot"/>
      </ExePackage>
      <ExePackage Cache="no" Compressed="no" PerMachine="yes" Permanent="yes" Vital="yes"
          SourceFile="redist\WindowsServer2003-KB942288-v4-x64.exe"
          DownloadUrl="http://download.microsoft.com/download/2/6/1/261fca42-22c0-4f91-9451-0e0f2e08356d/WindowsServer2003-KB942288-v4-x64.exe"
          InstallCondition="VersionNT=v5.2 AND VersionNT64 AND VersionMsi &lt; v4.5"
          InstallCommand="/quiet /norestart">
        <ExitCode Behavior="forceReboot"/>
      </ExePackage>
      <MsuPackage Cache="no" Compressed="no" Permanent="yes" Vital="yes" KB="KB942288" 
          SourceFile="redist\Windows6.0-KB942288-v2-x86.msu"
          DownloadUrl="http://download.microsoft.com/download/2/6/1/261fca42-22c0-4f91-9451-0e0f2e08356d/Windows6.0-KB942288-v2-x86.msu"
          InstallCondition="VersionNT=v6.0 AND NOT VersionNT64 AND VersionMsi &lt; v4.5">
      </MsuPackage>
      <MsuPackage Cache="no" Compressed="no" Permanent="yes" Vital="yes" KB="KB942288"
          SourceFile="redist\Windows6.0-KB942288-v2-x64.msu"
          DownloadUrl="http://download.microsoft.com/download/2/6/1/261fca42-22c0-4f91-9451-0e0f2e08356d/Windows6.0-KB942288-v2-x64.msu"
          InstallCondition="VersionNT=v6.0 AND VersionNT64 AND VersionMsi &lt; v4.5">
      </MsuPackage>
      <PackageGroupRef Id="NetFx40Web"/>
      <RollbackBoundary />
      <MsiPackage Id="MaxCut" SourceFile=".\StagingBundle\Awesome.msi" DisplayInternalUI="no"/>
    </Chain>
  </Bundle>
</Wix>

MsuPackage restarts are automatically detected. 将自动检测MsuPackage重新启动。 The MSU you installed might have said it required a restart (the log file should say something, IIRC) but did not need to force a restart. 你安装的MSU可能已经说它需要重启(日志文件应该说一些,IIRC),但不需要强制重启。 It has been request to have Burn have a way to promote a "restart required" to a "restart now if any restarts are required at this point" in the chain. 已经要求Burn有一种方法可以将“需要重新启动”提升到“现在重新开始,如果此时需要重新启动”链中。 Unfortunately, at this point that feature does not exist yet. 不幸的是,此时此功能尚不存在。

However, you can implement the "force restart now" behavior in a custom BootstrapperApplication by return IDRESTART from OnExecutePackageComplete() callback. 但是,您可以通过从OnExecutePackageComplete()回调返回IDRESTART ,在自定义BootstrapperApplication中实现“立即强制重启”行为。 That's the only option until someone implements the feature. 在有人实现该功能之前,这是唯一的选择。

I needed to do this recently, and didn't want to have to write a bootstrapper app or create additional bootstrapper EXEs for each MSU 我最近需要这样做,并且不想为每个MSU编写一个bootstrapper应用程序或创建额外的bootstrapper EXE

As a workaround I added an executable that does nothing (NOP.EXE) to run after the MsuPackage and used ExitCode to force a reboot. 作为一种解决方法,我添加了一个不执行任何操作的可执行文件(NOP.EXE),以便在MsuPackage之后运行并使用ExitCode强制重新启动。

You need to use the same DetectCondition for both the MsuPackage and the ExePackage . 您需要使用相同的DetectCondition同时为MsuPackageExePackage

You can use the same executable after multiple MsuPackages 您可以在多个MsuPackages之后使用相同的可执行文件

So something like... 所以像......

  <Fragment>
    <util:FileSearch Path="PathToSomeDotNetDll" Result="version" Variable="DotNetVersionCheck" />
    <PackageGroup Id="net45_x86">
      <MsuPackage Cache="no"
                  Compressed="no"
                  DetectCondition="DotNetVersionCheck &gt;= v4.5"
                  Permanent="yes"
                  Vital="yes"
                  KB="KB942288"
                  SourceFile="redist\Windows6.0-KB942288-v2-x86.msu"
                  DownloadUrl="http://download.microsoft.com/download/2/6/1/261fca42-22c0-4f91-9451-0e0f2e08356d/Windows6.0-KB942288-v2-x86.msu"
                  InstallCondition="VersionNT=v6.0 AND NOT VersionNT64 AND VersionMsi &lt; v4.5">
      </MsuPackage>
      <!-- Trick the bootstrapper into rebooting now by running an executable that does nothing and set ExitCode to force a reboot -->
      <ExePackage SourceFile="bin\nop.exe"
                  DisplayName="Reboot required after KB942288"
                  DetectCondition="DotNetVersionCheck &gt;= v4.5"
                  InstallCommand="nop.exe"
                  InstallCondition="VersionNT=v6.0 AND NOT VersionNT64 AND VersionMsi &lt; v4.5"
                  Permanent="yes">
        <ExitCode Behavior="forceReboot"/>
      </ExePackage>
    </PackageGroup>
  </Fragment>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM