【入門編】【ファイルACL確認】icacls コマンドと Shell.Exec を組み合わせたアクセス権限の自動検証 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!現場でバリバリ自動化を進めていると、「指定したフォルダに、特定のユーザーが本当に読み書きできる権限を持っているか、プログラムから一発で判定したい」という要件に必ずぶぶつかりますよね。

GUIでプロパティを開いてセキュリティタブを確認するのは、管理するファイルが100個あったら発狂してしまいます。ここはやっぱり、VBScriptとWindows標準のコマンドを組み合わせて、スマートに自動検証できるようにしちゃいましょう!

今回は、Windowsのアクセス権確認の定番コマンド `icacls` と、VBScriptの `WScript.Shell`(特にその真価を発揮する `Exec` メソッド)を組み合わせた、実践的なファイルACL(アクセス制御リスト)検証スクリプトの極意を伝授します。

ここをクリアすれば、OSの裏側をVBScriptで操る感覚が掴め、自動化エンジニアとしてのスキルが一段と跳ね上がりますよ。一緒にバッチリマスターしていきましょう!

なぜ `icacls` と `Shell.Exec` なのか?

VBScriptで外部コマンドを実行する方法には、主に `Run` メソッドと `Exec` メソッドの2つがあります。

  • `Run` メソッド:コマンドを投げるだけ。終了コードは取れるが、コマンドの実行結果(標準出力)をスクリプト側でリアルタイムに回収できない
  • `Exec` メソッド:コマンドを実行しつつ、その標準出力をストリームとしてスクリプト内にキャプチャできる

今回やりたいのは、「`icacls` コマンドを叩いて、その画面に出る文字列(誰が何の権限を持っているか)をプログラムに読み込ませて判定する」ことです。だからこそ、出力を完全掌握できる `Shell.Exec` が絶対に不可欠なのです。

実践!ファイルACL自動検証スクリプト

それでは、実際に動くコードを見てみましょう。
デスクトップ上の `test.txt` というファイルに対して、特定のユーザー(またはグループ)が「書き込み(W)権限」を持っているかを判定するスクリプトです。

メモ帳に以下のコードを貼り付けて、拡張子を `.vbs`(例: `check_acl.vbs`)として保存してください。

‘ =================================================================0
‘ ファイルACL自動検証スクリプト
‘ ターゲットファイルに指定ユーザーの書き込み権限があるかを判定する
‘ =================================================================0

Option Explicit

Dim targetFile, targetUser
Dim wshShell, execObj, stdOut
Dim commandLine, outputText
Dim hasWriteAccess

‘ — 1. 検証対象の設定 —
‘ ※検証したい実際のファイルパスとユーザー名(またはグループ名)に変更してください
targetFile = “C:\CaclsTest\sample.txt”
targetUser = “BUILTIN\Users” ‘ 例: Usersグループ

‘ — 2. icaclsコマンドの組み立て —
‘ icacls パス で現在のアクセス権限リストを出力させます
commandLine = “icacls “”” & targetFile & “”””

‘ — 3. Shell.Exec によるコマンド実行と出力のキャプチャ —
Set wshShell = CreateObject(“WScript.Shell”)
Set execObj = wshShell.Exec(commandLine)

‘ 標準出力のすべてを変数に読み込む
outputText = execObj.StdOut.ReadAll

‘ — 4. 結果の解析と判定 —
‘ icaclsの出力結果から、指定ユーザーが含まれ、かつ書き込み権限(W)があるかを探す
‘ ※簡易的な文字列検索による判定ロジック
hasWriteAccess = False

‘ 出力を改行で分割して1行ずつ走査する
Dim lines, i, line
lines = Split(outputText, vbCrLf)

