【テクニカル・上級編】【上級プロフェッショナル向け】FSO操作の全履歴をタイムスタンプ・実行ユーザー付きでトランザクション風に追跡する監査ログフレームワーク – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを掌握する:FSO監査ログフレームワークによる「不可視の追跡」

VBScriptという言語は、現代のモダンな言語から見れば「化石」のように映るかもしれない。だが、WindowsというOSの深淵において、これほど低コストで、かつ強力にシステムへ干渉できる言語は他に存在しない。

今日は、FSO(FileSystemObject)を用いたファイル操作を単なる「読み書き」で終わらせず、「監査可能なトランザクション」へと昇華させるためのアーキテクチャを提示する。障害発生時に「なぜそのファイルが消えたのか」を即座に特定し、復旧の判断を可能にする。これがプロフェッショナルの仕事だ。

—

1. なぜFSOの標準操作では不十分なのか

FSOの `CreateTextFile` や `DeleteFile` は、あまりに無防備だ。実行権限さえあれば、何が起きてもOSは事後報告を行わない。

シニアエンジニアが設計すべきは、「操作のラッパー」ではなく、「操作のトランザクション管理」である。全ての操作を「開始」「属性取得」「実行」「終了/ロールバック」というライフサイクルでカプセル化することで、初めてシステムは信頼を獲得する。

—

2. 監査ログフレームワークの実装構造

このフレームワークでは、以下の3点を徹底する。

1. アトミックなログ記録: 操作の前後で必ずメタデータ(タイムスタンプ、ユーザー名、対象パス、ファイルサイズ、属性)を記録する。
2. 実行コンテキストの保持: `WScript.Network` から取得したユーザー名、コンピュータ名を全ログに付与する。
3. オブジェクトの適正な破棄: メモリリークを許さない `Nothing` の徹底。

実装サンプル:FSO監査ラッパー

‘ FSO Audit Framework Core
Class FileAuditor
Private fso, logStream
Private Const LOG_FILE = “C:\Logs\fso_audit.log”

Private Sub Class_Initialize()
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 追記モードでログを開く(共有違反を防ぐため都度開閉が望ましいが、高負荷時はバッファリングを検討)
Set logStream = fso.OpenTextFile(LOG_FILE, 8, True)
End Sub

‘ 監査付き削除処理
Public Sub AuditDelete(filePath)
Dim fileObj, logEntry
If fso.FileExists(filePath) Then
Set fileObj = fso.GetFile(filePath)
logEntry = FormatDateTime(Now) & ” [DELETE_START] User:” & GetUser() & ” Path:” & filePath & ” Size:” & fileObj.Size
logStream.WriteLine(logEntry)

On Error Resume Next
fso.DeleteFile filePath, True

If Err.Number <> 0 Then
logStream.WriteLine(FormatDateTime(Now) & ” [DELETE_FAIL] Error:” & Err.Description)
Else
logStream.WriteLine(FormatDateTime(Now) & ” [DELETE_SUCCESS]”)
End If
On Error GoTo 0

Set fileObj = Nothing
End If
End Sub

Private Function GetUser()
Dim net: Set net = CreateObject(“WScript.Network”)
GetUser = net.UserName
Set net = Nothing
End Function

Private Sub Class_Terminate()
If Not logStream Is Nothing Then logStream.Close
Set logStream = Nothing
Set fso = Nothing
End Sub
End Class

—

3. レガシー環境を生き抜くための最適化の知見

1. メモリ管理の厳格化

VBScriptのガベージコレクション(GC)は期待してはいけない。特に長時間稼働するWSHやタスクスケジューラ上のスクリプトでは、`Set obj = Nothing` を忘れただけでメモリリークが蓄積し、やがてメモリ不足でプロセスがクラッシュする。関数内で生成したオブジェクトは、必ずその関数を抜ける前に破棄せよ。

2. ファイルシステムの競合(ロック)対策

Windows APIの深淵に触れると、ファイルロックは日常茶飯事だ。`OpenTextFile` で共有違反が発生した場合、即座に終了するのではなく、指数バックオフ(Retry回数を増やしながら数ミリ秒待機)を実装するのが、高負荷なサーバー環境での鉄則である。

3. WMIによる属性の補完

FSOの `File` オブジェクトでは取得できない詳細情報(作成者、詳細なパーミッション)が必要な場合は、`GetObject(“winmgmts:”)` を使用してWMI経由で `CIM_DataFile` にアクセスせよ。ただし、WMIはオーバーヘッドが大きいため、必要な時のみインスタンス化するのが賢明だ。

—

最後に:エンジニアとしての矜持

VBScriptで書かれたコードが「汚い」と揶揄されるのは、言語のせいではなく、設計者の怠慢によるものだ。

今回提示した監査ログフレームワークは、単なる記録手段ではない。それは、「管理者がシステムに対して責任を持つ」という姿勢の表明である。どんなレガシーな環境であれ、その奥底に流れるアーキテクチャの美学を忘れてはならない。

このコードをあなたのシステムに組み込み、闇に葬られがちなFSO操作に「証拠」という名の光を当ててほしい。それが、プロフェッショナルが守るべき最後の砦である。

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