Полное руководство по использованию командлета PowerShell Get-WinEvent

Windows имеет несколько различных журналов событий, но как быстро их получить? Cmdlet Get-WinEvent может получить классические журналы событий Windows, такие как системные и приложений, журналы, созданные технологией журнала событий Windows, а также журналы слежения за событиями для Windows (ETW)!

В этой статье вы узнаете, как использовать Get-WinEvent для извлечения и фильтрации событий из журналов событий!

Предварительные требования

Для продолжения вам нужна только текущая версия Windows 10 и PowerShell 5.1 и выше. В этой статье используются Windows 10 и PowerShell 7.1.

Перечисление доступных журналов с Get-WinEvent

Трудно знать, какие записи журнала вам могут понадобиться, не зная всех доступных журналов. С помощью Get-WinEvent вы можете быстро перечислить все доступные журналы, используя параметр -ListLog. Значение параметра * говорит Get-WinEvent перечислить все журналы без фильтрации. Как показано ниже, все журналы извлекаются, но только ограниченный набор свойств показан с использованием Select-Object cmdlet.

Get-WinEvent -ListLog * | Select-Object LogName, RecordCount, IsClassicLog, IsEnabled, LogMode, LogType | Format-Table -AutoSize

Не все журналы включены по умолчанию. Вам может потребоваться открыть “Просмотр событий”, найти журнал и щелкнуть правой кнопкой мыши, чтобы Включить журнал перед тем, как события начнут отображаться.

Listing all available event logs.

Все журналы, начиная с Windows Vista, сохраняются в файлах *.evtx, а не в старом формате *.evt. Свойство IsClassicLog указывает, определены ли события журнала в файле сообщений, формате Message File *.mc, или в формате манифеста *.xml.

Интересное свойство – LogMode, которое вы, возможно, заметили, обычно устанавливается в значение Circular.

  • Circular – Перезаписывать старую запись журнала, когда он заполнен.
  • Retain – Сохранять все события, пока журнал не заполнится, и приостановить запись до освобождения места.
  • AutoBackup – Автоматически создавать резервные копии и архивировать журналы событий по мере заполнения.
Highlighting the LogMode property.

Наконец, если посмотреть на свойство LogType, то существует несколько различных типов журналов. Это свойство скорее служит для категоризации, но обычно оно информирует о том, как используется журнал и какие типы событий отображаются.

  • Административный – В первую очередь предназначен для конечных пользователей и административных пользователей.
  • Аналитический – Обычно представляет собой журнал высокого объема, предназначенный для описания операций программы.
  • Отладка – Предназначен для разработчиков, нуждающихся в глубоком погружении во внутренности программы.
  • Эксплуатационный – Событие, происходящее во время работы, полезное для диагностики событий и запуска процессов.
Highlighting the LogType property.

Перечисление поставщиков журнала событий

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

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

Возможно, вам захочется находить проблемы при фильтрации журналов, и вас может интересовать только информация о конкретном поставщике. Чтобы просмотреть доступные поставщики, используйте параметр -ListProvider. Как показано ниже, * перечисляет все доступные поставщики и к каким журналам они привязаны, таким как Windows PowerShell или System.

Get-WinEvent -ListProvider * | Format-Table -Autosize
Listing event log providers.

Возможно, вам стоит перечислить только те поставщики, которые доступны для конкретного журнала, например, System. Для этого вы можете фильтровать события, используя команду Where-Object, используя значения свойства LogLinks. Свойство LogLinks отображает связанные журналы событий в виде списка.

Для фильтрации запрашиваемых журналов с использованием Where-Object используйте оператор сравнения -In, чтобы фильтровать только те события, где в значении свойства LogLinks есть System. Наконец, использование Format-Table -AutoSize облегчит восприятие вывода, как показано ниже.

Get-WinEvent -ListProvider * | Where-Object { 'System' -In ($_ | Select-Object -ExpandProperty Loglinks | Select-Object -ExpandProperty Logname) } | Format-Table -AutoSize
Filtering event log providers to a specific log.

Получение классических журналов событий с помощью Get-WinEvent

