【入門編】【上級プロフェッショナル向け】不審なファイル大量生成を検知し自動で対象フォルダを緊急隔離・ロックダウンする自己防衛VBS – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク
スポンサーリンク

マクロの記録を卒業し、「守る」エンジニアへ。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の基本はバッチリですよ。
次は、ファイルの中身(テキスト)を読み取って、特定のキーワードが含まれていたらメールを飛ばす……なんていう拡張にも挑戦してみてください。

エンジニアとしての旅は、まだ始まったばかりです。応援していますよ!

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