2012-06-27 23 views
7

Estoy trabajando en un programa y no sé cómo leería una entrada específica en el registro de eventos de Windows basado en un número de registro, que este script ya tendrá. A continuación está el código con el que he estado trabajando, pero no quiero recorrer todos los eventos hasta que encuentre el que estoy buscando. ¿Algunas ideas?Leer evento de registro de eventos de Windows específico

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

Recuerde llamar a 'win32evtlog.CloseEventLog (hand) 'cuando haya terminado. – twasbrillig

Respuesta

3

No! No hay funciones disponibles que le permitan obtener el evento en función de la identificación del evento.

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

Sólo otro método de interés está leyendo el evento más antiguo.

Usted tendrá que repetir por los resultados de ninguna manera y que su enfoque es correcto :)

Sólo puede cambiar la forma de su enfoque como el de abajo, pero esto es innecesario.

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 

Se trata de la misma manera como lo están haciendo, pero más sucinto

+0

¡Genial! ¡Encontré esa información no hace mucho tiempo! Gracias por la respuesta, lo aceptaré cuando pueda. –

+0

No sé cuál era el estado en el momento en que se publicó esta respuesta, pero esto ya no es correcto (consulte mi respuesta a continuación: si puede escribir una consulta WMI, puede consultarla). –

+0

EventID es un número entero. Nunca coincidirá con la cadena "27035" – wojtow

6

Comprendo que esto es una vieja pregunta, pero me encontré con él, y si lo hiciera, otros demasiado mayo.

También puede escribir consultas personalizadas, que le permiten consultar mediante cualquiera de los parámetros de WMI que puede secuencia de comandos (incluida la identificación de evento). También tiene la ventaja de permitirle extraer y desempolvar todas las consultas WMI de VBS que existen. De hecho, uso esta funcionalidad con más frecuencia que cualquier otra. Para ejemplos, ver:

He aquí una muestra para consultar un evento específico en el registro de aplicación. No lo he desarrollado, pero también puedes construir una cadena de tiempo WMI y consultar eventos entre o desde fechas/horas específicas también.

#! 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

Considere agregar el código real a su respuesta y difiriendo a los enlaces solo como referencias. Desea que la respuesta sea independiente ya que no sabe cuándo caducarán esos enlaces. – rayryeng

+0

Gracias por la sugerencia. He seguido adelante y he hecho eso. –

0

Hay una biblioteca de Python ahora que va a hacer lo que está pidiendo llamado winevt. Lo que está buscando podría hacerse a través de lo siguiente:

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