PowerShell 24 марта 2026 9 мин чтения
ЕС
Евгений Семёнов
Генеральный директор ООО АйТи Фреш · 15+ лет в IT

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

powershell-pending-reboot-audit

После установки обновлений, патчей безопасности или изменения системных файлов Windows нередко требует перезагрузки, чтобы изменения вступили в силу. Если в инфраструктуре десятки или сотни машин, вручную проверять каждую нереально. В этой статье разберём, как с помощью PowerShell быстро найти все компьютеры, ожидающие перезагрузки, — от одиночного хоста до полного скана домена.

Почему компьютер «застревает» в ожидании перезагрузки

Windows фиксирует состояние «pending reboot» в нескольких местах реестра. Типичные причины:

Если машина долго висит в состоянии «pending reboot», новые патчи могут не устанавливаться, а некоторые приложения работают нестабильно из-за частично обновлённых библиотек.

Ключи реестра, отвечающие за ожидание перезагрузки

Прежде чем писать скрипты, важно понять, что именно проверяется. Windows хранит флаги в следующих ветках реестра:

Наличие ключа 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
Если PowerShell Gallery недоступен из-за корпоративных прокси, скачайте модуль вручную с github.com/bcwilhite/PendingReboot и импортируйте через 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
Для работы Invoke-Command требуется, чтобы брандмауэр разрешал WinRM (TCP 5985/5986) и на обеих сторонах была настроена аутентификация. В рабочей группе (без домена) потребуется явно указывать учётные данные через -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"
Доступ к удалённому реестру требует, чтобы на целевых машинах был запущен сервис Remote Registry (по умолчанию отключён). Включить его массово можно через GPO: Computer Configuration → Windows Settings → Security Settings → System Services → Remote Registry → Automatic.

Принудительная перезагрузка «зависших» машин

Когда список готов, можно запланировать перезагрузку в нерабочее время или выполнить её немедленно:

# Перезагрузить один компьютер с задержкой 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.

Никогда не перезагружайте контроллеры домена одновременно — вы потеряете репликацию и аутентификацию. Рестартуйте DC поочерёдно, дожидаясь полного запуска каждого.

Мониторинг через 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

Разовая проверка помогает устранить накопившиеся проблемы, но системный подход важнее. Рекомендуем:

В крупных организациях рекомендуем разделять перезагрузки по «волнам»: сначала тестовая группа (5–10% парка), затем — пилотные пользователи, и только потом — основная масса. Так снижается риск массового инцидента из-за проблемного обновления.

Официальная документация: Microsoft Learn — Windows Server, Microsoft Learn — PowerShell

Часто задаваемые вопросы

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

Поиск компьютеров с ожидающей перезагрузкой через PowerShell — это важный аспект системного администрирования, который позволяет настроить и оптимизировать работу IT-инфраструктуры. В данной статье подробно рассматриваются все ключевые моменты.

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

Для корректной настройки Поиск компьютеров с ожидающей перезагрузкой через PowerShell необходимо следовать пошаговой инструкции, представленной в статье выше. Важно учитывать особенности вашей инфраструктуры и требования безопасности.

Какие типичные ошибки возникают при работе с Поиск компьютеров с ожидающей перезагрузкой через PowerShell?

Наиболее частые ошибки при работе с Поиск компьютеров с ожидающей перезагрузкой через PowerShell: некорректная конфигурация, недостаточные права доступа и несовместимость версий. Рекомендуем обратиться к специалистам ITFresh для профессиональной настройки.

Нужна помощь специалистов?

ООО «АйТи Фреш» возьмёт это на себя

Не хватает времени или своих специалистов — мы настроим, оптимизируем и возьмём вашу IT-инфраструктуру на постоянное сопровождение. Работаем с юридическими лицами в Москве и регионах. Собственный дата-центр, команда из 8 серверов Dell Xeon Platinum 8280 на базе МТС.

15+лет опыта
25+клиентов
40Gсвоя сеть
24/7поддержка