Windows共有フォルダの権限継承元一覧を出力する
Windowsサーバーの共有フォルダの権限設定が長年の利用で権限設定でぐちゃぐちゃになってしまったので、継承元の一覧を出力する方法を考えました。
特定のフォルダのアクセス権限を表示させるだけなら Get-Acl “対象パス”で表示できます。
全フォルダのアクセス権限を出すのであれば$Items = Get-ChildItem “対象パス” -Directoryで一覧取得してfor文で回してforeach($item in $items){Get-Acl $Item|Select-Object …..|Export-CSV “出力フォルダ”}とかやれば出せます。(検索したら出てくるので詳細は書きません)
これだと継承先まで全て出てきてしまうし、ピボットテーブルで一覧を出してもアクセス権限の表示順序だけでパターンが分かれてしまいます。
そこで、フォルダアクセスを下に継承されていないつまりは「継承元」だけを出してやると設定変更すべき場所ができて便利です。
アクセス権の構造
Get-Aclで取得できるアクセス権ルールはFileSystemAccessRuleの重ね合わせでできています。
$Acl = Get-Acl $item
として取得したオブジェクトのうち、$Acl.Accessプロパティを表示させると
FileSystemRights : AppendData
AccessControlType : Deny
IdentityReference : .\UsersIs
Inherited : False
InheritanceFlags : None
PropagationFlags : None
とかいうプロパティがずらずらっと出てきます。つまりFileSystemAccessRuleの配列として持っています。
アクセス権の詳細は下記記事の後半に書いてますのでご参照ください
継承元とは
継承元とは、上記のプロパティのうちInherited : Falseとなっている(継承されているがfalse)となっているアクセス権です。
なので$Acl.Accessをforかforeachで回して($false -eq Acl.Access[$i].Inherited)ってなっているものだけ処理してExportすれば良いわけです。
サンプルソース
下記サンプルソースではフォルダ一覧を作った後、Aclチェックをして継承元一覧の配列を作った後に最後に出力してます。
それとWindowsのアクセス権設定は難しすぎるのか「誰もさわれないフォルダ」を作っちゃった輩がいたので、アクセス権が取得できなかったときのためにtry〜catchをしてエラー一覧を別に出力してます。
業務回していると「管理職にしかみせたくない!」とか「プロジェクトメンバーにしかみせたくない!」とか言って色んなところにアクセス権限を設定せざるを得なくなることもあるかと思います。アクセス権の見直しの一助にぜひどうぞ。
ひとつ、上記のサンプルソースの問題はGet−ChildItemコマンドレットを使っているので\\fileserver.contoso.local\shareそのものに設定されたアクセス権は一覧に出力されません。あまり問題にはならないと思いますが…。