マクロの記録を卒業し、「守る」エンジニアへ。VBScriptで構築する自己防衛型監視システム
こんにちは。自動化の深淵へようこそ。
「マクロの記録」を使って、Excelの操作を自動化することに成功した。そんなあなたは、すでに自動化の第一歩を力強く踏み出しています。でも、もしあなたが「ただ作業を楽にするだけ」の段階を超え、「システムを制御し、守る」というエンジニアの領域に足を踏み入れたいなら……今日お話しする内容は、あなたの視界を劇的に変えるはずです。
今日は、VBScriptの真髄とも言えるFileSystemObject (FSO) を使い、まるでセキュリティソフトのように「不審な動きを検知して、自らを守る」という、極めて高度で実践的なコードを一緒に作っていきましょう。
1. なぜ「FileSystemObject」が最強の武器になるのか?
VBScriptでファイルやフォルダを操る際、避けては通れないのが FileSystemObject (FSO) です。
多くの初学者は、FSOを単なる「ファイルを開く・消すための道具」だと思っています。しかし、プロフェッショナルは違います。FSOは、「OS(オペレーティングシステム)の神経系にアクセスするためのインターフェース」だと捉えます。
フォルダの中に何個のファイルがあるか、そのファイルがいつ作られたか、あるいはそのファイルが「読み取り専用」なのか。これらを瞬時に読み取る力は、異常事態を検知するための「感覚器」そのものなのです。
2. 実践:自己防衛型・緊急隔離スクリプト
それでは、本題に入りましょう。
ターゲットとなるフォルダ内で、「短時間に大量のファイルが生成された」場合、それをランサムウェアのような攻撃の予兆とみなし、対象フォルダ内のファイルを強制的に「隔離用フォルダ」へ退避させるスクリプトです。
【警告】 このスクリプトは強力です。テストする際は、必ず実験用の空のフォルダを作成して実行してください。
' ==========================================================================
' Self-Defense File Monitor (Emergency Quarantine System)
'
' 【概要】
' 指定フォルダ内のファイル数を監視し、一定時間内に急増した場合、
' 攻撃とみなしてファイルを隔離フォルダへ移動(ロックダウン)します。
' ==========================================================================
Option Explicit
' --- 設定値(ここを環境に合わせて調整してください) ---
Const TARGET_PATH = "C:\Test\TargetFolder" ' 監視対象のフォルダ
Const QUARANTINE_PATH = "C:\Test\Quarantine" ' 隔離先フォルダ
Const FILE_THRESHOLD = 10 ' 検知するファイル増加数
Const CHECK_INTERVAL_MS = 2000 ' 監視間隔(ミリ秒): 2秒
' --- オブジェクト宣言 ---
Dim objFSO, objTargetFolder, objQuarantineFolder
Dim lastFileCount, currentFileCount, diffCount
Dim isRunning
' --- メイン処理 ---
Sub Main()
' 1. FileSystemObjectの生成(オブジェクトのライフサイクル管理)
Set objFSO = CreateObject("Scripting.FileSystemObject")
' 2. フォルダの存在チェック(エラー回避の鉄則)
If Not objFSO.FolderExists(TARGET_PATH) Then
MsgBox "エラー: 監視対象フォルダが存在しません。" & vbCrLf & TARGET_PATH, vbCritical
Exit Sub
End If
' 3. 隔離先フォルダの準備(なければ作成)
If Not objFSO.FolderExists(QUARANTINE_PATH) Then
objFSO.CreateFolder(QUARANTINE_PATH)
End If
Set objTargetFolder = objFSO.GetFolder(TARGET_PATH)
lastFileCount = objTargetFolder.Files.Count
isRunning = True
MsgBox "監視を開始しました。" & vbCrLf & "対象: " & TARGET_PATH, vbInformation
' 4. 監視ループ(無限ループによるリアルタイム監視)
Do While isRunning
' わずかな待機を入れてCPU負荷を抑える(ここがプロの作法)
WScript.Sleep CHECK_INTERVAL_MS
' 現在のファイル数を取得
currentFileCount = objTargetFolder.Files.Count
' 前回のカウントとの差分を計算
diffCount = currentFileCount - lastFileCount
' --- 異常検知ロジック ---
If diffCount >= FILE_THRESHOLD Then
' 異常検知!隔離処理を実行
ExecuteLockdown diffCount
isRunning = False ' 異常検知後は監視を終了
Else
' 通常時はカウントを更新して継続
lastFileCount = currentFileCount
End If
Loop
' 5. 後片付け(リソースの解放)
Set objTargetFolder = Nothing
Set objFSO = Nothing
MsgBox "監視を終了しました。", vbExclamation
End Sub
' --- 隔離実行サブプロシージャ ---
Sub ExecuteLockdown(count)
Dim objFile, fileName
MsgBox "【警告】異常なファイル生成を検知しました!" & vbCrLf & _
"増加数: " & count & " 件" & vbCrLf & _
"直ちに隔離処理を開始します。", vbCritical
' フォルダ内のファイルを一つずつループして移動
' ※ Error Handlingを入れないと、使用中のファイルで止まってしまいます
On Error Resume Next
For Each objFile In objTargetFolder.Files
fileName = objFile.Name
' 隔離先へ移動(MoveFile)
' ファイル名が重複する場合を考慮し、簡易的にエラーをスキップ
objFSO.MoveFile objFile.Path, QUARANTINE_PATH & "\" & fileName
If Err.Number <> 0 Then
' ファイルがロックされている場合などのエラー処理
' ここではログ出力などの代わりに、スキップして続行
Err.Clear
End If
Next
On Error GoTo 0
MsgBox "隔離完了。対象ファイルを " & QUARANTINE_PATH & " に退避しました。", vbInformation
End Sub
' プログラム開始
Main
3. アーキテクトの視点:コードを解剖する
このスクリプトが「単なるマクロ」ではなく「システム」として動いている理由は、3つの設計思想にあります。
① オブジェクトのライフサイクルとリソース管理
コードの最後を見てください。`Set objFSO = Nothing` と書いていますよね。
VBScriptはCOM(Component Object Model)という仕組みを利用しています。作ったオブジェクトは、使い終わったら明示的に解放してあげましょう。これを怠ると、メモリリーク(メモリの無駄遣い)が発生し、長期間動かし続ける監視ツールとしては致命的な欠陥になります。
② CPU負荷への配慮(WScript.Sleep)
監視プログラムは、放っておくと全力でループを回し続け、PCのCPUを100%占有してしまいます。これでは監視している間にPCが重くなり、本末転倒です。
`WScript.Sleep CHECK_INTERVAL_MS` を入れることで、「休むときは休む」。これが、システムに優しいエンジニアの作法です。
③ エラーハンドリングの重要性
`On Error Resume Next`。
これは「魔法の言葉」ではありません。使い方を誤ると、バグを見逃す「毒」になります。
今回のコードでは、隔離処理中に「他のプログラムが使用中のファイル」に遭遇した際、スクリプト全体がクラッシュして止まってしまうのを防ぐために、ピンポイントで隔離ループ内に使用しています。「どこでエラーが起きるか」を予測して、そこだけに適用する。 これが上級者への分かれ道です。
4. まとめ:次に進むあなたへ
今回のコードは、非常にシンプルですが、「状態を監視する」「閾値を判断する」「アクションを起こす」 という、セキュリティエンジニアリングの根幹を成しています。
「マクロの記録」は、決まった手順をなぞるためのものです。
しかし、今回のような「条件に応じて動きを変える」コードは、あなたの意思をコンピュータに伝えるためのものです。
ここをクリアすれば、VBScriptの基本はバッチリですよ。
次は、ファイルの中身(テキスト)を読み取って、特定のキーワードが含まれていたらメールを飛ばす……なんていう拡張にも挑戦してみてください。
エンジニアとしての旅は、まだ始まったばかりです。応援していますよ!
