我在 C# 中构建了一个
setup.exe
,它运行多个链接的 MSI(使用 /QUIET /NORESTART
)。最后,我想检查机器是否需要重新启动(即,其中一个 MSI 是否请求重新启动)。
我怎样才能检测到?
以下注册表位置包含信息:
键
HKLM\System\CurrentControlSet\Control\Session Manager
,值 PendingFileRenameOperations
来源:https://learn.microsoft.com/en-us/sysinternals/downloads/pendmoves
实现此目的的另一种方法是检查您在代码中运行的所有 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)。
用 PowerShell 命令补充 Vinko Vrsalovic 的帮助:
$rebootPending = $null -ne
(Get-ItemProperty 'HKLM:\System\CurrentControlSet\Control\Session Manager').PendingFileRenameOperations
请注意,
$rebootPending
等于$true
表示系统重新启动因任何原因而等待,而不仅仅是由于基于MSI的安装。