PowerShell: найти компьютеры ожидающие перезагрузки

При установке некоторых патчей или обновлений безопасности, для их применения требуется перезагрузка 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 модули, можно проверить статус ожидания перезагрузки в реестре. Наличие записей в следующих ветках реестра указывает на необходимость перезапуска:

  • HKLMSOFTWAREMicrosoftWindowsCurrentVersionComponent Based ServicingRebootPending
  • HKLMSOFTWAREMicrosoftWindowsCurrentVersionWindowsUpdateAuto UpdateRebootRequired
  • HKLMSYSTEMCurrentControlSetControlSession ManagerPendingFileRenameOperations
  • HKLMSYSTEMCurrentControlSetControlSession ManagerPendingFileRenameOperations2

Например, можно проверить наличие записи об ожидающей перезагрузке командой:

Get-Item 'HKLM:SOFTWAREMicrosoftWindowsCurrentVersionWindowsUpdateAuto UpdateRebootRequired' -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('SOFTWAREMicrosoftWindowsCurrentVersionComponent Based ServicingRebootPending')
$WU = $HKLM.OpenSubKey('SOFTWAREMicrosoftWindowsCurrentVersionWindowsUpdateAuto UpdateRebootRequired')
$SM = $HKLM.OpenSubKey('SYSTEMCurrentControlSetControlSession 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"

Если из-за какой-то ошибки Windows постоянно требует перезагрузку, этот статус можно отменить вручную.


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *