【入門編】【アクセス権継承切れ検出】WMI と icacls 情報を組み合わせたサブフォルダのパーミッション異常自動判定 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

【VBScriptの真髄】親の愛を忘れたフォルダをあぶり出す――アクセス権継承切れ検知スクリプト

こんにちは。自動化の深淵へようこそ。
マクロの記録から一歩踏み出し、「システムそのもの」を制御したいと願うあなたへ、今日はVBScript(以下VBS)の真の力をお見せしましょう。

私たちが今日取り組むのは、「NTFSアクセス権の継承切れ」というセキュリティリスクの検知です。共有フォルダで「いつの間にか誰でもアクセスできる設定になっていた」という事故は、情シスの悪夢。これを、軽量かつ強力なWSH(Windows Script Host)の力で完全自動化します。

なぜVBScriptなのか?

「今の時代、PowerShellがあるじゃないか」という声が聞こえてきそうです。しかし、VBSには「OSの標準機能だけで、環境を選ばず、即座に実行できる」という圧倒的なポータビリティがあります。配布不要、インストール不要。これが真の現場の武器です。

今回の作戦:WMIとicaclsのハイブリッド戦術

今回の判定ロジックは以下の手順で行います。

1. WMI (Windows Management Instrumentation) でフォルダ一覧を高速抽出する。
2. 各フォルダに対して `icacls` コマンドを投げ、その戻り値から「継承の有無」を判定する。
3. 異常があればログに書き出す。

陥りやすい罠:WMIのオブジェクト管理

VBSを扱う上で最も重要なのは、`Set`で生成したオブジェクトを使い終わったら`Nothing`で解放することです。これを怠ると、メモリリークが起き、サーバー環境で実行した際にシステムを不安定にさせます。「使い終わったら掃除する」——これがエンジニアの作法です。

実装コード:パーミッション異常検知スクリプト

このコードを `.vbs` 拡張子で保存してください。

‘ — 設定エリア —
Dim targetDir, logFile
targetDir = “C:\SharedFolder\Projects” ‘ 監視したい親フォルダ
logFile = “C:\Logs\PermissionCheck.log”

‘ — オブジェクトの準備 —
Dim fso, shell, logStream
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set shell = CreateObject(“WScript.Shell”)
Set logStream = fso.OpenTextFile(logFile, 8, True) ‘ 8:追記モード

‘ 指定フォルダ内のサブフォルダを走査
CheckFolder fso.GetFolder(targetDir)

logStream.Close
Set logStream = Nothing
Set shell = Nothing
Set fso = Nothing

WScript.Echo “検査完了。ログを確認してください。”

‘ — 再帰的なフォルダ走査ロジック —
Sub CheckFolder(folder)
Dim subFolder, cmd, result, output

‘ icaclsコマンドを実行し、結果を取得
‘ /inheritance:r を確認するために、icaclsの出力に “Protected” が含まれるか判定
cmd = “icacls “”” & folder.Path & “”””
Set result = shell.Exec(cmd)
output = result.StdOut.ReadAll

‘ “Protected” という文字列がicaclsの出力にあれば、継承が切れていると判断
If InStr(output, “Protected”) > 0 Then
logStream.WriteLine Now & ” [警告] 継承切れ検出: ” & folder.Path
End If

‘ サブフォルダを再帰的にチェック
For Each subFolder In folder.SubFolders
CheckFolder subFolder
Next
End Sub

コードのここがポイント!

  • `shell.Exec` の選択: `shell.Run` ではなく `Exec` を選んだ理由を理解してください。`Exec` はコマンドの実行結果を `StdOut`(標準出力)としてプログラム内に取り込めます。これで、結果をテキストファイルに出力せずとも、メモリ上で瞬時に判定が可能です。
  • 再帰呼び出し (`Sub CheckFolder`): フォルダは入れ子構造です。関数の中で自分自身を呼び出すことで、どんなに深い階層でも漏らさずチェックできます。これがプログラムの醍醐味ですね。
  • 「Protected」の判定: `icacls` コマンドの出力結果に含まれる `(I)`(継承)が消え、`Protected` と表示される仕様を利用しています。OSの仕様を逆手に取る、現場ならではのハックです。

初学者が陥りやすいエラー・注意点

1. ダブルクォーテーションの迷宮: パス名にスペースが含まれる場合、`”C:\My Documents”` のように囲む必要があります。VBS内では `””””` と書くことで、文字列として `”` を埋め込めます。ここが一番のハマりポイントです。
2. 実行権限: `icacls` を叩くには管理者権限が必要です。スクリプトを右クリックし、「管理者として実行」することを忘れないでください。
3. 無限ループ: 今回は `SubFolders` を回していますが、シンボリックリンクやジャンクションが含まれる場合、無限ループに陥る可能性があります。必要に応じて `If subFolder.Attributes And 1024 Then` (再解析ポイントの判定)を組み込むと、より堅牢になります。

まとめ:自動化エンジニアへの第一歩

このスクリプトは、単なる「継承確認ツール」ではありません。「ブラックボックス化しがちなOSのセキュリティ状態を、自身のコードで可視化する」という試みです。

VBSは古い言語ですが、そのシンプルさは「仕組みを理解する」のに最も適しています。ここをクリアすれば、次はWMIを使ってイベントログを監視したり、AD(Active Directory)と連携してユーザーを一括追加したりと、あなたの可能性は無限に広がります。

さあ、恐れずに実行してみてください。あなたのサーバーが静かに、しかし確実に守られるのを見届けるのは、エンジニア冥利に尽きる瞬間ですよ。

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