从win32evtlog.EvtQuery结果中获取事件对象

时间:2015-04-23 15:19:58

标签: python event-log pywin32

我想按照其属性在Windows事件日志中搜索事件。 win32evtlog.EvtQuery看起来就是这样。

所以,我可以,例如查询系统启动事件并检索最后一个,如下所示:

import win32evtlog
hevq=win32evtlog.EvtQuery("System",win32evtlog.EvtQueryReverseDirection,\
        "*[System[Provider[@Name='eventlog'] and (EventID=6009)]]",None)
hev=win32evtlog.EvtNext(hevq,1)[0]

但我得到的是一些随机句柄,我可以根据EvtNext docs将其传递给EvtRender来获取XML表示。

但是,我不想解析它,并希望得到一个好的ol' PyEventLogRecord而不是像win32evtlog.ReadEventLog那样。

有没有办法在使用EvtQuery时执行此操作?我不想按顺序阅读所有事件,其中有数以万计。

1 个答案:

答案 0 :(得分:1)

Vista Event Log API(名称以Evt开头的函数)不使用EVENTLOGRECORD结构(PyEventLogRecord包装的内容),也不使用“新”事件旨在用它代表。 XML格式的字符串实际上 现在是“本地”导出表示而不是某些C结构(这解释了为什么Vista的事件查看器非常缓慢,与XP的对应物不同)。只有使用此API,才能访问Vista引入的“应用程序和服务日志”。

  • XML的唯一替代方法是仅通过首先调用EvtCreateRenderContext来输出某些字段(pywin32不支持。它仅支持输出完整的XML)。

pywin32不包含任何解析XML的工具 - 可能是因为原始API也没有,并且作者不想用不相关的东西来阻碍库。 Wevtapi.dll不使用完整的XML库,因此它可能只输出一些可以以类似的临时方式解析的XML小子集 - 但这将是一个定时炸弹,因为M $没有保证关于它是什么子集。

我最后用lxml解析了“this sh1t”。知道了,就像它一样,它是现在的本地代表,让我感觉更好的安装和阻止我的程序与这样一个简单和无关的任务这样一个主要的库。