本連載は、PowerShellコマンドレットについて、基本書式からオプション、具体的な実行例までを紹介していきます。前回に続き、今回も「Set-Acl」コマンドレットを詳しく解説します。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
本連載では、Windows PowerShellの基本的なコマンドレットについて、基本的な書式からオプション、具体的な実行例までを分かりやすく紹介していきます。前回に続き、今回もコンピュータ上のファイルにアクセス権を設定する「Set-Acl」コマンドレットを解説します。今回は、Set-Aclコマンドレットによるファイルアクセス権の設定/追加/削除を扱います。なお、Set-Aclコマンドレットの基本的な使い方、オプションについては、本連載第82回をご覧ください。
ファイルに対して新しいユーザーの「アクセス権」(Access Control List:ACL)を設定する場合は、「継承」の有無は問われません。こちらも基本形に基づき「取得」→「変更」→「適用」の3ステップで設定します(画面1)。
$ACL = Get-Acl .\Test_File10.txt $identity = "woods" $fileSystemRights = "FullControl" $type = "Allow" $Permission = ($identity,$fileSystemRights,$type) $AddAccessList = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule $Permission $ACL.SetAccessRule($AddAccessList) Set-Acl -Path .\Test_File10.txt -AclObject $ACL
ACLは「SetAccessRule」メソッドで追加します。SetAccessRuleメソッドも引数の順序が固定されており、第1引数は「ユーザーもしくはグループ名」、第2引数は「アクセス権」、第3引数は「アクセスタイプ(許可/拒否)」となり、その順序でACLを指定します。
SetAccessRuleメソッドはオブジェクト型になるので、「New-Object」コマンドレットで新しいオブジェクトを作成します。作成するオブジェクト名は「System.Security.AccessControl.FileSystemAccessRule」となり、オブジェクト作成の際の引数としてアクセス権を設定した変数(今回の場合は「$Permission」)を指定します。
作成したオブジェクトの中身は以下のような形になります(画面2)。
SetAccessRuleメソッドは設定を上書きするため、例えば既存で「読み取り」の権限を持っているユーザー名を使用して「書き込み」の権限を設定した場合、読み取り権限が上書きされてしまい、書き込み権限だけになってしまいます(画面3)。
既にACLを持っているユーザーに対して権限を追加する場合は、SetAccessRuleメソッドではなく、「AddAccessRule」メソッドを使用します(画面4)。
$ACL = Get-Acl .\Test_File10.txt $identity = "woods" $fileSystemRights = "Write" $type = "Allow" $Permission = ($identity,$fileSystemRights,$type) $AddAccessList = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule $Permission $ACL.AddAccessRule($AddAccessList) Set-Acl -Path .\Test_File10.txt -AclObject $ACL
ここまでACLの設定、追加を確認しました。当然、ACLを削除するシナリオもあり、その場合は「RemoveAccessRule」メソッドを使用します(画面5)。
$ACL = Get-Acl .\Test_File10.txt $identity = "woods" $fileSystemRights = "Write" $type = "Allow" $Permission = ($identity,$fileSystemRights,$type) $RemoveAccessList = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule $Permission $ACL.RemoveAccessRule($RemoveAccessList) Set-Acl -Path .\Test_File10.txt -AclObject $ACL
Set-Aclコマンドレットでは、ユーザーに設定された権限の一部だけではなく、権限を与えられたユーザーそのものを削除することも可能です。その場合は、ユーザーの設定を「Get-Acl」コマンドレットで抽出し、その結果をRemoveAccessRuleメソッドに渡します(画面6)。
$ACL = Get-Acl .\Test_File10.txt $removeidentity = "SV01\woods" $RemoveIDs = Get-Acl .\Test_File10.txt | Select-Object -ExpandProperty Access | Where-Object {$_.IdentityReference -eq $removeidentity} $ACL.RemoveAccessRule($RemoveIDs) Set-Acl -Path .\Test_File10.txt -AclObject $ACL
Microsoft MVP for Cloud and Datacenter Management(2012-2024)。現業の傍ら、コミュニティーイベントでの登壇や著作にてMicrosoftテクノロジーに関する技術情報の発信、共有を続けている。ネットワークやハードウェアといった物理層に近いところが大好きな、昔ながらのインフラ屋さん。得意技はケーブル整線。近著は『詳解! Windows Server仮想ネットワーク』(日経BP社)。
Copyright © ITmedia, Inc. All Rights Reserved.