我想按照其属性在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
时执行此操作?我不想按顺序阅读所有事件,其中有数以万计。
答案 0 :(得分:1)
Vista Event Log API(名称以Evt
开头的函数)不使用EVENTLOGRECORD
结构(PyEventLogRecord
包装的内容),也不使用“新”事件旨在用它代表。 XML格式的字符串实际上 现在是“本地”导出表示而不是某些C结构(这解释了为什么Vista的事件查看器非常缓慢,与XP的对应物不同)。只有使用此API,才能访问Vista引入的“应用程序和服务日志”。
EvtCreateRenderContext
来输出某些字段(pywin32
不支持。它仅支持输出完整的XML)。 pywin32
不包含任何解析XML的工具 - 可能是因为原始API也没有,并且作者不想用不相关的东西来阻碍库。 Wevtapi.dll
不使用完整的XML库,因此它可能只输出一些可以以类似的临时方式解析的XML小子集 - 但这将是一个定时炸弹,因为M $没有保证关于它是什么子集。
我最后用lxml
解析了“this sh1t”。知道了,就像它一样,它是现在的本地代表,让我感觉更好的安装和阻止我的程序与这样一个简单和无关的任务这样一个主要的库。