web-dev-qa-db-ja.com

特定の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
12
Zac Brown

番号!イベントIDに基づいてイベントを取得できる関数はありません。

参照: イベントロギング関数

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

これはあなたがしているのとまったく同じ方法ですが、より簡潔です

7
pyfunc

これは古い質問だと思いますが、私はそれに出くわしました。もしそうなら、他の人もそうかもしれません。

カスタムクエリを作成することもできます。これにより、スクリプト化できる任意のWMIパラメーター(イベントIDを含む)でクエリを実行できます。また、そこにあるすべてのVBSWMI​​クエリを引き出してほこりを払うことができるという利点もあります。私は実際にこの機能を他のどの機能よりも頻繁に使用しています。例については、以下を参照してください。

これは、アプリケーションログで特定のイベントをクエリするためのサンプルです。私はそれを具体化していませんが、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()
11
Doug R.

pythonライブラリがあります(python 3以降)。これは、 winevt と呼ばれる要求を実行します。探していることは、以下:

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