知識は未だ霧の中

スパコン眼鏡NET。HPCのことはあまり書かない。

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を使えば解決できるかと。

(気が向いたら追記するかもしれません。)