継承切れは「サイレントキラー」だ。VBScriptで構築する自動検知アーキテクチャ
現場のインフラ管理者や自動化エンジニアにとって、ファイルサーバーのパーミッション崩壊は悪夢だ。特に「親フォルダからの継承が解除されたサブフォルダ」は、セキュリティ監査の穴となり、後の権限管理を地獄へ変える。
GUIで一つずつ確認する? それはエンジニアの仕事ではない。今回は、WMI(Windows Management Instrumentation)と`icacls`の出力を組み合わせ、VBScriptで「継承切れ」をピンポイントで射抜く堅牢な自動検知ロジックを伝授する。
1. なぜ「icacls」単体ではダメなのか
多くのエンジニアがやりがちなのが、`icacls`の結果を文字列検索するだけの単純なスクリプトだ。だが、それでは「継承が解除されているか」の正確な判定は難しい。
- WMIの役割: フォルダオブジェクトの再帰的探索と、パスの正規化、例外処理を担当させる。
- icaclsの役割: セキュリティ記述子の解析。特に「(I)」フラグ(Inherited)の有無を判定することで、継承の完全性を証明する。
これらをパイプラインのように組み合わせ、VBScriptの堅牢なエラーハンドリングで包み込むのが、プロの設計だ。
2. 堅牢な設計のためのアーキテクチャ
このスクリプトを「運用に耐えうる」ものにするための3原則を提示する。
1. 非同期的なパイプの扱い: `WScript.Shell`の`Exec`メソッドを使用し、標準出力をバッファリングする。`Run`による同期実行は、フリーズの元だ。
2. 正規表現による厳密な判定: `(I)`フラグが含まれていない行を抽出する。これは単純な`InStr`よりも遥かに安全だ。
3. ログの構造化: CSV形式で出力し、Excel等での後処理を容易にする。
3. 実践:アクセス権継承切れ検知スクリプト
以下のコードは、指定ディレクトリ以下の全サブフォルダをスキャンし、継承が解除されているものを抽出するプロダクションコードだ。
‘ — Configuration —
Const TARGET_PATH = “C:\Shares\DepartmentData”
Const LOG_FILE = “C:\Logs\PermissionAudit.csv”
Set objShell = CreateObject(“WScript.Shell”)
Set objFSO = CreateObject(“Scripting.FileSystemObject”)
Set objLog = objFSO.CreateTextFile(LOG_FILE, True)
‘ ヘッダーの書き込み
objLog.WriteLine “Path,Status”
‘ 再帰的にサブフォルダを探索
ScanFolders TARGET_PATH
objLog.Close
WScript.Echo “スキャン完了: ” & LOG_FILE
Sub ScanFolders(strPath)
On Error Resume Next
Dim objFolder, objSubFolder
Set objFolder = objFSO.GetFolder(strPath)
‘ icaclsで権限を確認
‘ /Q: エラー以外非表示, (I)フラグの有無で継承を判断
Dim cmd, oExec, strLine
cmd = “icacls “”” & strPath & “”””
Set oExec = objShell.Exec(cmd)
Dim isInherited : isInherited = False
Do While Not oExec.StdOut.AtEndOfStream
strLine = oExec.StdOut.ReadLine
‘ 継承が有効な場合、各権限エントリに (I) が付与される
If InStr(strLine, “(I)”) > 0 Then isInherited = True
Loop
‘ 継承が切れている(かつ、ルートではない場合)を記録
If Not isInherited And strPath <> TARGET_PATH Then
objLog.WriteLine “””” & strPath & “””,BrokenInheritance”
End If
‘ サブフォルダへ再帰
For Each objSubFolder In objFolder.SubFolders
ScanFolders objSubFolder.Path
Next
On Error GoTo 0
End Sub
4. 運用上の注意点と「伝説」の知見
このスクリプトを運用する上で、必ず抑えておくべきポイントがある。
- 権限の壁: スクリプトを実行するアカウントには、対象フォルダに対する「読み取り権限」が必須だ。また、WMIクエリが拒否される環境では、実行ユーザーをドメイン管理者権限へ昇格させるか、タスクスケジューラで「最上位の権限で実行」を指定せよ。
- パフォーマンスの罠: `FSO`の再帰探索はファイル数が多いとメモリを食う。もし数万件規模のディレクトリを扱うなら、`Dir`コマンドをパイプで回すなど、オブジェクト生成を最小限に抑える設計に切り替えるべきだ。
- ファイルシステムとの対話: ネットワークドライブ経由の実行は推奨しない。UNCパス(`\\Server\Share`)で実行するか、ローカルコンソールから叩くのが、通信遅延によるスクリプトのハングを防ぐ鉄則である。
最後に:なぜVBScriptなのか
「今更VBScriptか」という声が聞こえてきそうだが、小規模な自動化において、追加のランタイムインストールを必要とせず、Windows OSのみで完結するこの言語の優位性は未だに揺るがない。
このツールをタスクスケジューラに登録し、異常検知時にメール通知する仕組みを加えれば、君はもう「サイレントキラー」に頭を悩ませることはなくなる。
道具を使いこなすのではない。道具の限界を知り、その上で完璧なロジックを組むこと。それが、伝説の自動化エンジニアへの第一歩だ。
