Чтение Определенного События Журнала Событий Windows


Я работаю над программой, и мне нужно знать, как я буду читать определенную запись в журнале событий 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
3 10

3 ответа:

Нет! Отсутствуют функции, позволяющие получить событие на основе идентификатора события.

Ссылка: функции регистрации событий

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

Это точно так же, как вы делаете, но больше лаконично

Я понимаю, что это старый вопрос, но я столкнулся с ним, и если я это сделал, другие тоже могут.

Вы также можете писать пользовательские запросы, которые позволяют выполнять запросы по любому из параметров WMI, которые вы можете написать (включая идентификатор события). Он также имеет преимущество, позволяя вам вытащить и пыль от всех тех запросов 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()

Теперь есть библиотека python, которая будет делать то, что вы просите, называется winevt. То, что вы ищете, можно сделать следующим образом:

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