2012-06-27 10 views
7

Sto lavorando a un programma e non ho bisogno di sapere come leggere una voce specifica nel registro eventi di Windows in base a un numero di record, che questo script avrà già. Di seguito è riportato il codice con cui ho lavorato, ma non voglio scorrere tutti gli eventi finché non trovo quello che sto cercando. Qualche idea?Lettura evento registro eventi di Windows specifico

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 
+0

Ricordarsi di chiamare 'win32evtlog.CloseEventLog (mano)' quando hai finito. – twasbrillig

risposta

3

No! Non ci sono funzioni disponibili che ti consentano di ottenere l'evento in base all'ID evento.

Riferimento: 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. 

Solo altro metodo di interesse sta leggendo l'evento più vecchio.

Si dovrà scorrere i risultati in qualsiasi modo e il vostro approccio è corretto :)

È possibile modificare solo la forma del vostro approccio come qui di seguito, ma questo non è necessario.

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 

Questo è solo nello stesso modo come si sta facendo, ma più succinta

+0

Ottimo! Ho trovato quell'informazione non troppo tempo fa! Grazie per la risposta, accetterò quando posso. –

+0

Non so quale fosse lo stato al momento in cui questa risposta è stata pubblicata, ma questo non è più corretto (vedere la mia risposta qui sotto - se è possibile scrivere una query WMI, è possibile interrogarla). –

+0

EventID è un numero intero. Non corrisponderà mai alla stringa "27035" – wojtow

6

Mi rendo conto che è una vecchia questione, ma mi sono imbattuto, e se l'ho fatto, anche gli altri possono.

È anche possibile scrivere query personalizzate, che consentono di eseguire una query in base a qualsiasi parametro WMI che è possibile scrivere (incluso ID evento). Ha anche il vantaggio di farti tirare fuori e rispolverare tutte quelle query VMI WMI che sono là fuori. In realtà uso questa funzionalità più frequentemente di qualsiasi altra. Ad esempio, vedere:

Ecco un esempio per interrogare per un evento specifico nel registro applicazione. Non l'ho approfondito, ma puoi anche creare una stringa di tempo WMI e una query per gli eventi tra o dalla specifica data/ora.

#! 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() 
+0

Considera l'aggiunta di codice effettivo alla tua risposta e rimanda ai link solo come riferimenti. Vuoi rendere la risposta autonoma in quanto non sai quando questi link scadranno. – rayryeng

+0

Grazie per il suggerimento - Sono andato avanti e ho fatto proprio questo. –

0

C'è una libreria Python, ora che farà quello che stai chiedendo chiamato winevt. Quello che stai cercando potrebbe essere fatto tramite:

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