从win32获取事件对象evtlog.EvtQuery结果

2024-10-01 00:17:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我想按属性在Windows事件日志中搜索事件。 ^{}看起来很像。在

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

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

但是我得到的是一些随机句柄,根据^{} docs,我所能做的就是将它传递给^{}以获得XML表示。在

但是,我不想解析它,而是想得到一个很好的ol'PyEventLogRecord,就像我对^{}所做的那样。在

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


Tags: andnameimportnone属性windows事件provider
1条回答
网友
1楼 · 发布于 2024-10-01 00:17:07

Vista Event Log API(名称以Evt开头的函数)不使用^{}结构(这是PyEventLogRecord所包装的),也不是设计用来表示的“new”事件。XML格式的字符串现在实际上是“本机”导出表示,而不是某种C结构(这解释了为什么Vista的事件查看器与XP的对应项不同)非常缓慢。只有使用这个API,人们才能访问Vista引入的“应用程序和服务日志”。在

  • XML的唯一替代方法是通过首先调用^{}来只输出一些字段(这是pywin32不支持的)。它只支持直接输出完整的XML)。在

pywin32不包含任何解析XML的工具-可能是因为原始API也没有,而且作者不想用不相关的东西拖累库。Wevtapi.dll没有使用成熟的XML库,因此它可能只输出一些可以以类似的即席方式解析的XML子集,但这将是一个定时炸弹,因为M$不能保证它是什么样的子集。在


我最后用lxml解析“thissh1t”。知道了,尽管它是疯狂的,它现在是本机的表示,让我感觉更好的是安装和拖累我的程序与这样一个主要的库,这样一个简单和无关的任务。在

相关问题 更多 >