【问题标题】:How to find out if an MSI I just installed requested a Windows reboot?如何确定我刚刚安装的 MSI 是否要求重新启动 Windows?
【发布时间】:2009-11-06 06:36:38
【问题描述】:

我在 C# 中构建了一个 setup.exe,它运行多个链接的 MSI(使用 /QUIET /NORESTART)。最后,我想检查一下机器是否需要重新启动(也就是说,如果其中一个 MSI 请求重新启动)。

我怎样才能检测到呢?

【问题讨论】:

标签: c# windows installation windows-installer


【解决方案1】:

以下注册表位置包含信息:

HKLM\System\CurrentControlSet\Control\Session Manager,值PendingFileRenameOperations

来源:http://technet.microsoft.com/en-us/sysinternals/bb897556.aspx

【讨论】:

  • 我有一台没有 PendingFileRenameOperations 的机器,在“关闭”按钮中显示了小盾牌。怎么会?
  • 关机按钮中的盾牌不是表示“安装更新并关机”吗?这不等于需要重新启动。
  • 好的...你知道如何检测taht shield吗?我把它作为一个单独的问题,有人抱怨它是这个问题的副本:-)
【解决方案2】:

实现此目的的另一种方法是检查您在代码中运行的所有 MSI 的退出代码。 如果 MSI 的退出代码为 3010,则需要重新启动。 (http://msdn.microsoft.com/en-us/library/aa368542.aspx)。

假设您使用 System.Diagnostics.Process 运行 MSI,并且在进程退出后,您将使用 ExitCode 属性 (http://msdn.microsoft.com/en-us/library/system.diagnostics.process.exitcode(v=vs.90).aspx) 检索进程退出代码。

因此,您只需检查 MSI 进程的退出代码,当您运行完所有 MSI 后,如果其中任何一个返回 3010,那么您知道您需要重新启动。

【讨论】:

  • 我了解到,如果在您运行 MSI 时系统已经等待重新启动,则某些 MSI 将不会使用退出代码 3010。 Microsoft 的 .NET Framework 4.5.2 脱机安装程序就是一个显示此行为的此类 MSI 示例。如果您再次运行它而没有在 MSI 执行之间重新启动,它只会返回退出代码 0。
  • @user16563 感谢您的信息,很高兴知道。又一个很好的例子,说明 Windows 的运行方式往往令人困惑。 :)
【解决方案3】:

PowerShell 命令补充Vinko Vrsalovic's helfpul answer

$rebootPending = $null -ne 
  (Get-ItemProperty 'HKLM:\System\CurrentControlSet\Control\Session Manager').PendingFileRenameOperations

请注意,$rebootPending 等于 $true 表示系统重新启动由于任何原因而挂起,而不仅仅是由于基于 MSI 的安装。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 2017-05-09
    • 1970-01-01
    相关资源
    最近更新 更多