我有一个应用程序使用win32evtlog获取和显示不同的事件,我希望将显示限制为特定级别的事件,但win32evtlog不返回此值。似乎您可以将事件转换为XML,然后提取此信息,但我无法确定如何将事件从循环获取为XML。
我可以使用它来显示LogObject拥有的数据,比如LogObject.TimeGenerated
Log = win32evtlog.OpenEventLog('localhost', 'Application')
while 1:
LogObjects = winev32tlog.ReadEventLog(Log, win32evtlog.EVENTLOG_BACKWARDS_READ|wine32vtlog.EVENTLOG_SEQUENTIAL_READ, 0)
if not LogObjects:
break
for LogObject in LogObjects:
我试着用
LogObjectXML = win32evtlog.EvtRender(LogObject, 1)
不幸的是这又回来了
TypeError: The object is not a PyHANDLE object
所以我知道我需要得到某种handle对象,可以用来将EvtRender指向正确的事件,但无法计算出我是如何做到的。
这个问题与How retrieve from Python win32evtlog rest of info?非常相似,但是那里的解决方案没有回答我们如何将对象转换为XML的关键问题。
--==使用有关CristiFati的XML的信息进行编辑=--
下面是事件消息读取的应用程序事件的示例:
Updated Windows Defender status successfully to SECURITY_PRODUCT_STATE_ON.
根据事件查看器的XML如下
- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
<Provider Name="SecurityCenter" />
<EventID Qualifiers="0">15</EventID>
<Level>4</Level>
<Task>0</Task>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2017-05-23T07:36:27.627108000Z" />
<EventRecordID>49419</EventRecordID>
<Channel>Application</Channel>
<Computer>Name.domain.here</Computer>
<Security />
</System>
- <EventData>
<Data>Windows Defender</Data>
<Data>SECURITY_PRODUCT_STATE_ON</Data>
</EventData>
</Event>
ReadEventLog返回PyEventLogRecords(wrapper over[MS.Docs]: _EVENTLOGRECORD structure),而EvtRender期望(您需要使用)PyHANDLEs(PyEVT\u HANDLEs(wrapper overEVT\u HANDLE([MS.Docs]: Windows Event Log Data Types)更精确)。
因此,要获取XML数据,需要使用与此类型一起工作的函数族:例如EvtQuery,EvtNext。
代码.py:
注意:
try
/except
子句中(我没有遇到错误,所以我不确定什么情况下会引发异常)pywintypes.datetime(2017, 3, 11, 3, 46, 47)
)- 返回PyEventLogRecords的列表
- 在get_events的情况下,注意向后参数
- 我一定要坚持小尺寸的。作为[MS.Docs]: ReadEventLogW function状态,在获取事件时,可以使用max512K缓冲区。现在(从PyWin32version220开始),可以将它作为参数(最后一个)传递给
都在访问磁盘,使用新的缓冲区大小,我得到了10X的速度提高(对于~180K事件)win32evtlog.ReadEventLog
。查看[SourceForge.hg]: mhammond/pywin32 - Add buffer size parameter for ReadEventLog (patch #143 from cristi fati)了解更多详细信息。默认情况下,存在一个限制,因此缓冲区大小硬编码为1K。由于每个ReadEventLog@EDIT0:我找不到使用Evt*函数系列获取所有必需信息的方法,因此我从两个来源获取信息(我增强了先前发布的脚本):
@EDIT1:根据[MS.Docs]: OpenEventLogW function:
[MS.Docs]: Eventlog Key列出了3个标准值。所以,这就是它打开应用程序日志的原因。我对脚本做了一些小改动来测试源代码。我不知道从哪里得到的nts来自。
相关问题 更多 >
编程相关推荐