Powershellでアクセス権限を確認する
やりたいこと
ディレクトリに特定のアクセス権限があるかどうかを確認したい。 (とりあえずファイルを書いてみて、エラーが発生するかどうか確認すればよいとか言ってはいけない。)
コード
Test-Permissionという関数を作成しました。 一つ目の引数にパス、二つ目の引数にユーザー名、三つ目に確認したい権限の種類 [System.Security.AccessControl.FileSystemRights] を記載します。
function Test-Permission() { param( [string][parameter(mandatory)] $Path, [string][parameter(mandatory)] $User, [System.Security.AccessControl.FileSystemRights][parameter(mandatory)] $Right ) $acl = (Get-ACL $Path).Access; $allow = $acl | Where-Object {$_.IdentityReference -match $User -and $_.AccessControlType -match "Allow"} | ForEach-Object {$t = $False} {$t = (($_.FileSystemRights -band $Right) -eq $Right) -or $t} {$t} $deny = $acl | Where-Object {$_.IdentityReference -match $User -and $_.AccessControlType -match "Deny"} | ForEach-Object {$t = $False} {$t = (($_.FileSystemRights -band $Right) -eq $Right) -or $t} {$t} return $allow -and -not $deny }
上記の関数を用いて、$pathに対して、$usernameが編集の権限を持っているかを確認する場合は、 次のようなコードとなります。
Test-Permission $path $username Modify
既知の問題点
SMBなど、リモートのディレクトリに関しては正しく動作しません。 ローカル環境ではリモートのSIDから名前を検索することができないためです。 AD環境ではADモジュールを、ワークグループ環境ではNetBIOSを使えば解決できるかと。
(気が向いたら追記するかもしれません。)