Блог
0 0 голоса
Рейтинг

Журнал событий Windows (Event Log) — ключевой инструмент для мониторинга ошибок, предупреждений и информационных сообщений. Хотя графическая оснастка Просмотр событий (Event Viewer, eventvwr.msc) удобна, PowerShell с командлетом Get-WinEvent предоставляет более гибкие возможности для анализа логов. В этой статье описано, как использовать Get-WinEvent для просмотра, фильтрации и экспорта событий, включая удалённый доступ.

Приобрести оригинальные ключи активации Windows 11 можно у нас в каталоге от 1690 ₽

Почему 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 позволяет автоматизировать анализ, экспортировать данные и быстро находить нужные события, делая его незаменимым для администраторов.

banner for Windows
Лицензионный ключ активации Windows от
1099 ₽ Купить
0 0 голоса
Рейтинг
Подписаться
Уведомить о
guest
0 отзывов
Межтекстовые Отзывы
Посмотреть все комментарии