我在c#中构建了一个setup.exe,它运行几个链式MSI(使用/ QUIET / NORESTART)。最后,我想检查机器是否需要重新启动(也就是说,如果其中一个MSI要求重启)。
我该如何检测呢?
答案 0 :(得分:5)
以下注册表位置包含以下信息:
键HKLM\System\CurrentControlSet\Control\Session Manager
,值PendingFileRenameOperations
来源:http://technet.microsoft.com/en-us/sysinternals/bb897556.aspx
答案 1 :(得分:1)
另一种实现此目的的方法是检查您在代码中运行的所有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,那么您就知道需要重新启动。
答案 2 :(得分:0)
使用 PowerShell 命令补充Vinko Vrsalovic's helfpul answer:
$rebootPending = $null -ne
(Get-ItemProperty 'HKLM:\System\CurrentControlSet\Control\Session Manager').PendingFileRenameOperations
请注意,$rebootPending
等于$true
表示系统重启是出于任何原因,而不仅仅是基于MSI的安装。