PowerShell диагностика Windows
Windows  ·  Active Directory

Диагностика медленного входа в Windows:
10 PowerShell команд

Пользователи жалуются на долгий логон? Разбираемся системно: GPO, профили, контроллер домена — находим виновника за минуты

Автор: Семёнов Евгений Сергеевич
Дата: 23 марта 2026
Время чтения: ~13 минут
Windows login authentication diagnostics

Типичные симптомы и причины

«Экран приветствия висит минуту, потом ещё минута на "Применяются параметры групповой политики", потом рабочий стол загружается, но ещё 2-3 минуты ничего нельзя сделать.» — такую картину системный администратор видит хотя бы раз в неделю.

Медленный вход в Windows в корпоративной среде — почти никогда не аппаратная проблема. Типичные причины:

Разберём 10 PowerShell команд, которые помогут точно установить причину.

Команды диагностики

Команда 01

Анализ применённых GPO

# Запустить от имени администратора
gpresult /h C:\Temp\GPO_Report.html /f
Start-Process C:\Temp\GPO_Report.html

Это не PowerShell в строгом смысле, но запускается из PS без проблем. Генерирует полный HTML-отчёт о применённых политиках. Откройте отчёт и ищите секцию «Computer Configuration» — там отображается время применения каждой политики в миллисекундах. Если какое-то расширение CSE (Client-Side Extension) обрабатывалось 30–60 секунд — нашли виновника.

Команда 02

Время применения GPO через журнал событий

Get-WinEvent -LogName "Microsoft-Windows-GroupPolicy/Operational" |
    Where-Object { $_.Id -eq 5312 } |
    Select-Object TimeCreated, Message |
    Sort-Object TimeCreated -Descending |
    Select-Object -First 20 |
    Format-List

Event ID 5312 фиксирует завершение применения групповой политики. В поле Message указан список CSE и время их обработки. Ищите строки вида Extension <name> took <N> milliseconds. Всё, что выше 5000 мс — подозрительно.

Команда 03

Что запускается при входе

# Автозапуск через реестр (текущий пользователь и машина)
Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" |
    Select-Object * -ExcludeProperty PS*

Get-ItemProperty -Path "HKLM:\Software\Microsoft\Windows\CurrentVersion\Run" |
    Select-Object * -ExcludeProperty PS*

# Запущенные процессы с временем старта
Get-Process | Sort-Object StartTime -ErrorAction SilentlyContinue |
    Select-Object Name, Id, CPU, StartTime |
    Where-Object { $_.StartTime -ne $null } |
    Format-Table -AutoSize

Первые две команды покажут, что прописано в автозапуске. Третья команда покажет фактическое время старта каждого процесса — процессы, запущенные в первые секунды после логона, могут быть причиной тормозов.

Команда 04

Анализ профилей пользователей через WMI

Get-WmiObject -Class Win32_UserProfile |
    Select-Object LocalPath, LastUseTime, Status, Special |
    Sort-Object LastUseTime -Descending |
    Format-Table -AutoSize

Колонка Status — ключевая. Значения: 0 — нормально, 1 — временный профиль, 2 — перемещаемый профиль роуминга, 4 — мандатный профиль. Если Status содержит флаг 8 (0x8) — профиль повреждён. Также смотрите на LocalPath: если профили накопились за уволенных сотрудников, это замедляет загрузку списка пользователей.

Команда 05

События Winlogon

Get-WinEvent -LogName "Microsoft-Windows-Winlogon/Operational" |
    Select-Object TimeCreated, Id, Message |
    Sort-Object TimeCreated -Descending |
    Select-Object -First 30 |
    Format-List

Winlogon/Operational фиксирует каждую фазу входа: начало сессии, загрузку профиля, выполнение скриптов. По временным меткам можно вычислить, сколько времени заняла каждая фаза. Разница между соседними событиями в несколько минут — явный признак проблемы в этой фазе.

Команда 06

Проверка достижимости контроллера домена

# Найти контроллер домена
$domain = (Get-WmiObject Win32_ComputerSystem).Domain
nltest /dsgetdc:$domain

# Пинг DC
$dc = (nltest /dsgetdc:$domain | Select-String "DC:").ToString().Trim() -replace "DC: \\",""
Test-Connection -ComputerName $dc.Trim('\') -Count 4

Если nltest возвращает ошибку или задержки выше 50 мс — проблема в сети или DNS. Важно: Windows при логоне обязательно обращается к DC для получения токена Kerberos. Если DC недоступен, вход затягивается на таймаут (обычно 30–45 секунд).

Команда 07

Проверка сетевых портов DC

$dc = "DC01"  # замените на имя вашего DC

# LDAP
Test-NetConnection $dc -Port 389

# SMB (для SYSVOL с GPO)
Test-NetConnection $dc -Port 445

# Kerberos
Test-NetConnection $dc -Port 88

# Global Catalog
Test-NetConnection $dc -Port 3268

Все четыре порта должны отвечать TcpTestSucceeded: True. Если порт 445 недоступен — Windows не сможет скачать содержимое SYSVOL, а значит, политики и скрипты входа не применятся (или применятся с задержкой из кэша). Порт 88 (Kerberos) — критичен для аутентификации.

Команда 08

Временные метки профилей пользователей

Get-ChildItem -Path "C:\Users" -Directory |
    Select-Object Name, CreationTime, LastWriteTime,
        @{N="SizeMB";E={
            [math]::Round((Get-ChildItem $_.FullName -Recurse -ErrorAction SilentlyContinue |
            Measure-Object -Property Length -Sum).Sum / 1MB, 1)
        }} |
    Sort-Object SizeMB -Descending |
    Format-Table -AutoSize

Эта команда показывает размер каждого профиля. Профили больше 2–3 ГБ — потенциальная проблема, особенно если это перемещаемые профили (загружаются с сервера при каждом входе). Профили с давней датой LastWriteTime могут принадлежать уволенным сотрудникам.

Команда 09

Скрипты входа через Shell-Core журнал

Get-WinEvent -LogName "Microsoft-Windows-Shell-Core/Operational" -ErrorAction SilentlyContinue |
    Where-Object { $_.Message -match "script|startup|logon" -and $_.TimeCreated -gt (Get-Date).AddDays(-1) } |
    Select-Object TimeCreated, Id, Message |
    Sort-Object TimeCreated |
    Format-List

Shell-Core/Operational записывает события выполнения программ из автозапуска (Run, RunOnce) и скриптов входа. Ищите события с большими временными разрывами — они указывают на долго выполняющийся скрипт или программу.

Команда 10

User Profile Service — ключевые ошибки

Get-WinEvent -LogName "Application" |
    Where-Object { $_.ProviderName -eq "Microsoft-Windows-User Profiles Service" } |
    Where-Object { $_.Id -in @(1500, 1502, 1509, 1511, 1521, 1530, 1534) } |
    Select-Object TimeCreated, Id, Message |
    Sort-Object TimeCreated -Descending |
    Select-Object -First 20 |
    Format-List

Расшифровка Event ID:

Таблица: симптом → причина → решение

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

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

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

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

ООО АЙ-ТИ Фреш  ·  Москва  ·  itfresh.ru