Поиск компьютеров с ожидающей перезагрузкой через PowerShell

После установки обновлений, патчей безопасности или изменения системных файлов Windows нередко требует перезагрузки, чтобы изменения вступили в силу. Если в инфраструктуре десятки или сотни машин, вручную проверять каждую нереально. В этой статье разберём, как с помощью PowerShell быстро найти все компьютеры, ожидающие перезагрузки, — от одиночного хоста до полного скана домена.
Почему компьютер «застревает» в ожидании перезагрузки
Windows фиксирует состояние «pending reboot» в нескольких местах реестра. Типичные причины:
- Обновления Windows Update — патч установлен, но ядро или системные DLL не заменены до перезапуска.
- Component-Based Servicing (CBS) — установка ролей и компонентов через DISM или Server Manager.
- Переименование компьютера или ввод в домен — смена имени применяется только после перезагрузки.
- Операции переименования файлов (PendingFileRenameOperations) — установщики MSI часто блокируют файлы и регистрируют их замену при следующем старте.
- SCCM / Configuration Manager — агент CM может выставлять собственный флаг перезагрузки.
Если машина долго висит в состоянии «pending reboot», новые патчи могут не устанавливаться, а некоторые приложения работают нестабильно из-за частично обновлённых библиотек.
Ключи реестра, отвечающие за ожидание перезагрузки
Прежде чем писать скрипты, важно понять, что именно проверяется. Windows хранит флаги в следующих ветках реестра:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending— наличие этого ключа означает, что CBS ожидает перезагрузки.HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired— Windows Update требует рестарта.HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations— список файлов, которые нужно переименовать или удалить при загрузке.HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\PostRebootReporting— дополнительный флаг отчётности после перезагрузки.HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerNamevsComputerName— если имена отличаются, требуется рестарт.
PendingFileRenameOperations не всегда означает критическое ожидание — некоторые приложения оставляют там записи при обычной работе. Анализируйте значение ключа, а не только его существование.Быстрая проверка одного компьютера через реестр
Для разовой диагностики локального или удалённого хоста достаточно нескольких команд:
# Проверка флага Windows Update
Get-Item 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired' `
-ErrorAction SilentlyContinue
# Проверка CBS
Get-Item 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending' `
-ErrorAction SilentlyContinue
# Проверка отложенных переименований файлов
$pfro = Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager' `
-Name PendingFileRenameOperations -ErrorAction SilentlyContinue
if ($pfro) { $pfro.PendingFileRenameOperations }
Если команды возвращают результат — машина ожидает перезагрузки. Пустой вывод означает, что флаги отсутствуют.
Установка и использование модуля PendingReboot
Для системной работы удобнее использовать готовый модуль из PowerShell Gallery. Он агрегирует все проверки в одну команду:
# Установка модуля (требуется PowerShell 5.0+)
Install-Module -Name PendingReboot -Scope CurrentUser -Force
# Базовая проверка текущего компьютера
Test-PendingReboot
# Детальный вывод с указанием причины
Test-PendingReboot -Detailed
Вывод -Detailed показывает булевые значения по каждому источнику:
ComputerName : WS-FINANCE-01
ComponentBasedServicing: True
WindowsUpdate : False
PendingComputerRename : False
PendingFileRenameOps : False
IsRebootPending : True
Import-Module.Удалённая проверка через Invoke-Command
Модуль PendingReboot поддерживает удалённые проверки через PowerShell Remoting (WinRM). Сначала убедитесь, что WinRM включён на целевых машинах:
# Включить WinRM на удалённой машине через GPO или вручную
Enable-PSRemoting -Force
# Проверить один удалённый хост
Invoke-Command -ComputerName SRV-APP01 -ScriptBlock {
Import-Module PendingReboot
Test-PendingReboot -Detailed
}
# Проверить список хостов
$servers = 'SRV-DC01','SRV-DC02','SRV-FS01','SRV-APP01'
Invoke-Command -ComputerName $servers -ScriptBlock {
Import-Module PendingReboot
Test-PendingReboot
} | Select-Object PSComputerName, IsRebootPending | Sort-Object IsRebootPending -Descending
-Credential.Скрипт для массового аудита всего домена
Следующий скрипт автоматически получает список компьютеров из Active Directory и проверяет каждый через удалённый реестр — без необходимости устанавливать модули на целевые машины:
# Получаем все активные компьютеры Windows из AD
Import-Module ActiveDirectory
$computers = Get-ADComputer -Filter {
OperatingSystem -like '*Windows*' -and Enabled -eq $true
} -Properties Name | Select-Object -ExpandProperty Name
$results = foreach ($pc in $computers) {
$reboot = $false
$reason = @()
try {
$reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey(
'LocalMachine', $pc)
# Windows Update
$wu = $reg.OpenSubKey(
'SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired')
if ($wu) { $reboot = $true; $reason += 'WindowsUpdate' }
# CBS
$cbs = $reg.OpenSubKey(
'SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending')
if ($cbs) { $reboot = $true; $reason += 'CBS' }
# PendingFileRenameOperations
$sm = $reg.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager')
if ($sm) {
$pfro = $sm.GetValue('PendingFileRenameOperations')
if ($pfro) { $reboot = $true; $reason += 'PendingFileRename' }
}
$reg.Close()
} catch {
$reason += "ERROR: $($_.Exception.Message)"
}
[PSCustomObject]@{
ComputerName = $pc
RebootPending = $reboot
Reason = ($reason -join ', ')
}
}
# Вывод только тех, кто ожидает перезагрузки
$results | Where-Object { $_.RebootPending } |
Format-Table -AutoSize
# Экспорт полного отчёта в CSV
$results | Export-Csv -Path 'C:\Reports\PendingReboot.csv' -Encoding UTF8 -NoTypeInformation
Write-Host "Отчёт сохранён: C:\Reports\PendingReboot.csv"
Принудительная перезагрузка «зависших» машин
Когда список готов, можно запланировать перезагрузку в нерабочее время или выполнить её немедленно:
# Перезагрузить один компьютер с задержкой 60 секунд
Restart-Computer -ComputerName SRV-APP01 -Wait -Delay 60 -Force
# Перезагрузить список компьютеров
$pendingList = @('SRV-FS01','WS-FINANCE-01','WS-HR-05')
Restart-Computer -ComputerName $pendingList -Force -Wait
# Запланировать перезагрузку через shutdown.exe (поддерживается без WinRM)
foreach ($pc in $pendingList) {
shutdown.exe /m "\\$pc" /r /t 3600 /c "Плановая перезагрузка после обновлений" /f
}
Ключ /t 3600 даёт пользователям час до рестарта. Ключ /f принудительно закрывает приложения. Отменить запланированную перезагрузку можно командой shutdown.exe /m \\имя-пк /a.
Мониторинг через Task Scheduler и отчёты на почту
Для регулярного аудита удобно запускать скрипт автоматически и получать отчёт на почту. Пример отправки через встроенный SMTP:
# Сохраните скрипт аудита как C:\Scripts\Get-PendingReboot.ps1
# Затем добавьте блок отправки письма в конец:
$html = $results |
Where-Object { $_.RebootPending } |
ConvertTo-Html -Property ComputerName,Reason `
-Title 'Компьютеры, ожидающие перезагрузки' |
Out-String
$mailParams = @{
SmtpServer = 'mail.company.ru'
From = 'monitoring@company.ru'
To = 'admin@company.ru'
Subject = "[$(Get-Date -Format 'dd.MM.yyyy')] Pending Reboot Report"
Body = $html
BodyAsHtml = $true
}
Send-MailMessage @mailParams
# Создать задачу планировщика — запуск каждый понедельник в 08:00
$action = New-ScheduledTaskAction -Execute 'powershell.exe' `
-Argument '-NonInteractive -File C:\Scripts\Get-PendingReboot.ps1'
$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday -At '08:00'
Register-ScheduledTask -TaskName 'PendingRebootAudit' `
-Action $action -Trigger $trigger -RunLevel Highest `
-Description 'Еженедельный аудит компьютеров, ожидающих перезагрузки'
Альтернатива: проверка через SCCM / ConfigMgr
Если в инфраструктуре развёрнут System Center Configuration Manager, информация о статусе перезагрузки доступна прямо из консоли или через WMI-запрос к базе данных ConfigMgr:
# WMI-запрос к локальному агенту SCCM
$ccm = Get-WmiObject -Namespace 'root\CCM\ClientSDK' `
-Class 'CCM_ClientUtilities' -List
$ccm.DetermineIfRebootPending()
# Запрос через CIM (современный вариант)
$pending = Invoke-CimMethod -Namespace 'root\CCM\ClientSDK' `
-ClassName 'CCM_ClientUtilities' `
-MethodName 'DetermineIfRebootPending'
$pending.RebootPending
$pending.IsHardRebootPending
Метод IsHardRebootPending возвращает True, если ConfigMgr инициировал принудительную перезагрузку — например, после установки обязательного приложения или агента Endpoint Protection.
Итог: выстраиваем процесс Patch Management
Разовая проверка помогает устранить накопившиеся проблемы, но системный подход важнее. Рекомендуем:
- Запускать аудит pending reboot после каждого Patch Tuesday (второй вторник месяца) — через 24–48 часов после деплоя обновлений.
- Настроить Maintenance Windows в WSUS или SCCM, чтобы рестарт происходил автоматически в разрешённое окно.
- Использовать GPO для управления поведением Windows Update: Computer Configuration → Administrative Templates → Windows Components → Windows Update → No auto-restart with logged on users — чтобы машины перезагружались ночью, а не в рабочее время.
- Включать проверку pending reboot в чек-лист после любых плановых работ: установки ролей, обновления драйверов, смены имени компьютера.
- Вести CSV-журнал с историей: какие машины ожидали перезагрузки и как долго — это помогает выявить «проблемные» хосты, которые регулярно игнорируют рестарт.
Официальная документация: Microsoft Learn — Windows Server, Microsoft Learn — PowerShell
Часто задаваемые вопросы
Что такое Поиск компьютеров с ожидающей перезагрузкой через PowerShell?
Поиск компьютеров с ожидающей перезагрузкой через PowerShell — это важный аспект системного администрирования, который позволяет настроить и оптимизировать работу IT-инфраструктуры. В данной статье подробно рассматриваются все ключевые моменты.
Как правильно настроить Поиск компьютеров с ожидающей перезагрузкой через PowerShell?
Для корректной настройки Поиск компьютеров с ожидающей перезагрузкой через PowerShell необходимо следовать пошаговой инструкции, представленной в статье выше. Важно учитывать особенности вашей инфраструктуры и требования безопасности.
Какие типичные ошибки возникают при работе с Поиск компьютеров с ожидающей перезагрузкой через PowerShell?
Наиболее частые ошибки при работе с Поиск компьютеров с ожидающей перезагрузкой через PowerShell: некорректная конфигурация, недостаточные права доступа и несовместимость версий. Рекомендуем обратиться к специалистам ITFresh для профессиональной настройки.
ООО «АйТи Фреш» возьмёт это на себя
Не хватает времени или своих специалистов — мы настроим, оптимизируем и возьмём вашу IT-инфраструктуру на постоянное сопровождение. Работаем с юридическими лицами в Москве и регионах. Собственный дата-центр, команда из 8 серверов Dell Xeon Platinum 8280 на базе МТС.