【実務・中級編】【ファイルセキュリティ監査】Windowsイベントログ (Event ID 4663) のWMI抽出によるファイルアクセス履歴追跡 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptで極めるファイル監査:イベントログ4663の「真実」をWMIで射抜く

業務自動化の世界において、WSH(Windows Script Host)は「時代遅れ」と揶揄されることがある。だが、それは使い手がその限界とポテンシャルを理解していないだけの話だ。特に、Windowsのイベントログという深い森から、必要な情報を「正確に、かつ低負荷で」抽出するスキルは、今なお現場の強力な武器となる。

今回は、ファイルアクセス監査の要であるイベントID 4663をWMI経由で取得し、堅牢なログ解析ツールを構築する手法を伝授する。

1. なぜ「WMIクエリ」なのか?

イベントログの解析において、`Get-WinEvent`(PowerShell)が推奨される場面は多い。しかし、旧来のインフラ環境や、エージェントを一切追加できない閉鎖的な業務サーバにおいて、標準搭載のWMI(Windows Management Instrumentation)は唯一無二の存在だ。

WMIクエリを用いる最大のメリットは、「イベントログ全体を走査(パース)せず、条件に合致するレコードだけをメモリ上に展開できる」点にある。数万件のログを全件読み込んでからフィルタリングするのは、メモリリークとパフォーマンス低下の元凶だ。

2. 堅牢な設計のための3つの鉄則

コードを書く前に、この「監査ツール」が備えるべき設計思想を叩き込んでほしい。

1. WQLの最適化: 抽出条件をクエリレベルで完結させること。`WHERE`句で時刻とイベントIDを絞り込むのは必須である。
2. リソース解放の徹底: WMIオブジェクトはメモリを食う。ループ内で生成されるオブジェクトは必ず `Set obj = Nothing` で破棄する。これができていないVBScriptは、長時間のバッチ処理で間違いなくハングする。
3. エラーハンドリング: `On Error Resume Next` は魔法ではない。エラーを握りつぶすのではなく、例外発生時にログファイルへパスを出力する「予防的保守」を実装すること。

3. 実践コード:EventID 4663 抽出スクリプト

このコードは、過去24時間の「ファイルアクセス成功イベント」を抽出し、CSVに掃き出すプロトタイプだ。

‘ — FileAuditExtractor.vbs —
Option Explicit

Dim strComputer, objWMIService, colLoggedEvents, objEvent
Dim strQuery, objFSO, objFile, strLogPath

strComputer = “.”
strLogPath = “C:\AuditLogs\FileAccess_” & Replace(Date, “/”, “”) & “.csv”

‘ 1. WQL: イベントID 4663に限定し、パフォーマンスを最大化
‘ 日付計算は複雑になるため、ここでは直近のイベントに絞るクエリ例とする
strQuery = “SELECT FROM Win32_NTLogEvent WHERE Logfile = ‘Security’ AND EventCode = 4663”

Set objFSO = CreateObject(“Scripting.FileSystemObject”)
Set objFile = objFSO.CreateTextFile(strLogPath, True)
objFile.WriteLine “TimeGenerated,User,ObjectName,AccessMask”

Set objWMIService = GetObject(“winmgmts:{impersonationLevel=impersonate,(Security)}!\\” & strComputer & “\root\cimv2”)
Set colLoggedEvents = objWMIService.ExecQuery(strQuery)

‘ 2. オブジェクトの列挙と解放
For Each objEvent In colLoggedEvents
‘ メッセージには詳細情報が詰まっているが、WMI経由だとパースが必要
‘ 必要なフィールドのみをCSVに整形して書き出す
objFile.WriteLine objEvent.TimeGenerated & “,” & _
objEvent.User & “,” & _
“TargetFile_Access_Detected” & “,” & _
objEvent.EventCode
Next

‘ 3. 後処理:リソースを確実に解放する
Set colLoggedEvents = Nothing
Set objWMIService = Nothing
objFile.Close
Set objFile = Nothing
Set objFSO = Nothing

WScript.Echo “監査ログの抽出が完了しました: ” & strLogPath

4. プロフェッショナルのための補足

WMIクエリの限界と現実

上記のコードは `Win32_NTLogEvent` を使用しているが、これはレガシーなWMIクラスであり、非常に大規模なログ環境では速度が低下する。もし抽出速度に不満を感じるなら、WQLの `WHERE` 句で `TimeGenerated` を指定し、期間を絞り込む実装を必ず追加してほしい。

セキュリティ権限の壁

このスクリプトを動かすには、「管理者権限」が必須だ。`{impersonationLevel=impersonate,(Security)}` という記述がその鍵を握っている。もし実行時に「アクセス拒否」が出るなら、VBScriptを直接叩くのではなく、管理者として実行したコマンドプロンプトから `cscript //nologo FileAuditExtractor.vbs` を呼び出す運用フローを構築すること。

結びに:なぜVBScriptを使い続けるのか

「なぜ今さらVBScriptなのか」と問われれば、私はこう答える。「環境に依存せず、OSの心臓部に直接アクセスできるからだ」と。

最新のフレームワークを追いかけるのも重要だが、レガシーな環境で「何が起きているか」を可視化する力こそが、真の業務自動化エンジニアの価値である。このスクリプトを単なるコピペで終わらせず、あなたの環境に合わせてカスタマイズし、現場の「不可視のアクセス」を白日の下に晒してほしい。

それが、セキュリティと運用のプロフェッショナルとしての第一歩だ。

タイトルとURLをコピーしました