甚至读取特定的Windows事件日志

2024-09-26 18:04:18 发布

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

我正在开发一个程序,不需要知道如何根据一个记录号读取Windows事件日志的特定条目,这个脚本已经有了这个记录号。下面是我一直在使用的代码,但在找到我要查找的事件之前,我不想遍历所有事件。有什么想法吗?

import win32evtlog

server = 'localhost' # name of the target computer to get event logs
logtype = 'System'
hand = win32evtlog.OpenEventLog(server,logtype)
flags = win32evtlog.EVENTLOG_BACKWARDS_READ|win32evtlog.EVENTLOG_SEQUENTIAL_READ
total = win32evtlog.GetNumberOfEventLogRecords(hand)

while True:
    events = win32evtlog.ReadEventLog(hand, flags,0)
    if events:
        for event in events:
            if event.EventID == "27035":
                print 'Event Category:', event.EventCategory
                print 'Time Generated:', event.TimeGenerated
                print 'Source Name:', event.SourceName
                print 'Event ID:', event.EventID
                print 'Event Type:', event.EventType
                data = event.StringInserts
                if data:
                    print 'Event Data:'
                    for msg in data:
                        print msg
                break

Tags: eventreaddataifserver记录事件events
3条回答

我意识到这是一个老问题,但我遇到了,如果我遇到了,其他人也可能。

您还可以编写自定义查询,允许您通过任何可以编写脚本的WMI参数(包括事件ID)进行查询。它还有一个好处,就是可以让您拉出并清除所有的VBS WMI查询。实际上,我比其他任何人更频繁地使用这个功能。有关示例,请参见:

下面是一个在应用程序日志中查询特定事件的示例。我还没有详细说明,但您也可以构建一个WMI时间字符串,并查询特定日期/时间之间或之后的事件。

#! py -3

import wmi

def main():
    rval = 0  # Default: Check passes.

    # Initialize WMI objects and query.
    wmi_o = wmi.WMI('.')
    wql = ("SELECT * FROM Win32_NTLogEvent WHERE Logfile="
           "'Application' AND EventCode='3036'")

    # Query WMI object.
    wql_r = wmi_o.query(wql)

    if len(wql_r):
        rval = -1  # Check fails.

    return rval



if __name__ == '__main__':
    main()

不!没有任何函数允许您根据事件id获取事件

引用:Event logging functions

GetNumberOfEventLogRecords  Retrieves the number of records in the specified event log.
GetOldestEventLogRecord     Retrieves the absolute record number of the oldest record 
                            in the specified event log.
NotifyChangeEventLog        Enables an application to receive notification when an event
                            is written to the specified event log.

ReadEventLog                Reads a whole number of entries from the specified event log.
RegisterEventSource         Retrieves a registered handle to the specified event log.

唯一感兴趣的方法是读取最早的事件。

您必须以任何方式迭代结果,并且您的方法是正确的:)

您只能像下面这样更改方法的形式,但这是不必要的。

events = win32evtlog.ReadEventLog(hand, flags,0)
events_list = [event for event in events if event.EventID == "27035"]
if event_list:
    print 'Event Category:', events_list[0].EventCategory

这和你做的一样,但更简洁

现在有一个python库(python 3及更高版本)可以完成您所要求的任务,称为winevt。你要找的可以通过以下方式完成:

from winevt import EventLog
query = EventLog.Query("System","Event/System[EventID=27035]")
event = next(query)

相关问题 更多 >

    热门问题