Я пытаюсь отфильтровать события с помощью Get-WinEvent, чтобы получить определенные журналы за последние 24 часа:
$EventLogFilter = @{logname='ForwardedEvents'; id=4771,4625,4768; StartTime=(Get-Date).AddHours(-24)}
$LogonEvents = Get-WinEvent -FilterHashtable $EventLogFilter
Проблема в том, что Get-WinEvent возвращает только 14 событий, но есть тысячи, которые соответствуют этому критерию.
Пример:
$EventLogFilter = @{logname='ForwardedEvents'; id=4771,4625,4768; StartTime=(Get-Date).AddHours(-24)}
$LogonEvents = (Get-WinEvent -FilterHashtable $EventLogFilter)
$LogonEvents.count
14
Теперь, если я удалю фильтр StartTime из Get-WinEvent и отфильтрую с помощью where-object, вы увидите, сколько из этих событий на самом деле существует:
$EventLogFilter = @{logname='ForwardedEvents'; id=4771,4625,4768}
$LogonEvents = (Get-WinEvent -FilterHashtable $EventLogFilter)
($LogonEvents | ?{$_.TimeCreated -ge (Get-Date).Addhours(-24)}).count
19497
Таким образом, он пропустил почти 20 000 журналов событий! Что, черт возьми, творится, неужели Get-WinEvent не работает? Есть ли ограничение на количество журналов, которые этот cmldet может отфильтровать, прежде чем он сойдет с ума и даст ненадежные результаты?
Кто-то дал мне ответ на другом форуме - на помощь приходит FilterXML.
Следующее дало мне именно то, что я хотел, с дополнительным удобством, позволив графическому интерфейсу создать запрос для меня:
$FilterXML = '<QueryList>
<Query Id="0" Path="ForwardedEvents">
<Select Path="ForwardedEvents">*[System[(EventID=4771 or EventID=4625 or EventID=4768) and TimeCreated[timediff(@SystemTime) <= 86400000]]]</Select>
</Query>
</QueryList>'
$LogonEvents = Get-WinEvent -FilterXml $FilterXML
$LogonEvents | sort -Property TimeCreated | Select-Object -First 1
Выполняя ($ LogonEvents | sort -Property TimeCreated | Select-Object -First 1), я смог подтвердить, что самый старый журнал был создан ровно 24 часа назад.
Надо было больше копаться в документации, потому что я не знал о -filterxml. Думаю, с этого момента я буду им пользоваться.