2012-06-27 30 views
7

पढ़ें मैं एक प्रोग्राम पर काम कर रहा हूं और मुझे पता है कि मैं रिकॉर्ड नंबर पर आधारित विंडोज इवेंट लॉग में एक विशिष्ट प्रविष्टि कैसे पढ़ूंगा, जो इस स्क्रिप्ट के पास पहले से ही होगा। नीचे वह कोड है जिसके साथ मैं काम कर रहा हूं, लेकिन मैं तब तक सभी घटनाओं के माध्यम से लूप नहीं करना चाहता जब तक कि मुझे वह ढूंढ न मिल जाए जो मैं ढूंढ रहा हूं। कोई विचार?विशिष्ट विंडोज इवेंट लॉग इवेंट

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

'win32evtlog.CloseEventLog (हाथ)' कॉल करने के लिए यह करने के बाद याद रखें। – twasbrillig

उत्तर

3

नहीं! कोई फ़ंक्शंस उपलब्ध नहीं है जो आपको ईवेंट आईडी के आधार पर ईवेंट प्राप्त करने की अनुमति देता है।

संदर्भ: 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 

यह

+0

बढ़िया! मैंने उस जानकारी को बहुत पहले नहीं पाया था! उत्तर के लिए धन्यवाद, जब मैं कर सकता हूं मैं इसे स्वीकार करूंगा। –

+0

मुझे नहीं पता कि यह उत्तर किस समय पोस्ट किया गया था, लेकिन यह अब सही नहीं है (नीचे मेरा जवाब देखें - यदि आप एक डब्लूएमआई क्वेरी लिख सकते हैं, तो आप इसे पूछ सकते हैं)। –

+0

EventID एक पूर्णांक है। यह स्ट्रिंग से मेल नहीं खाएगा "27035" – wojtow

6

मुझे पता है यह एक पुराने सवाल यह है कि सिर्फ एक ही तरीका है कि आप क्या कर रहे हैं, लेकिन अधिक संक्षिप्त रूप है, लेकिन मैं इसे भर में आया था, और अगर मैंने किया, दूसरों को भी हो सकता है।

आप कस्टम क्वेरी भी लिख सकते हैं, जो आपको स्क्रिप्ट (ईवेंट आईडी सहित) के किसी भी डब्ल्यूएमआई पैरामीटर से पूछताछ करने की अनुमति देता है। यह उन सभी वीबीएस डब्ल्यूएमआई प्रश्नों को बाहर निकालने और धूल देने का लाभ भी है जो वहां हैं। मैं वास्तव में किसी भी अन्य की तुलना में इस कार्यक्षमता का अधिक बार उपयोग करता हूं। उदाहरण के लिए देखें:

यहाँ आवेदन लॉग में एक विशिष्ट घटना के लिए क्वेरी करने के लिए एक नमूना है। मैंने इसे बाहर नहीं किया है, लेकिन आप एक निश्चित समय/समय के बीच या बाद में घटनाओं के लिए 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() 
+0

अपने उत्तर में वास्तविक कोड जोड़ने और संदर्भों के रूप में केवल लिंक को संदर्भित करने पर विचार करें। आप जवाब स्वयं निहित करना चाहते हैं क्योंकि आप नहीं जानते कि ये लिंक कब समाप्त हो जाएंगे। – rayryeng

+0

सुझाव के लिए धन्यवाद - मैं आगे बढ़ गया हूं और बस यही किया है। –

0

एक अजगर पुस्तकालय अब है कि आप क्या winevt बुलाया पूछ रहे हैं क्या करेंगे नहीं है। आप निम्नलिखित के माध्यम से किया जा सकता है के लिए देख रहे हैं:

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