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操作に「証拠」という名の光を当ててほしい。それが、プロフェッショナルが守るべき最後の砦である。
