Pythonは、Windowsのイベントログを操作するための強力なツールです。この記事では、Pythonを使用してWindowsのイベントログに記録する方法と、Windows形式のイベントログであるevtxデータをCSVに変換する方法について説明します。

PythonでWindowsイベントログに記録する

PythonからWindowsのイベントログに記録するには、win32evtlogモジュールを使用します。以下に、PythonでWindowsイベントログに記録するための基本的なコードを示します。

from win32evtlog import OpenEventLog, ReportEvent, EVENTLOG_INFORMATION_TYPE, EVENTLOG_WARNING_TYPE, EVENTLOG_ERROR_TYPE

class WindowsEventLogger:
    def __init__(self, name: str):
        self.handle = OpenEventLog(None, name)

    def log(self, message: str, *, type: int, category=0, event_id=0, user_sid=None, raw_data=None):
        return ReportEvent(self.handle, type, category, event_id, user_sid, [message], raw_data)

    def info(self, message: str, **kwargs):
        return self.log(message, type=EVENTLOG_INFORMATION_TYPE, **kwargs)

    def warning(self, message: str, **kwargs):
        return self.log(message, type=EVENTLOG_WARNING_TYPE, **kwargs)

    def error(self, message: str, **kwargs):
        return self.log(message, type=EVENTLOG_ERROR_TYPE, **kwargs)

このコードでは、WindowsEventLoggerクラスを定義しています。このクラスのインスタンスを作成するときに、イベントログの名前を指定します。その後、infowarningerrorメソッドを使用して、情報、警告、エラーメッセージをイベントログに記録できます。

PythonでevtxデータをCSVに変換する

Pythonを使用して、Windows形式のイベントログであるevtxデータをCSVに変換することも可能です。以下に、evtxデータをCSVに変換するための基本的なコードを示します。

import argparse
import time
from Evtx.Evtx import Evtx
import pandas as pd

def evtx_to_csv(evtx_file, mode):
    # イベントスキーマーの定義
    SCHEMA = 'http://schemas.netapp.com/events/event'
    # カラムの定義
    EventID = []
    EventName = []
    TimeCreated = []
    Computer = []
    SubjectIP = []
    DomainName = []
    UserName = []
    ObjectType = []
    ObjectName = []
    RWOffset = []
    RWCount = []

    # イベントファイルのオープン
    with Evtx(evtx_file) as log:
        # イベントレコードの取得
        for record in log.records():
            elm = record.lxml()
            # イベントデータの取得
            EventID.append(elm.xpath("//event:EventID", namespaces={"event":SCHEMA})[0].text)
            EventName.append(elm.xpath("//event:EventName", namespaces={"event":SCHEMA})[0].text)
            TimeCreated.append(elm.xpath("//event:TimeCreated", namespaces={"event":SCHEMA})[0].get("SystemTime"))
            Computer.append(elm.xpath("//event:Computer", namespaces={"event":SCHEMA})[0].text)
            SubjectIP.append(elm.xpath("//event:Data", namespaces={"event":SCHEMA})[0].text)
            DomainName.append(elm.xpath("//event:Data", namespaces={"event":SCHEMA})[5].text)
            UserName.append(elm.xpath("//event:Data", namespaces={"event":SCHEMA})[6].text)
            ObjectType.append(elm.xpath("//event:Data", namespaces={"event":SCHEMA})[8].text)
            ObjectName.append(elm.xpath("//event:Data", namespaces={"event":SCHEMA})[10].text)
            eventname_str = elm.xpath("//event:EventName", namespaces={"event":SCHEMA})[0].text
            if eventname_str == 'Read Object' or eventname_str == 'Write Object' :
                RWOffset.append(elm.xpath("//event:Data", namespaces={"event":SCHEMA})[11].text)
                RWCount.append(elm.xpath("//event:Data", namespaces={"event":SCHEMA})[12].text)
            else :
                RWOffset.append('')
                RWCount.append('')

    # データフレームを作成
    df = pd.DataFrame({
        'EventID' : EventID,
        'EventName' : EventName,
        'TimeCreated' : TimeCreated,
        'Computer' : Computer,
        'SubjectIP' : SubjectIP,
        'DomainName' : DomainName,
        'UserName' : UserName,
        'ObjectType' : ObjectType,
        'ObjectName' : ObjectName,
        'RWOffset' : RWOffset,
        'RWCount' : RWCount
    })

    if mode == 'csv' :
        # CSVファイルへの書き込み
        output_file = evtx_file + '.csv'
        df.to_csv(output_file, header=True, index=True)
    else :
        # 画面への表示
        print(df.to_markdown())

このコードでは、evtx_to_csv関数を定義しています。この関数は、指定されたevtxファイルを開き、イベントレコードを取得します。各レコードからイベントデータを取得し、それらをデータフレームに保存します。最後に、データフレームをCSVファイルに書き込むか、画面に表示します。

以上がPythonを使用してWindowsのイベントログを操作する方法についての基本的な説明です。これらのコードを参考に、自分のニーズに合わせてカスタマイズしてみてください。

投稿者 admin

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です