Первым шагом в устранении проблемы с Windows является получение журнала приложений или системы, который является классическими журналами событий. В приведенном ниже примере вы получите первые 100 событий, используя параметр -MaxEvents журнала событий приложений.

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

Get-WinEvent -LogName 'Application' -MaxEvents 100 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Returning events from the Application log.

Нахождение современных событий Windows с помощью Get-WinEvent

Теперь, когда вы получили события из классического журнала приложений, что насчет результатов из более нового журнала событий Windows, такого как Microsoft-Windows-WindowsUpdateClient/Operational?

В отличие от классического журнала событий, такого как System, Microsoft-Windows-WindowsUpdateClient/Operational является современным журналом, с которым Get-WinEvent работает так же, как указано ниже.

Get-WinEvent -LogName 'Microsoft-Windows-WindowsUpdateClient/Operational' -MaxEvents 10 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Returning Windows Event Log records.

А как насчет получения только старейших событий? Хотя вы можете изменить порядок результатов с помощью Sort-Object, используйте параметр -Oldest, чтобы получить первые 10 событий, как показано ниже.

Команда Get-WinEvent фильтрует результаты для вас, а не возвращает все результаты и не сортирует их, что typic с медленнее.

Get-WinEvent -LogName 'Microsoft-Windows-WindowsUpdateClient/Operational' -Oldest -MaxEvents 10 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Returning only the oldest events in a Windows Event Log.

Получение файлов слежения за событиями Windows (ETW) с помощью Get-WinEvent

Возможно, у вас есть экспортированный файл *.evtx с другого компьютера или вы сделали резервную копию существующего журнала. Вы можете прочитать эти журналы с помощью средства Get-WinEvent. Если вам нужно сохранять журналы для целей аудита, Get-WinEvent – отличный способ быстро запрашивать эти журналы с помощью стандартных командлетов в сценариях.

Чтобы продемонстрировать получение записей журнала из файла *.evtx, вам потребуется экспортированный файл журнала.

1. Откройте Просмотр событий и перейдите к журналу. В этом примере выберите журнал Приложения и сервисные журналы → PowerShell Windows.

Navigate to a Windows Event Viewer log.

2. Затем нажмите на пункт меню Сохранить все события как… в разделе Действия.

Save the log file.

3. Сохраните файл в месте на диске, чтобы его можно было получить с помощью команды Get-WinEvent.

Choose a location to save the log file.

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

Get-WinEvent -Path 'C:\Articles\WindowsPowerShell.evtx' -MaxEvents 10 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Retrieving specific events from the exported event file.

Фильтрация журналов событий Windows с использованием Get-WinEvent

Хотя вы можете фильтровать журналы с помощью стандартной команды Where-Object, Get-WinEvent предлагает встроенные фильтры. При возврате всех результатов и последующем фильтровании выполняется больше работы, чем необходимо. Вместо этого всегда старайтесь фильтровать источник настолько, насколько это возможно.

Команда Get-WinEvent предоставляет три параметра, помогающих вам фильтровать тысячи событий, называемые -FilterHashTable, -FilterXPath и -FilterXML. Каждый параметр в основном выполняет ту же задачу, просто по-разному.

Фильтрация журналов событий с помощью FilterHashTable

-FilterHashTable параметр фильтрует контент на основе совпадающих свойств, таких как LogName. Вместо использования параметра -LogName для фильтрации по конкретному журналу, вы можете использовать хэш-таблицу, такую как @{'LogName' = 'Application'}, которая соответствует свойству события LogName.

Приведенный ниже пример предоставляет хэш-таблицу параметру -FilterHashTable, которая ищет только журнал Application и с временем начиная с полуночи текущего дня возвращает результаты событий сразу после полуночи.

Get-WinEvent -FilterHashTable @{'LogName' = 'Application'; 'StartTime' = (Get-Date -Hour 0 -Minute 0 -Second 0)} | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Filtering events with the FilterHashTable parameter.

