Самый эффективный способ поиска сообщений журнала событий - PullRequest
1 голос
/ 18 февраля 2020

Предположим, я хочу найти самое новое вхождение события 4688, которое содержит строку 0x1278. Я могу найти событие, получив определенное количество событий, а затем выполнив поиск по этой строке:

Get-WinEvent -MaxEvents 1000 -FilterHashTable @{LogName="Security";Id=4688} | Where-Object {$_.Message -match "0x1278"}

При таком подходе есть две проблемы:

  1. Сценарий должен всегда ожидать 1000 событий, которые будут возвращены, даже если искомое событие было с индексом 3.
  2. Если событие было старше и было бы с индексом 1034, было проверено слишком мало событий, и оно не было Не найдено, когда это должно было быть.

Есть ли способ решить эти проблемы? В идеале событие должно быть найдено в кратчайшие сроки.

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

Используйте -FilterXPath для разгрузки фильтрации в службу журнала событий!

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

Предполагая, что вы ищете 0x1278, поскольку это событие с идентификатором процесса, мы можем запросить это конкретное c событие со следующим выражением XPath:

*[System[EventID=4688] and EventData[Data[@Name='NewProcessId']='0x3e8']]

Используется с Get-WinEvent, в результате получается что-то вроде:

Get-WinEvent -MaxEvents 1000 -FilterXPath "*[System[EventID=4688] and EventData[Data[@Name='NewProcessId']='0x3e8']]" -LogName "Security"

Теперь службе событий только нужно вернуть одно событие , в результате чего ваш запрос Get-WinEvent будет выполняться много быстрее

1 голос
/ 18 февраля 2020

Вместо того, чтобы передать массив событий в Where-Object, передать его в ForEach-Object, назначить первое совпадение переменной, а затем выйти из l oop. Если вы удалите параметр -MaxEvents, все события будут искать до тех пор, пока не будет найдено совпадение или больше не будет событий:

PS C:\WINDOWS\system32> Get-WinEvent -FilterHashTable @{LogName="Security";id=4688} | ForEach-Object {if ($_.Message -match "0x1278") {$result = $_; break;}}
PS C:\WINDOWS\system32> $result


   ProviderName: Microsoft-Windows-Security-Auditing

TimeCreated                     Id LevelDisplayName Message
-----------                     -- ---------------- -------
2/18/2020 10:14:55 AM         4688 Information      A new process has been created....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...