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
クラスを定義しています。このクラスのインスタンスを作成するときに、イベントログの名前を指定します。その後、info
、warning
、error
メソッドを使用して、情報、警告、エラーメッセージをイベントログに記録できます。
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のイベントログを操作する方法についての基本的な説明です。これらのコードを参考に、自分のニーズに合わせてカスタマイズしてみてください。