之前的时候为了解析系统的日志文件找库,找了之后又遇到不少问题,使用起来并不方便,然后就知道了原来是可以通过官方接口直接获取的,绝了….
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
   | import win32evtlog 
 
  hand = win32evtlog.OpenEventLog("localhost","System") flags = win32evtlog.EVENTLOG_SEQUENTIAL_READ|win32evtlog.EVENTLOG_FORWARDS_READ while True:     events = win32evtlog.ReadEventLog(hand, flags,0)     if events:         for event in events:             EventID = event.EventID & 0x1FFFFFFF             print('Event ID:', event.EventID & 0x1FFFFFFF)              print('Event Type',event.EventType)             print('Event Category',event.EventCategory)              print('ComputerName', event.ComputerName)              print('Time Generated', event.TimeGenerated)              print('Time Written', event.TimeWritten)              print('source',event.SourceName)              print('RecordNumber',event.RecordNumber)             print('Source Name',event.SourceName)              print('Event Data',event.Data)      else:         break
   | 
 
但是这个并不完整,有很多其实获取不到,比如进程id之类的,因此有另一个解决方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
   | import win32evtlog import xml.etree.ElementTree as ET
 
  query_handle = win32evtlog.EvtQuery('D:/**/System.evtx',     win32evtlog.EvtQueryFilePath)
  read_count = 0 att_count = 0 while True:     events = win32evtlog.EvtNext(query_handle, 100)     read_count += len(events)     if len(events) == 0:         break     for event in events:         xml_content = win32evtlog.EvtRender(event, win32evtlog.EvtRenderEventXml)         xml = ET.fromstring(xml_content)         ns = '{http://schemas.microsoft.com/win/2004/08/events/event}'
          event_id = xml.find(f'.//{ns}EventID').text         Version = xml.find(f'.//{ns}Version').text         level = xml.find(f'.//{ns}Level').text         Task = xml.find(f'.//{ns}Task').text         Opcode = xml.find(f'.//{ns}Opcode').text         Keywords = xml.find(f'.//{ns}Keywords').text         TimeCreated = xml.find(f'.//{ns}TimeCreated').get('SystemTime')         EventRecordID = xml.find(f'.//{ns}EventRecordID').text         execution = xml.find(f'.//{ns}Execution')         process_id = execution.get('ProcessID')         thread_id = execution.get('ThreadID')         channel = xml.find(f'.//{ns}Channel').text         Computer = xml.find(f'.//{ns}Computer').text         EventData_list = [{i.attrib.get('Name'):i.text} for i in xml.findall(f'.//{ns}Data')]         user_data = xml.find(f'.//{ns}UserData')         if event_id == '******':             print({'event_id':event_id,'Version':Version,'level':level,                     'Task':Task,'Opcode':Opcode,'Keywords':Keywords,                     'TimeCreated':TimeCreated,'EventRecordID':EventRecordID,                     'process_id':process_id,'thread_id':thread_id,'channel':channel,                     'Computer':Computer,'EventData_list':EventData_list,'user_data':user_data})             att_count+=1                   print(f'Read {read_count} records ----{att_count}')
   | 
 
这个方案就能够直接拿到原始结构解析数据。