2012-06-27 68 views
7

私はプログラムに取り組んでおり、このスクリプトには既に記録番号があるため、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 
+0

完了したら、 'win32evtlog.CloseEventLog(hand)'を呼び出すことを忘れないでください。 – twasbrillig

答えて

3

いいえ!イベント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 

これは、私は、これは古い質問です実現が、私はそれに出くわした、と私がやった場合、他の人があまりにかもしれちょうどあなたがやっているのと同じ方法が、より簡潔

+0

素晴らしい!私はあまりにもずっと前にその情報を見つけました!答えてくれてありがとう、私はそれを受け入れるだろう。 –

+0

この回答が掲載された時点のステータスはわかりませんが、これは正しくありません(下記の私の回答を参照してください.WMIクエリを書くことができればクエリできます)。 –

+0

EventIDは整数です。それは決して文字列 "27035"に一致しません – wojtow

6

です。

スクリプトを実行できるWMIパラメータ(イベントIDを含む)を使用してクエリを実行できるカスタムクエリを記述することもできます。また、そこにあるVBS WMIのすべてのクエリを取り除くことができます。実際にこの機能を他のどの機能よりも頻繁に使用しています。例については、以下を参照してください。http://technet.microsoft.com/library/ee176695.aspx

http://technet.microsoft.com/en-us/library/ee176693.aspx

    • は、ここでアプリケーションログに特定のイベントを照会するためのサンプルです。私はそれを洗い出したわけではありませんが、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と呼ばれるものを実行するPythonライブラリがあります。あなたが探しているものは、以下を介して行うことができます:

    from winevt import EventLog 
    query = EventLog.Query("System","Event/System[EventID=27035]") 
    event = next(query) 
    
    関連する問題