Запрос журнала событий 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
мне пришлось заменить <
и >
с фактическими символами, поскольку я получил синтаксическую ошибку в противном случае. Эта команда создает пустой вывод.
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 ..."