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

Get an event object from win32evtlog.EvtQuery results

我想按属性在 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, is pass it to EvtRender 得到一个 XML 表示。

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

有没有办法在仍然使用 EvtQuery 的情况下做到这一点?我不想按顺序阅读所有事件,有数以万计的事件。

Vista Event Log API (functions with names starting with Evt) does not use the EVENTLOGRECORD 结构(这是 PyEventLogRecord 包装的内容),"new" 事件也不是为了用它来表示而设计的。 XML 格式的字符串实际上 "native" 导出表示,而不是某些 C 结构(这解释了为什么 Vista 的事件查看器如此缓慢,不像它的 XP对方)。并且只有这个 API 才能访问 Vista 引入的 "Application and Service logs".

  • 唯一替代XML的方法是先调用EvtCreateRenderContext只输出部分字段([=14=不支持)。它只支持输出完整的[=39] =]开箱即用)。

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


我最终用 lxml 解析了 "this sh1t"。知道这一点,尽管它很疯狂,但它现在是本机表示,这让我对安装这样一个主要库并为这样一个简单且无关的任务阻碍我的程序感觉更好。