查询过去两周的Windows事件日志

我试图导出一个Windows事件日志,但限制导出的事件不是根据数量,但根据事件logging的时间。 我正试图在Windows 7和更新。 到目前为止,我的努力都集中在使用wevtutil。

我正在使用wevtutil,现在我的命令行是: wevtutil Application events.evtx这里的问题是我导出整个日志,这可能是相当大的,所以我想限制到最后2周。

我发现这篇文章,但首先它似乎没有在我的系统上产生任何输出(是的,我已经改变了date和时间),其次它似乎取决于我试图避免的date格式。

这里是我跑的修改后的命令:

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

我必须replace&lt;&gt; 与实际的符号,因为我得到了一个语法错误,否则。 这个命令产生空的输出。

我不知道你对PowerShell的感觉如何,但是它可以在你标记的所有系统上使用。

从PowerShell提示中,请参阅Get-Help Get-EventLog示例了解更多信息。

如果必须从.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"} 

问题是由于/ q:在引号内。 它应该在外面,如:

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

这对我来说工作得很好。

我强烈建议使用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 ..." 

对于最近2周的事件,您也可以使用timediff来避免硬编码日期。

Windows使用毫秒,所以它将是1000 * 86400(秒,= 1天)* 14(天)= 1209600000。

对于您的查询,这将看起来像

 wevtutil qe Application /q:"*[System[TimeCreated[timediff(@SystemTime) <= 1209600000]]]" /f:text /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