Как использовать Get-WinEvent для получения всей информации за определенный период времени?

Вопрос или проблема

Некоторая предыстория

Я сталкиваюсь с проблемами зависаний и сбоев, которые хочу лучше понять. Для этого мне нужно исследовать всю доступную информацию о событиях и журналах за определенный период времени.

Я очень хорошо знаю когда произошло что-то плохое, но не почему.
Например, я хотел бы получить всю потенциально релевантную информацию за определенный день в пределах 15 минут, скажем, с “26-11-2021 15:00” до “26-11-2021 15:15”.

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

Затем я узнал о PowerShell (запущенном от имени администратора) и инструменте Get-WinEvent. Однако я запутался в документации и не смог достичь своей основной цели:

Как я могу создать ‘фильтрованный’ текстовый файл со всеми (релевантными) записями журнала за определенный период времени?

После долгого поиска в интернете я нашел частичное решение своей проблемы, скопировав и вставив одну строку, которую нашел:
введите описание изображения здесь

Get-WinEvent -ListLog * | % {Get-WinEvent -FilterHashTable @{LogName=$_.LogName;StartTime="26-11-2021 15:00";EndTime="26-11-2021 15:15"; Level=(1,2,3) } -ea 0} | sort timecreated -des >> C:\temp\events.txt

Это полезно, но не понимая синтаксиса, я заметил два недостатка:

  • Записи в журнале иногда обрезаются, например:
    введите описание изображения здесь

  • Похоже, я не охватываю все записи. В частности, я знаю, что в определенный период произошел перезапуск системы, который должен появиться в Просмотрщике событий как критическое/ошибочное событие:
    пункт списка
    Но я не могу найти это в сгенерированном текстовом выводе за тот же период времени.

Поэтому это заставило меня подумать, что я все еще не нашел лучший способ достичь желаемого.
Буду признателен за любую помощь.

Я использовал передачу вывода в ‘Out-String’, а затем играл с шириной, чтобы получить желаемую видимость. Надеюсь, это поможет.

Ответ или решение

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

Понимание контекста

Вы столкнулись с проблемами зависаний и сбоев, и хотите проанализировать события, произошедшие в определённый период времени — с 26 ноября 2021 года, 15:00 до 26 ноября 2021 года, 15:15. Использование встроенного средств просмотра событий Windows не дало вам нужных результатов, поэтому вы обратились к PowerShell и Get-WinEvent.

Цели и задачи

Основная задача — извлечь все соответствующие записи событий за указанный промежуток времени и сохранить их в текстовом файле. При этом важно учитывать:

  • Чтение событий из всех журналов;
  • Извлечение полной информации, чтобы избежать обрезки данных;
  • Учёт записей, относящихся к критическим ошибкам, включая системную перезагрузку.

Как использовать Get-WinEvent

Сначала убедитесь, что вы запустили PowerShell от имени администратора. Это обеспечит доступ к необходимым журналам событий. Вот пример кода, который поможет вам извлечь нужные записи:

$startTime = Get-Date "2021-11-26 15:00"
$endTime = Get-Date "2021-11-26 15:15"
$logNames = Get-WinEvent -ListLog * | Select-Object -ExpandProperty LogName

foreach ($logName in $logNames) {
    Get-WinEvent -LogName $logName -FilterHashtable @{ StartTime = $startTime; EndTime = $endTime } -ErrorAction SilentlyContinue |
    Select-Object TimeCreated, Id, LevelDisplayName, Message |
    Format-Table -AutoSize |
    Out-File -Append C:\temp\events.txt
}

Объяснение кода

  1. Переменные времени: Используются переменные для хранения времени начала и окончания, что упрощает их использование.
  2. Получение всех имен журналов: Вызывает команду Get-WinEvent -ListLog * для получения всех журналов событий в системе.
  3. Цикл и фильтрация: Для каждого журнала событий выполняется Get-WinEvent с использованием хэш-таблицы фильтров, что позволяет ограничить выборку событиями, которые произошли в указанный период времени. -ErrorAction SilentlyContinue предотвращает вывод сообщений об ошибках, если журнал пуст.
  4. Форматирование вывода: Выводимые события форматируются для удобства просмотра и записываются в файл events.txt. Это предотвращает обрезку сообщений.

Улучшение видимости данных

Чтобы избежать обрезки текстовых данных, можно использовать настройки ширины вывода. Например, вы можете использовать Out-String -Width 250, чтобы задать ширину строки. Это может выглядеть как:

| Out-String -Width 250 -Stream | Out-File -Append C:\temp\events.txt

Рекомендации по отладке

Если пропускаются критические события, убедитесь, что журнал, в котором они хранятся, действительно обрабатывается. Вы можете добавить фильтрацию по уровням критичности, чтобы увидеть только критические и ошибки:

$levels = 1, 2, 3  # Critical, Error, Warning

Заключение

Используя Get-WinEvent, вы можете эффективно проанализировать события за заданный период и получить всю нужную информацию в формате, удобном для дальнейшей работы. Убедитесь, что вы экспериментируете с фильтрами и форматами, чтобы получать наиболее полные данные. Надеюсь, это поможет вам в расследовании проблем с системой. Если у вас появятся дополнительные вопросы, не стесняйтесь обращаться за поддержкой.

Оцените материал
Добавить комментарий

Капча загружается...