Журнал событий Windows (Event Log) — ключевой инструмент для мониторинга ошибок, предупреждений и информационных сообщений. Хотя графическая оснастка Просмотр событий (Event Viewer, eventvwr.msc) удобна, PowerShell с командлетом Get-WinEvent предоставляет более гибкие возможности для анализа логов. В этой статье описано, как использовать Get-WinEvent для просмотра, фильтрации и экспорта событий, включая удалённый доступ.
Почему Get-WinEvent?
В Windows доступны два командлета для работы с логами: Get-EventLog и Get-WinEvent. Get-WinEvent предпочтительнее, так как:
– Более производителен, особенно для больших объёмов событий.
– Поддерживает современные версии PowerShell (включая Core 7.x).
– Позволяет использовать сложные фильтры (FilterHashtable, FilterXML).
Get-EventLog устарел и не поддерживается в PowerShell Core.
Основы работы с Get-WinEvent
Запустите PowerShell с правами администратора, так как без них доступ к некоторым логам (например, Security) ограничен.
1. Получите последние события из журнала:
– Выведите 20 последних событий из журнала System:
Get-WinEvent -LogName System -MaxEvents 20
2. Список всех журналов:
Get-WinEvent -ListLog *
3. Примеры работы с конкретными журналами:
– События RDP-подключений:
Get-WinEvent -LogName Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational
– События SSH-подключений:
Get-WinEvent -LogName OpenSSH/Operational
Фильтрация событий
Базовая фильтрация с Where-Object
Получите ошибки и предупреждения за последние 24 часа из журналов System и Application:
$StartDate = (Get-Date) - (New-TimeSpan -Day 1)
Get-WinEvent -LogName Application,System | Where-Object {($_.LevelDisplayName -eq "Error" -or $_.LevelDisplayName -eq "Warning") -and ($_.TimeCreated -ge $StartDate)}
Выберите конкретные поля:
Get-WinEvent -LogName System | Format-Table MachineName, TimeCreated, Id, UserID
Преобразуйте SID в имя пользователя:
Get-WinEvent -FilterHashtable @{LogName = 'System'} | Select-Object @{Name="ComputerName";Expression={$_.MachineName}}, @{Name="UserName";Expression={$_.UserId.Translate([System.Security.Principal.NTAccount]).Value}}, TimeCreated
Быстрая фильтрация с FilterHashtable
FilterHashtable выполняет фильтрацию на стороне службы Event Log, что значительно быстрее, чем Where-Object.
1. Ошибки и предупреждения за 30 дней:
$StartDate = (Get-Date).AddDays(-30)
Get-WinEvent -FilterHashtable @{LogName = 'System','Application'; Level = 2,3; StartTime = $StartDate}
– Level: 2 = Error, 3 = Warning.
2. Сравнение скорости:
$StartDate = (Get-Date).AddDays(-30)
(Measure-Command {Get-WinEvent Application,System | Where-Object {($_.LevelDisplayName -eq "Error" -or $_.LevelDisplayName -eq "Warning") -and ($_.TimeCreated -ge $StartDate)}}).TotalMilliseconds
(Measure-Command {Get-WinEvent -FilterHashtable @{LogName = 'System','Application'; Level = 2,3; StartTime = $StartDate}}).TotalMilliseconds
– FilterHashtable в 30 раз быстрее (2.5 сек против 76 сек).
3. Поиск по EventID (например, перезагрузки, ID 1074):
Get-WinEvent -FilterHashtable @{LogName = 'System'; ID = 1074} | Format-Table TimeCreated, Id, Message
4. Поиск текста в описании:
Get-WinEvent -FilterHashtable @{LogName = 'System'} | Where-Object {$_.Message -like "*USB*"}
5. События за временной диапазон:
Get-WinEvent -FilterHashtable @{LogName = 'System'; StartTime = (Get-Date).AddDays(-7); EndTime = (Get-Date).AddHours(-1); ID = 1234}
Сложные фильтры с FilterXML
Для сложных запросов используйте FilterXML, который также выполняется на стороне сервера.
1. Ошибки и предупреждения за 30 дней:
Скачать код можно с нашего сервера
2. Создание FilterXML через Event Viewer:
– Откройте eventvwr.msc
– Выберите журнал → Фильтр текущего журнала (Filter Current Log).
– Настройте параметры (например, EventID, время, пользователь).
– Перейдите на вкладку XML, скопируйте код (Ctrl+A, Ctrl+C).
– Вставьте в $xmlQuery и отредактируйте при необходимости.
3. Экспорт в CSV:
$Events = Get-WinEvent -FilterXML $xmlQuery
$Events | Export-CSV "C:\PS\FilterSYSEvents.csv" -NoTypeInformation -Encoding UTF8
Получение логов с удалённых компьютеров
1. С одного компьютера:
$computer = 'msk-dc01'
Get-WinEvent -ComputerName $computer -FilterHashtable @{LogName = 'System'; StartTime = (Get-Date).AddHours(-24)} | Select Message, Id, TimeCreated
2. С нескольких компьютеров:
– Из текстового файла:
$servers = Get-Content -Path C:\PS\servers.txt
foreach ($server in $servers) {
Get-WinEvent -ComputerName $server -MaxEvents 5 -FilterHashtable @{LogName = 'System'; ID = 1234} | Select-Object -Property ID, MachineName
}
– Из Active Directory (все серверы):
$servers = (Get-ADComputer -Filter 'OperatingSystem -like "*Windows Server*" -and Enabled -eq "True"').Name
foreach ($server in $servers) {
Get-WinEvent -ComputerName $server -MaxEvents 5 -FilterHashtable @{LogName = 'System'; ID = 1234} | Select-Object -Property ID, MachineName
}
3. Поиск событий блокировки учётной записи:
$Username = 'a.ivanov'
Get-ADDomainController -Filter * | Select-Object -ExpandProperty HostName | ForEach-Object {
$GweParams = @{
'ComputerName' = $_
'LogName' = 'Security'
'FilterXPath' = "*[System[EventID=4740] and EventData[Data[@Name='TargetUserName']='$Username']]"
}
$Events = Get-WinEvent @GweParams
$Events | ForEach-Object {$_.Computer + " " + $_.Properties[1].Value + ' ' + $_.TimeCreated}
}
Устранение неполадок
– Ошибка доступа к журналу:
– Запустите PowerShell с правами администратора.
– Проверьте доступ к журналу (например, Security требует повышенных привилегий).
– Медленное выполнение:
– Используйте FilterHashtable или FilterXML вместо Where-Object.
– Ограничьте количество событий (-MaxEvents).
– Удалённый доступ не работает:
– Убедитесь, что WinRM включён (Enable-PSRemoting).
– Проверьте порт 5985 (Test-NetConnection -ComputerName msk-dc01 -Port 5985).
Рекомендации
– Безопасность: Ограничивайте доступ к журналу Security через GPO.
– Автоматизация: Настройте скрипты для регулярного мониторинга событий:
$Events = Get-WinEvent -FilterHashtable @{LogName = 'System'; Level = 2; StartTime = (Get-Date).AddHours(-1)}
if ($Events) { Send-MailMessage -To "admin@domain.com" -Subject "System Errors" -Body ($Events | Out-String) }
– Резервное копирование: Экспортируйте важные события в CSV или EVTX:
wevtutil epl System C:\PS\SystemLog.evtx
– Производительность: Используйте FilterHashtable или FilterXML для больших логов.
Get-WinEvent в PowerShell — мощный инструмент для анализа журналов событий Windows. Фильтры FilterHashtable и FilterXML обеспечивают высокую производительность, а поддержка удалённого доступа упрощает мониторинг сети. Использование PowerShell позволяет автоматизировать анализ, экспортировать данные и быстро находить нужные события, делая его незаменимым для администраторов.