Сравните скорость фильтрации того же самого команды выше с использованием параметра -FilterHashTable с фильтрацией через Where-Object на конвейере. Как видно, команда, использующая Where-Object, намного медленнее, чем та, которая использует параметр -FilterHashTable.

Comparing filtering with FilterHashTable and Where-Object.

Фильтрация журналов событий с использованием параметра FilterXPath

Записи журналов событий хранятся в виде файлов XML, и поэтому вы можете использовать язык XPath, язык запросов XML, для фильтрации записей журнала. Выполняя ту же команду, что и выше, и переводя ее в XPath, можно достичь тех же результатов.

Для создания запроса XPath используйте возможность фильтрации в Windows Event Viewer, как показано ниже.

1. Откройте Event Viewer и перейдите в журнал, например, в журнал Windows Logs → Application.

Opening the Windows Event Viewer.

2. Затем щелкните по ссылке “Фильтр текущего журнала” в правой панели.

Choosing to Filter the Current Log.

3. Введите параметры, которые вы хотите использовать для фильтрации журнала.

Creating a filter for the current log.

4. Щелкните по вкладке XML и скопируйте раздел, содержащийся внутри тега Select.

Copying the XPath command.

5. Теперь скопируйте и вставьте скопированное содержимое с параметром -FilterXPath. Теперь вы можете видеть ниже, что используя синтаксис XPath, найденный в просмотрщике журналов событий, вы можете создать запрос для фильтрации только необходимой информации.

Get-WinEvent -LogName 'Application' -FilterXPath "*[System[(Level=1  or Level=3)]]" | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Demonstrating the use of the FilterXPath parameter.

Погружение в то, как создавать запросы XPath, выходит за рамки данной статьи, но основной формат показан ниже. Когда параметр FilterXPath фильтрует дату, вы увидите одно большое отличие: вам нужно использовать более конкретный формат даты, yyyy-MM-ddTHH:mm:ss.fffZ, который должен возвращаться в формате UTC, что отмечается переключателем -AsUTC.

Get-WinEvent -LogName 'Application' -FilterXPath "*[System[TimeCreated[@SystemTime >= '$(Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0 -Format "yyyy-MM-ddTHH:mm:ss.fffZ" -AsUTC)']]]" | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Filtering events using XPath.

Фильтрация результатов журнала событий с помощью FilterXML

Наконец, последний доступный параметр фильтрации – это параметр -FilterXML. В отличие от параметров -FilterXPath и -FilterHashTable, этот параметр принимает XML, который затем используется для фильтрации событий. Параметр -FilterXML позволяет использовать более сложные правила и, как показано ниже, может воспроизводить предыдущие примеры фильтрации.

Как показано в предыдущем примере, вы можете получить предварительно отформатированный запрос из возможности Просмотр событий → Фильтр текущего журнала. Вместо того чтобы выбирать только содержимое в узле Select, вы будете использовать весь запрос. Фактических фильтров не выбрано, как указано знаком * в узле Select. Это обеспечит общую разметку для следующего примера.

Selecting the entire XML query from Filter Current Log in the Event Viewer.

Вместо создания однострочной команды сначала разделите XML-запрос и присвойте разметку переменной $Query, как показано в примере ниже. Присваивание запроса переменной обеспечивает лучшую удобство использования и читаемость. Затем передайте переменную $Query параметру -FilterXML команды Get-WinEvent.

Как показано ниже, вы видите результаты более сложного запроса, возвращающего все события с того дня и сохраненные в журнале Приложение.

$Query = "<QueryList>
  <Query Id='0' Path='Application'>
    <Select Path='Application'>*[System[TimeCreated[@SystemTime >= '$(Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0 -Format "yyyy-MM-ddTHH:mm:ss.fffZ" -AsUTC)']]]</Select>
  </Query>
</QueryList>"

Get-WinEvent -FilterXML $Query | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Showing how FilterXML works.

Заключение

Командлет Get-WinEvent быстро справляется с запросом нескольких источников журналов событий с мощными возможностями фильтрации. От аудита до решения проблем, командлет Get-WinEvent является важным дополнением к арсеналу системных администраторов!

Source:
https://adamtheautomator.com/get-winevent/