本連載は、PowerShellコマンドレットについて、基本書式からオプション、具体的な実行例までを紹介していきます。前々回、前回と解説してきた「Set-Acl」コマンドレットの最終回です。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
本連載では、Windows PowerShellの基本的なコマンドレットについて、基本的な書式からオプション、具体的な実行例までを分かりやすく紹介していきます。前々回、前回と解説してきたコンピュータ上のファイル/フォルダにアクセス権を設定する「Set-Acl」コマンドレット。最終回となる今回は、Set-Aclコマンドレットによる「フォルダアクセス権の設定/追加」と「継承」の考え方を扱います。
なお、Set-Aclコマンドレットの基本的な使い方、オプションについては、本連載第82回をご覧ください。
フォルダに対するアクセス権(Access Control List:ACL)もSet-Aclコマンドレットで設定可能ですが、ファイルの権限設定では意識しなかった「継承」を考慮する必要があります。
フォルダの場合、継承設定は親フォルダからの権限継承の他、自身の子フォルダに対して権限を継承するかどうか、また自身のフォルダに格納されるファイルに対して権限を継承するかどうかを設定します。
例えば、画面1のように「woods」に割り当てられた権限の適用先が「このフォルダーとファイル」だけになっているとします。このフォルダ内に新規フォルダを作成した場合、このユーザー「woods」の権限は継承されませんが、「SYSTEM」アカウントと「Administrators」グループの2つのユーザー権限が継承されます。
これらの継承もSet-Aclコマンドレットで設定できます。画面1のフォルダに対してユーザー「stenson」を「Full Control」の権限で追加し、「このフォルダ―、サブフォルダーおよびファイル」に権限を継承させるには、以下のようにコマンドレットを実行します(画面2)。
$ACL = Get-Acl .\TestFolder $identity = "stenson" $fileSystemRights = "FullControl" $type = "Allow" $inheritance = "ContainerInherit,ObjectInherit" $Permission = ($identity,$fileSystemRights,$inheritance,"None",$type) $AddAccessList = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule $Permission $ACL.SetAccessRule($AddAccessList) Set-Acl -Path .\TestFolder -AclObject $ACL
継承先設定は「ContainerInherit」がフォルダに対する権限継承、「ObjectInherit」がファイルに対する権限継承になります。
ユーザー「stenson」の権限は「このフォルダ―、サブフォルダーおよびファイル」に継承されるので、「ContainerInherit」と「ObjectInherit」の設定を実施します。
新規ユーザーの権限設定となるので「SetAccessRule」メソッドを使用します。ファイルに対する権限設定と異なり、継承設定が必要となるので、SetAccessRuleメソッドに渡す引数は5つになります。
第1引数と第2引数は、ファイルの場合と同じように「ユーザーもしくはグループ名」と「アクセス権」です。
第3引数は「継承先設定」となり、前述の「ContainerInherit」と「ObjectInherit」をカンマ(,)区切りで指定します。
第4引数は「継承の制限」の設定です。前述の実行例のように「None」(6行目)を指定すると制限がないため全てに継承されます。
そして、第5引数が「アクセスタイプ(許可/拒否)」で、その順序でACLを指定します。
このようにフォルダに対するアクセス権設定は、ファイルに対するアクセス権設定と引数の数が異なる点に注意が必要です。
これに追加してユーザー「watson」には「読み取りと実行」の権限で追加し、「このフォルダーとファイル」のみの継承設定を行います(画面3)。
$ACL = Get-Acl .\TestFolder $identity = "watson" $fileSystemRights = "ReadAndExecute, Synchronize" $type = "Allow" $inheritance = "ObjectInherit" $Permission = ($identity,$fileSystemRights,$inheritance,"None",$type) $AddAccessList = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule $Permission $ACL.SetAccessRule($AddAccessList) Set-Acl -Path .\TestFolder -AclObject $ACL
ユーザー「stenson」とユーザー「watson」のGet-Aclコマンドレットの出力結果が異なっていることが分かりますが、これをGUIで確認すると画面4のようになっています。
ユースケースとしては「カレントフォルダは『読み取り』と『実行』だけだが、サブフォルダは『フルコントロール』」といった権限設定があると思います。もちろん、継承設定を行わずに個別にACLを設定することでも実現できますが、継承設定をうまく活用することで管理工数を最小にできる可能性があります。
現在ユーザー「watson」は「TestFolder」に対して「読み取りと実行」の権限しか持っていませんが、サブフォルダには「フルコントロール」の権限を渡したいと考えています。
継承設定を無効にして、新たにサブフォルダに対して権限を設定することもできますが、以降サブフォルダを作成するたびに権限を付与しなければならなくなるため、管理コストは増大します。
そのような場合は、「SetAccessRule」メソッドや「AddAccessRule」メソッドに渡す引数の中の「継承の制限」を活用します。
また、既にACLが設定されているフォルダに対する権限追加になりますので、SetAccessRuleメソッドではなく、AddAccessRuleメソッドを利用します(画面5)。なお、SetAccessRuleメソッドを使用すると、ACLを上書きしてしまうため注意が必要です。
$ACL = Get-Acl .\TestFolder $identity = "watson" $fileSystemRights = "FullControl" $type = "Allow" $inheritance = "ContainerInherit,ObjectInherit" $Propagation = "InheritOnly" $Permission = ($identity,$fileSystemRights,$inheritance,$Propagation,$type) $AddAccessList = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule $Permission $ACL.AddAccessRule($AddAccessList) Set-Acl -Path .\TestFolder -AclObject $ACL
Set-Aclコマンドレットの実行結果をGUIで確認すると、画面6のようになりました。
「継承の制限」として「InheritOnly」を設定したため、カレントフォルダには適用されず、サブフォルダ以降のフォルダとファイルに対してのみアクセス権が継承されます。
Microsoft MVP for Cloud and Datacenter Management(2012-2024)。現業の傍ら、コミュニティーイベントでの登壇や著作にてMicrosoftテクノロジーに関する技術情報の発信、共有を続けている。ネットワークやハードウェアといった物理層に近いところが大好きな、昔ながらのインフラ屋さん。得意技はケーブル整線。近著は『詳解! Windows Server仮想ネットワーク』(日経BP社)。
Copyright © ITmedia, Inc. All Rights Reserved.