我正在尝试导出Windows事件日志,但是不是根据数量限制导出的事件,而是根据事件记录的时间限制。我试图在Windows 7和更新版本上这样做。到目前为止,我的工作重点是使用wevtutil。
我正在使用wevtutil,我的命令行现在是:wevtutil Application events.evtx
这里的问题是我导出了整个日志,这可能非常大,所以我想将它限制在最近两周。
我发现了this帖子,但首先它似乎没有在我的系统上产生任何输出(是的,我已经更改了日期和时间),其次它似乎依赖于我的日期格式尽量避免。
这是我运行的修改过的命令:
wevtutil qe Application "/q:*[System[TimeCreated[@SystemTime>='2012-10-02T00:00:00' and @SystemTime<'2012-10-17T00:00:00']]]" /f:text
我必须用实际符号替换<
和>
,否则会出现语法错误。此命令产生空输出。
答案 0 :(得分:13)
问题是由于/ q:在引号内。它应该在外面,如:
wevtutil qe Application /q:"*[System[TimeCreated[@SystemTime>='2012-10-02T00:00:00' and @SystemTime<'2012-10-17T00:00:00']]]" /f:text
这对我来说很好。
答案 1 :(得分:7)
对于过去两周的事件,您还可以使用timediff
,以避免硬编码日期。
Windows使用毫秒,因此它将是1000 * 86400(秒,= 1天)* 14(天)= 1209600000。
对于您的查询,这看起来像
wevtutil qe Application /q:"*[System[TimeCreated[timediff(@SystemTime) <= 1209600000]]]" /f:text /c:1
我添加/c:1
只能在示例中获得1个事件,因为过去两周内发生了很多事件。
您可能还希望仅列出警告和错误。为此,您可以使用(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
答案 2 :(得分:2)
我强烈建议您使用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周前的日期。
您可以通过使用MUL(86400, $days)
替换固定秒数并将命令行更改为此来参数化时间跨度:
logparser -i:evt file:query.sql+days=14
您也可以直接将查询传递给logparser:
logparser -i:evt "SELECT TimeGenerate,EventID,SourceName,Message FROM ..."
答案 3 :(得分:1)
我不知道您对PowerShell的看法,但它可以在您标记的所有系统上使用。
在powershell提示符下,有关详细信息,请参阅Get-Help Get-EventLog -Examples。
如果必须从.cmd或.bat文件执行此操作,则可以调用powershell.exe -File powershell_script_file_name
其中powershell_script_file_name包含您需要的Get-EventLog命令。
此示例提供了所有安全事件日志失败,我用于审计系统:
Get-EventLog -LogName security -newest 1000 | where {$_.entryType -match "Failure"}