こんにちは!現場でバリバリ自動化やインフラ管理をやっていると、「ただファイルを操作するだけじゃなくて、誰がいつ重要なファイルを消したか、改変したかを検知して記録に残したい」というシチュエーションに必ず直面しますよね。
今回は、VBScriptの真骨頂であるFileSystemObject(FSO)と、Windowsの心臓部であるイベントログ(WshShell.LogEvent)をガッチリ組み合わせて、企業のセキュリティ要件にも耐えうる「リアルタイムSIEM(セキュリティ情報イベント管理)通知の土台」を作る方法を解説します。
「VBScriptなんて古いよ」なんて言う人もたまにいますが、Windows環境があれば追加のインストールなしで秒速で動き、インフラの監視スクリプトとしては今でも最強の相棒です。
ここをクリアすれば、あなたのスクリプトスキルは間違いなくワンランク上の「プロフェッショナル領域」に到達します。一緒にしっかりマスターしていきましょう!
—
なぜ「FSO単体」ではセキュリティ監査として不十分なのか?
VBScriptの`FileSystemObject`を使えば、ファイルの作成、書き込み、削除は自由自在です。
‘ 【超基本】これだけだと、誰が実行したかログに残らない…
Set fso = CreateObject(“Scripting.FileSystemObject”)
fso.DeleteFile “C:\CriticalData\secret.txt”
しかし、このコードには致命的な弱点があります。
「いつ、どのスクリプトが、どのファイルを消したのか」という足跡が、ファイルシステム側には一切残らないのです。これでは不正アクセスや誤操作があったときに、犯人(あるいは原因)の特定ができません。
そこでプロのエンジニアは、「FSOでファイルを操作した瞬間、Windowsのイベントログへ強制的に監査証跡を刻み込む」というアプローチを取ります。これにより、統合ログ監視ツール(SIEM)やWindows標準のイベントビューアで即座に検知できるようになるわけです。
—
全体像:VBScript × イベントログ連携の仕組み
今回のスクリプトがやることの全体像は以下の通りです。非常にシンプルですが、実務で求められる堅牢性を備えています。
1. 監視・実行対象の特定: 削除・改変しようとする重要データのパスを定義。
2. 監査ログの事前記録 (Before): 「今からこのファイルを削除します」というイベントをWindowsログに書き込む。
3. FSOによる実体操作: 目的のファイルの削除、またはリネーム(改変)を実行。
4. 結果のハンドリング (After): 成功したか失敗したかを判定し、成否に応じたイベントログを再度記録する。
—
【実戦投入可能】重要データ削除・改変の監査通知スクリプト
それでは、現場でそのままコピー&ペーストして使える実用コードを公開します。
エラーハンドリング(`On Error Resume Next`)を適切に配置し、万が一のファイルロック時にもスクリプトがクラッシュしないプロ仕様になっています。
‘ ==============================================================================
‘ Script Name: FSO_SecurityAudit_Logger.vbs
‘ Description: FSOによる重要ファイル操作をWindowsイベントログに記録する監査スクリプト
‘ Author: Senior Automation Engineer
‘ ==============================================================================
Option Explicit
‘ 定数の定義
Const EVENT_SUCCESS = 0
Const EVENT_ERROR = 1
Const EVENT_WARNING = 2
Dim targetFile, wshShell, fso
targetFile = “C:\CriticalData\important_config.dat”
‘ オブジェクトの生成
Set wshShell = WScript.CreateObject(“WScript.Shell”)
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 監査対象ファイルの存在確認
If Not fso.FileExists(targetFile) Then
Call WriteAuditLog(EVENT_WARNING, “【FSO監査】対象ファイルが見つかりません: ” & targetFile)
WScript.Quit
End If
‘ 実行前のイベントログ記録(監査証跡の第一歩)
Call WriteAuditLog(EVENT_SUCCESS, “【FSO監査】重要ファイルの削除プロセスを開始します: ” & targetFile)
‘ エラーハンドリングを有効化(ファイルが使用中の場合に備える)
On Error Resume Next
‘ FSOによるファイル削除の実行
fso.DeleteFile targetFile, True
If Err.Number <> 0 Then
‘ 削除失敗時のイベントログ記録(セキュリティインシデントやロックの可能性)
Call WriteAuditLog(EVENT_ERROR, “【FSO監査】重要ファイルの削除に失敗しました。Error: ” & Err.Description & ” [Path: ” & targetFile & “]”)
Err.Clear
Else
‘ 削除成功時のイベントログ記録
Call WriteAuditLog(EVENT_SUCCESS, “【FSO監査】重要ファイルの削除が正常に完了しました: ” & targetFile)
End If
‘ 後始末
On Error GoTo 0
Set fso = Nothing
Set wshShell = Nothing
WScript.Quit
‘ ==============================================================================
‘ 共通関数: Windowsイベントログ(アプリケーションログ)への書き込み
‘ ==============================================================================
Sub WriteAuditLog(logType, logMessage)
Dim eventSource
eventSource = “VBScript-FSO-Auditor”
‘ WshShell.LogEvent の引数:
‘ 0: 成功 (Success), 1: エラー (Error), 2: 警告 (Warning)
‘ 4: 情報 (Information) ※環境により動作が異なるため今回は0,1,2を確実に使い分け
Select Case logType
Case EVENT_SUCCESS
wshShell.LogEvent 0, logMessage
Case EVENT_ERROR
wshShell.LogEvent 1, logMessage
Case EVENT_WARNING
wshShell.LogEvent 2, logMessage
Case Else
wshShell.LogEvent 0, logMessage
End Select
End Sub
—
コードの重要なポイントを徹底解説
ここからは、コードの裏側にある「プロのこだわり」を紐解いていきます。
1. `WshShell.LogEvent` の活用
`WshShell.LogEvent(Type, Message)` を使うことで、外部の特別なライブラリを使わずに、Windowsの「イベント ビューア」の [Windows ログ] > [アプリケーション] に独自のログを刻むことができます。
ソース名としてイベントビューアに記録されるため、ZabbixやDatadog、Microsoft DefenderといったSIEM・統合監視ツールのエージェントで「ソース名:`VBScript-FSO-Auditor`、イベント種類:エラー」といった条件のフィルターを簡単に作成できます。
2. エラーハンドリングの流儀
ファイルシステム操作は、他のプロセス(アンチウイルスや別アプリ)がファイルを開いていると、一瞬で `Permission Denied` などのエラーを起こしてスクリプトが異常終了します。
プロのコードでは、`On Error Resume Next` でエラーをトラップしつつ、`Err.Number` を厳密にチェックして「失敗した理由」すらもイベントログに飛ばすようにしています。これにより、監視側で「誰かがファイルを消そうとしたけれど、ロックされていて失敗した(不正アクセスの未遂)」といった高度な検知が可能になります。
—
現場でやりがちな「痛いエラー」と回避策
VBScriptでファイル操作とログ監視を組み合わせる際、初心者が必ずハマる罠があります。
- 罠1: 権限不足でイベントログに書き込めない
- 原因: 標準ユーザー権限でスクリプトを実行すると、イベントログ(Applicationログ)への書き込みが拒否されることがあります。
- 対策: タスクスケジューラ等から実行する場合は「最高特権で実行する」にチェックを入れるか、管理者権限のコマンドプロンプトから `cscript.exe` で実行してください。
- 罠2: パスの記述ミス(エスケープの誤解)
- 原因: VBScriptではバックスラッシュ(`\`)はそのまま使えますが、ダブルクォーテーションの閉じ忘れなどに起因するパス不正が多いです。
- 対策: 監視対象のパスは必ず絶対パス(`C:\…`)で明示的に指定しましょう。
—
まとめ:VBScriptをインフラ自動化の武器に
今回は、FSOによるファイル操作にWindowsイベントログを組み合わせ、リアルタイムSIEM通知の土台となるセキュリティ監査スクリプトを解説しました。
「ファイルを操作するだけのスクリプト」から、「システム全体の監査証跡を残すプロ仕様のスクリプト」へ。この視点を持つだけで、あなたが書くコードの価値は劇的に跳ね上がります。
ここをクリアできれば、VBScriptの基礎と実務的な応用力はもうバッチリです!ぜひ日々の運用管理や自動化の現場で役立ててくださいね。それでは、次のステップでお会いしましょう!
