Типичные симптомы и причины
«Экран приветствия висит минуту, потом ещё минута на "Применяются параметры групповой политики", потом рабочий стол загружается, но ещё 2-3 минуты ничего нельзя сделать.» — такую картину системный администратор видит хотя бы раз в неделю.
Медленный вход в Windows в корпоративной среде — почти никогда не аппаратная проблема. Типичные причины:
- Медленная обработка GPO — слишком много политик, циклическая обработка, скрипты входа с сетевыми запросами
- Недоступный контроллер домена — DNS не резолвит имя DC, DC перегружен, сетевые задержки
- Повреждённый или перемещаемый профиль — загрузка большого профиля с сервера
- Скрипты входа — bat/ps1-скрипты, которые выполняют долгие операции
- User Profile Service — ошибки при создании временного профиля
- Много программ в автозапуске — запускаются одновременно с логоном
Разберём 10 PowerShell команд, которые помогут точно установить причину.
Команды диагностики
Анализ применённых 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 секунд — нашли виновника.
Время применения 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 мс — подозрительно.
Что запускается при входе
# Автозапуск через реестр (текущий пользователь и машина)
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
Первые две команды покажут, что прописано в автозапуске. Третья команда покажет фактическое время старта каждого процесса — процессы, запущенные в первые секунды после логона, могут быть причиной тормозов.
Анализ профилей пользователей через 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: если профили накопились за уволенных сотрудников, это замедляет загрузку списка пользователей.
События 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 фиксирует каждую фазу входа: начало сессии, загрузку профиля, выполнение скриптов. По временным меткам можно вычислить, сколько времени заняла каждая фаза. Разница между соседними событиями в несколько минут — явный признак проблемы в этой фазе.
Проверка достижимости контроллера домена
# Найти контроллер домена
$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 секунд).
Проверка сетевых портов 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) — критичен для аутентификации.
Временные метки профилей пользователей
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 могут принадлежать уволенным сотрудникам.
Скрипты входа через 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) и скриптов входа. Ищите события с большими временными разрывами — они указывают на долго выполняющийся скрипт или программу.
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:
- 1500 — завершение входа в систему (норма)
- 1502 — ошибка выхода пользователя
- 1509 — невозможно скопировать файл в профиль (проблема с правами или местом на диске)
- 1511 — создан временный профиль (серьёзная ошибка, работа пользователя в temp-профиле)
- 1521 — невозможно загрузить профиль (повреждён)
- 1530 — профиль не выгружен при предыдущем выходе
Таблица: симптом → причина → решение
ООО «АйТи Фреш» возьмёт это на себя
Не хватает времени или своих специалистов — мы настроим, оптимизируем и возьмём вашу IT-инфраструктуру на постоянное сопровождение. Работаем с юридическими лицами в Москве и регионах. Собственный дата-центр, команда из 8 серверов Dell Xeon Platinum 8280 на базе МТС.