Запрос журнала событий Windows за последние две недели

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

Я использую wevtutil, и теперь моя командная строка:wevtutil Application events.evtx проблема здесь в том, что я экспортирую весь журнал, и это может быть довольно большим, поэтому я хочу ограничить его только последними 2 неделями.

Я нашел этой post, но, во-первых, он, похоже, не производит никакого вывода в моей системе(да, я изменил даты и время), а во-вторых, он, похоже, зависит от формата даты, которого я пытаюсь избежать.

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

wevtutil qe Application "/q:*[System[TimeCreated[@SystemTime>='2012-10-02T00:00:00' and @SystemTime<'2012-10-17T00:00:00']]]" /f:text

мне пришлось заменить &lt; и &gt; с фактическими символами, поскольку я получил синтаксическую ошибку в противном случае. Эта команда создает пустой вывод.

4 ответов


Я не знаю, как вы относитесь к PowerShell, но он доступен во всех системах, которые вы пометили.

в командной строке powershell см. Get-Help Get-EventLog-Examples для получения дополнительной информации.

Если вам нужно сделать это .cmd или .файл bat, затем вы можете вызвать powershell.exe-файл powershell_script_file_name

где powershell_script_file_name имеет команду Get-EventLog вам нужно в нем.

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

Get-EventLog -LogName security -newest 1000 | where {$_.entryType -match "Failure"}

проблема связана с /q: быть внутри кавычек. Он должен быть снаружи, как:

wevtutil qe Application /q:"*[System[TimeCreated[@SystemTime>='2012-10-02T00:00:00' and @SystemTime<'2012-10-17T00:00:00']]]" /f:text

это работает просто отлично для меня.


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

Windows использует миллисекунды, поэтому это будет 1000 * 86400 (секунды, = 1 день) * 14 (дни) = 1209600000.

для вашего запроса это будет выглядеть как

wevtutil qe Application /q:"*[System[TimeCreated[timediff(@SystemTime) <= 1209600000]]]" /f:text /c:1

добавил /c:1 чтобы получить только 1 событие в Примере, так как есть много событий за последние 2 недели.

вы можете также хотеть только список предупреждений и ошибок. Для этого вы можете использовать (Level=2 or Level=3). (По какой-то причине Level<4 похоже, не работает для меня на Win7)

wevtutil qe Application /q:"*[System[(Level=2 or Level=3) and TimeCreated[timediff(@SystemTime) <= 1209600000]]]" /f:text /c:1

я настоятельно рекомендую использовать LogParser для такого рода задач:

logparser -i:evt file:query.sql

С query.sql содержащий что-то вроде этого:

SELECT
  TimeGenerated,EventID,SourceName,Message
FROM Application
WHERE TimeGenerated > TO_TIMESTAMP(SUB(TO_INT(SYSTEM_TIMESTAMP()), 1209600))
ORDER BY TimeGenerated DESC

несколько нелогично расчет даты преобразует системное время (SYSTEM_TIMESTAMP()) в целое число (TO_INT()), вычитает 1209600 секунд (60 * 60 * 24 * 14 = 2 недель) и преобразует результат в метку времени (TO_TIMESTAMP()), таким образом, производя дату от 2 недель назад.

вы можете параметризовать timespan, заменив фиксированное количество секунд на MUL(86400, $days) и изменение командной строки на это:

logparser -i:evt file:query.sql+days=14

вы также можете передать запрос непосредственно в logparser:

logparser -i:evt "SELECT TimeGenerate,EventID,SourceName,Message FROM ..."