如何检查Windows服务器是否需要重启?我正在制作一个安装程序项目。当用户运行此安装程序时,如果操作系统上有挂起的重新启动,则不应继续。
答案 0 :(得分:1)
使用Powershell
如果您要确定哪些服务器需要重新启动,您会喜欢这个PowerShell脚本来检查状态。事实证明,识别正在等待重启的服务器的一种简单方法是检查注册表。此信息存储在注册表的HKeyLocalMachine配置单元中。 PowerShell是为了使用注册表而诞生和繁殖的。 Registry是内置的PowerShell提供程序之一。甚至已经有一个PSDrive连接到该注册表配置单元!您可以像浏览文件系统一样浏览注册表。
更改为注册表驱动器。
// Set-Location也可以通过其别名来调用 - CD和SL
Set-Location HKLM:
// Get-ChildItem也可以通过其别名调用--Dir和LS
GET-ChildItem
哇!超级简单吧? 现在您只需要知道“挂起重启”位置在哪里。有几个地方需要检查。
HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ WindowsUpdate \ Auto Update \ RebootRequired 通过自动更新安装补丁的位置是否需要重新启动。
HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \基于组件的服务\ RebootPending 是另一个可以识别待重新启动的地方。
HKLM \ SYSTEM \ CurrentControlSet \ Control \ Session Manager 还是另一个。最后,有一个Configuration Manager,如果存在,可以通过WMI查询。
我发现了一个我非常想检查所有四个位置的功能。我需要用一些参数来包装它来检查远程计算机,但总的来说这是一个很好的开始。我已经调整了函数,以便在满足的第一个条件下返回$ true,因为我只关心计算机是否正在等待重启,而不是重新启动源的来源。
function Test-PendingReboot
{
if (Get-ChildItem "HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending" -EA Ignore) { return $true }
if (Get-Item "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired" -EA Ignore) { return $true }
if (Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager" -Name PendingFileRenameOperations -EA Ignore) { return $true }
try {
$util = [wmiclass]"\.\root\ccm\clientsdk:CCM_ClientUtilities"
$status = $util.DetermineIfRebootPending()
if(($status -ne $null) -and $status.RebootPending){
return $true
}
}catch{}
return $false
}