For i = 0 To UBound(lines)
line = lines(i)
‘ 対象ユーザーが含まれているか?
If InStr(1, line, targetUser, vbTextCompare) > 0 Then
‘ 書き込み権限を示す ‘(W)’ または ‘(F’ (フルコントロール) が含まれているか?
‘ ※icaclsの構文では (OI)(CI)(W) のように権限が付与されます
If InStr(1, line, “(W)”, vbTextCompare) > 0 Or InStr(1, line, “(F)”, vbTextCompare) > 0 Then
hasWriteAccess = True
Exit For
End If
End If
Next

‘ — 5. 判定結果の出力 —
If hasWriteAccess Then
WScript.Echo “【判定:OK】” & vbCrLf & targetUser & ” は [” & targetFile & “] に対する書き込み権限を持っています。”
Else
WScript.Echo “【判定:NG】” & vbCrLf & targetUser & ” は書き込み権限を持っていません、または対象が見つかりません。”
End If

‘ 後始末
Set execObj = Nothing
Set wshShell = Nothing

コードの重要ポイントを徹底解説

初心者から一歩抜け出すために、このコードのキモとなる部分を深掘りしていきましょう。

1. `Option Explicit` はエンジニアの生命線

スクリプトの先頭にある `Option Explicit` は、「変数の宣言を強制する」お呪いです。これを書くことで、うっかりタイポ(変数名の打ち間違い)をしたときにVBScriptが即座にエラーを出して教えてくれます。大規模なスクリプトを書く際のバグを防ぐ必須の作法です。

2. パスの囲み(ダブルクォーテーションの罠)

Windowsのファイルパスにはスペースが含まれることがよくあります(例: `C:\Program Files\…`)。
`icacls “C:\My Folder\sample.txt”` のように、コマンドに渡すパスはダブルクォーテーションで囲む必要があります。VBScript内でダブルクォーテーションを文字列に含めるときは `””` と重ねるテクニックを使っています。

commandLine = “icacls “”” & targetFile & “”””

ここは初心者が最もハマりやすいポイントなので、覚えておくと非常に強力な武器になります。

3. `Exec.StdOut.ReadAll` によるストリームの全回収

`wshShell.Exec(commandLine)` が実行されると、裏側でコマンドプロンプトが走り、その結果が標準出力(StdOut)に流し込まれます。`.ReadAll` を使うことで、その出力を一網打尽にVBScriptの文字列変数(`outputText`)へと取り込むことができます。

陥りやすいエラーと現場の知見

実際にこのスクリプトを現場で運用する際、いくつか注意すべき「罠」があります。

トラブル1:日本語OSにおけるユーザー名・グループ名の違い

日本語環境のWindowsでは、組み込みのグループ名がローカライズされています。

  • 英語環境:`BUILTIN\Users`
  • 日本語環境:`BUILTIN\ユーザー` または単に `Users`

検証する環境のローカライズ状況に合わせて、`targetUser` に指定する文字列を正確に合わせる必要があります。あらかじめ対象ファイルを一度手動で `icacls` コマンドにかけ、出力される文字列をそのままコピペして確認するのが確実です。

トラブル2:権限継承と個別権限(マニアックな注意点)

`icacls` の出力には、`(OI)(CI)(M)` のような継承フラグが含まれます。

  • `(OI)`: オブジェクト継承
  • `(CI)`: コンテナ継承
  • `(M)`: 変更(Modify)、`(F)`: フルコントロール(Full)、`(W)`: 書き込み(Write)

「書き込み権限があるか」を厳密に判定する場合、単に `(W)` だけでなく、より強い権限である `(M)` や `(F)` が付与されている場合も「書き込み可能」と判定しなくてはなりません。今回のサンプルコードでは `(W)` と `(F)` をチェック対象に入れていますが、実運用ではセキュリティポリシーに合わせて柔軟に調整してください。

旨味の詰まった `icacls` × `Shell.Exec` のコンビネーション、いかがでしたでしょうか?
この手法をマスターすれば、ファイルサーバの監査スクリプトや、アプリケーションデプロイ前の権限自動チェックツールなど、実務で即座に使える高度な自動化ツールが自由自在に作れるようになります。

ここをクリアしたあなたなら、もうVBScriptの基礎はバッチリです!ぜひ日々の業務に役立ててみてくださいね。それでは、次の自動化の旅でお会いしましょう!

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