При установке некоторых патчей или обновлений безопасности, для их применения требуется перезагрузка Windows. Однако, если пользователь постоянно откладывает перезагрузку или вы отключили автоматическую перезагрузку на серверах/рабочих станциях после установки обновления (например, через групповую политику Windows Update), в могут остаться хосты, которые установили обновления, но фактически не применили их, ожидая перезагрузки. В больших сетях часто можно найти десятки устройств, которые висят в статусе PendingReboot неделями. Рассмотрим, как найти в сети компьютеры, которые ожидают перезагрузку после установки обновлений.
В нашем случае есть Windows Server, который завершил установку обновлений, но фактически не был перезагружен, отображая в панели управления Windows Update статус Pending Restart.

Для проверки статуса ожидающей перезагрузки можно воспользоваться готовым модулем PendingReboot из PowerShell Gallery. Чтобы установить этот PowerShell модуль, выполните команду:
Install-Module -Name PendingReboot
Проверить, требует ли компьютер перезагрузки:
Test-PendingReboot
IsRebootPending: True

С помощью опции Detailed командлет может вывести дополнительную информацию, указывающие на причину ожидания перезагрузки (установка обновлений, добавление в домен, установка/удаление компонентов).
Test-PendingReboot -Detailed

ComponentBasedServicing : True PendingComputerRenameDomainJoin : False PendingFileRenameOperations : False PendingFileRenameOperationsValue : SystemCenterConfigManager : WindowsUpdateAutoUpdate : True IsRebootPending : True
Через PowerShell Remoting можно проверить, нужна ли перезагрузка на удаленном компьютере:
Invoke-Command -ComputerName s-dc01 -ScriptBlock {Test-PendingReboot}
Если вы не хотите устанавливать дополнительные PowerShell модули, можно проверить статус ожидания перезагрузки в реестре. Наличие записей в следующих ветках реестра указывает на необходимость перезапуска:
-
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending -
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired -
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations -
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations2
Например, можно проверить наличие записи об ожидающей перезагрузке командой:
Get-Item 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired' -ErrorAction SilentlyContinue

Наличие параметра в ветке RebootRequired указывает, что хосту нужна перезагрузка.

Ниже показан пример PowerShell функции, которая позволяет проверить наличие параметров в этих ветках реестра.
function Get-PendingReboot {
param([string[]]$ComputerName = "localhost")
foreach ($Computer in $ComputerName) {
$HKLM = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $Computer)
$CBS = $HKLM.OpenSubKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending')
$WU = $HKLM.OpenSubKey('SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired')
$SM = $HKLM.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager')
$Rename = $SM.GetValue('PendingFileRenameOperations')
$Rename2 = $SM.GetValue('PendingFileRenameOperations2')
[PSCustomObject]@{
Computer = $Computer
RebootNeeded = [bool]($CBS -or $WU -or $Rename -or $Rename2)
}
}
}
Такая функция позволит проверить, требует ли перезагрузки локальный компьютер. Также можно проверить этот статус сразу на нескольких удаленных системах:
Get-PendingReboot "s-fs01","s-dc01","s-dc02","s-dc03"


