Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何确定我刚安装的MSI是否请求重新启动Windows?_C#_Windows_Installation_Windows Installer - Fatal编程技术网

C# 如何确定我刚安装的MSI是否请求重新启动Windows?

C# 如何确定我刚安装的MSI是否请求重新启动Windows?,c#,windows,installation,windows-installer,C#,Windows,Installation,Windows Installer,我在C#中构建了一个setup.exe,它运行多个链式MSI(使用/QUIET/NORESTART)。最后,我想检查机器是否需要重新启动(也就是说,如果一个MSI请求重新启动) 如何检测到这种情况?以下注册表位置包含以下信息: 键HKLM\System\CurrentControlSet\Control\Session Manager,值PendingFileRenameOperations 来源:另一种方法是检查代码中运行的所有MSI的退出代码如果MSI的退出代码为3010,则需要重新启动。(

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


如何检测到这种情况?

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

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


来源:

另一种方法是检查代码中运行的所有MSI的退出代码如果MSI的退出代码为3010,则需要重新启动。()。

假设您正在使用
System.Diagnostics.Process
运行MSI,并且在进程退出后,您将使用
ExitCode
属性()检索进程退出代码。

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

要使用PowerShell命令进行补充:

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

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

我甚至看到过这个实用程序:它不仅知道需要重新启动,还知道为什么。。。如何以编程方式检索此类信息?注册表?请参阅下面的问题:我有一台没有挂起文件重命名操作的机器,在“关机”按钮中显示小屏蔽。为什么?关机按钮中的屏蔽不是意味着“安装更新并关机”吗?这不等于需要重新启动。好的。。。那么你知道如何探测塔特盾吗?我把它作为一个单独的问题提出来,有人抱怨它是这个问题的重复:-)我了解到,如果在运行MSI时系统已经等待重新启动,则某些MSI将不会使用3010的退出代码。微软的.NETFramework4.5.2离线安装程序就是这种MSI表现出这种行为的一个例子。如果您在MSI执行之间没有重新启动,而再次运行它,它只返回一个退出代码0。@user16563谢谢您提供的信息,很高兴知道。另一个很好的例子说明了令人困惑的不一致窗口是如何工作的