为什么WiX Burn没有重启并恢复执行?

时间:2014-10-24 15:21:27

标签: .net wix burn wix3.8

我正在使用WiX Burn 3.8构建托管代码引导程序应用程序。其中一个PackageGroups包含ExePackage元素,用于在Windows Server 2003上安装Windows Installer 4.5。软件包的x86版本如下所示。 (以下代码片段略有改动,以避免暴露任何敏感的客户端信息。)

<!-- Microsoft Windows Installer 4.5 Redistributable x86 -->
<ExePackage Id="WindowsServer2003_KB942288_v4_x86.exe"
            DisplayName="Microsoft Windows Installer Redistributable x86"
            SourceFile="{a_path}\WindowsServer2003-KB942288-v4-x86.exe"
            Name="redist\Windows_Installer\WindowsServer2003-KB942288-v4-x86.exe"
            InstallCommand="/q /norestart"
            RepairCommand="/q /norestart"
            DetectCondition="VersionMsi &gt;= v4.5 AND Not VersionNT64"
            InstallCondition="InstallSqlExpress = &quot;yes&quot; AND VersionMsi &lt; v4.5 AND VersionNT = v5.2 AND Not VersionNT64"
            Compressed="no"
            DownloadUrl="http://downloads.{mycompany}.com/{some_path}/WindowsServer2003-KB942288-v4-x86.exe"
            Permanent="yes"
            SuppressSignatureVerification="no">
  <!-- Exit codes
       0 = Success, no reboot required
    3010 = Success, reboot required
  -->
  <ExitCode Value="0" Behavior="success" />
  <ExitCode Value="3010" Behavior="forceReboot" />
  <ExitCode Behavior="error"/>
</ExePackage>

Burn似乎没有重新启动或重新启动后宣传,我不知道为什么。我正在传递/q/norestart命令行参数,并将3010退出代码标识为需要重新启动,如MSDN's Windows Installer Redistributables文档中所述。

安装程序日志(下面的时间戳信息已修整)显示正在重新启动。您可以在下面看到来自Burn引擎和我的托管引导程序应用程序的日志事件的组合:

Restart requested by WindowsServer2003_KB942288_v4_x86.exe: RestartInitiated
Applied execute package: WindowsServer2003_KB942288_v4_x86.exe, result: 0x0, restart: Initiated
ApplyComplete.  Result: None
State changed.  Status: 0
Must reboot.  Showing warning.
Apply complete, result: 0x0, restart: Initiated, ba requested restart:  No
Exiting UI.
Shutting down, exit code: 0x0
Shutting down.  Restart: RestartInitiated
Bootstrapper application requested restart at shutdown. Planned to restart already: No.
Exit code: 0x0, restarting: Yes
Restarting computer...
=======================================

Burn引擎会将注册表项写入HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run。 GUID键具有以下值,看起来应该在重新启动后恢复引导程序:

"C:\Documents and Settings\All Users\Application Data\Package Cache\{a_guid}\{my_burn_installer}.exe" /burn.log.append "C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\{my_installer}{timestamp}.log" "/PARENTEXE=C:\Documents and Settings\Administrator\Desktop\{my_nsis_installer}.exe" {two_more_command_line_params} /burn.runonce

我已经检查了注册表项中列出的文件路径,我看到了基于Burn的安装程序和state.rsm文件。但是,当日志显示时,系统不会重新启动,并且在手动重新启动系统后安装程序不会恢复。

从上面可以看出,Burn引导程序包装在NSIS包中以安装Windows Imaging Component,这是在Windows Server 2003上安装.NET Framework 4的先决条件。请参阅{{3}有关为何必要的详细信息。我不相信这是问题的根源,因为基于Burn的引导程序从包缓存运行,但我可能是错的。

我在没有应用更新的32位Windows Server 2003 R2标准版Hyper-V虚拟机上进行测试。

1 个答案:

答案 0 :(得分:2)

使用WiX v3.9。它包括fix for when the RunOnce key is too long on XP/2003ability to install multiple prereq packages(正如我在链接问题中所解释的那样)。

对于没有重启的计算机,这是一个谜。由于Burn在调用InitiateSystemShutdownEx时不会强制关闭应用程序,因此应用程序可能会阻止关闭。