本連載は、PowerShellコマンドレットについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回から3回に分けて「Set-Acl」コマンドレットを詳しく解説します。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
本連載では、Windows PowerShellの基本的なコマンドレットについて、基本的な書式からオプション、具体的な実行例までを分かりやすく紹介していきます。今回からコンピュータ上のファイルにアクセス権を設定する「Set-Acl」コマンドレットを扱いますが、このコマンドレットを使うには“コツ”のようなものが必要になるため、3回に分けて詳しく解説していきます。今回は、Set-Aclコマンドレットの基本的な使い方とアクセス権の「継承」を扱います。
Windowsのファイルシステムである「NTFS(NT File System)」や「ReFS(Resilient File System)」では、ファイルやフォルダに対して「アクセス権」(Access Control List:ACL)を設定できます。本連載の第80回で紹介した「Get-Acl」は、ファイルやフォルダに対して設定されたACLを取得するコマンドレットでしたが、Set-Aclはそのアクセス権を設定するコマンドになります。
共有フォルダへのアクセス権追加は第67回で紹介した「Grant-SmbShareAccess」コマンドレット、アクセス権削除は第70回で紹介した「Revoke-SmbShareAccess」コマンドレットで行いますが、ファイルやフォルダのアクセス権に関しては全てSet-Aclコマンドレットで実施できるので、非常に応用力があります。
そのため、Set-Aclコマンドレットを使う際はコツのようなものが必要になるため、今回紹介する実行例を参考に理解を深めてください。
オプション | 意味 |
---|---|
-Path | 設定したいファイルもしくはフォルダのパスを指定する。必須 |
-AclObject | 設定したいACLをオブジェクト型で指定する。必須 |
-Include | ワイルドカードを含む文字列を指定し、条件一致した項目に対して設定する。省略可能 |
-Exclude | ワイルドカードを含む文字列を指定し、条件一致した項目を除外して、その他に対して設定する。省略可能 |
Set-Aclコマンドレットを使用する際は、必ずGet-AclコマンドレットでACLを取得するところから始まります。これは「現在設定されているACLをテンプレートとして」「テンプレートの内容を変更して」「変更したテンプレートのACLを設定する」という3ステップの考え方があるからです。
例として、以下の画面1のようなACLが設定された2つのファイルがあるとします。
ファイル「article_1103.docx」は、Administratorsグループのみ「フルコントロール」の権限を持っています。このACLをテンプレートとして、もう1つのファイル「Test_File01.txt」のACLを変更します。
設定の考え方としては、article_1103.docxに設定されているACLをテンプレートとして取得し」「テンプレートの内容を変更し」「Test_File01.txtにテンプレートのACLを設定する」という流れになるため、コマンドレットとしては以下のようになります。ただし、今回は取得したACLをそのままTest_File01.txtに適用します(画面2)。なお、Set-Aclコマンドレットは、実行に管理者権限を求められません。コマンドレットを実行するユーザーの権限の範囲内で設定します。
$ACL = Get-Acl .\article_1103.docx Set-Acl -Path .\Test_File01.txt -AclObject $ACL
「$ACL」にはarticle_1103.docxのACLが格納され、Set-Aclコマンドレット実行の際のオプションとして$ACLを「AclObject」に設定してTest_File01.txtに対して実行したことにより、article_1103.docxのACLがTest_File01.txtにコピーされたことが結果からも分かります。
これが基本的なSet-Aclコマンドレットの使用方法となるので、「取得」→「変更」→「適用」の3ステップを覚えておいてください。なお、変更を伴わない単なるACLのコピーの場合は、以下の実行例のようにパイプ(|)でつなぐことで簡略化できます(画面3)。
Get-Acl .\article_1103.docx | Set-Acl .\Test_File01.txt
ファイルやグループのアクセス権には「継承」という概念が存在します。これはファイルやフォルダが新規作成された際、親フォルダやカレントフォルダに設定されているアクセス権をそのまま引き継いで設定されることで、「アクセス権の継承」と呼びます。
フォルダのアクセス権に関する詳細設定を開くと、以下の画面4ように「継承元」や「適用先(継承先)」が表示されます。
これは「親フォルダ(ShareFolder_01)に設定されているアクセス権を継承し、かつ自フォルダに作成されたフォルダおよびファイルにもそのアクセス権を継承する」という意味になっており、設定されている5つのユーザーアカウントおよびグループに継承されています。従って、この「\ShareFolder_01\Files」フォルダにファイルを作成した場合は、アクセス権の継承が機能し、以下のようなアクセス権がファイル作成時に設定されます(画面5)。
アクセス権の継承設定とSet-Aclコマンドレットがなぜ関係してくるのかというと、継承が設定されている状態で「継承されたACL」の設定を変更しようとすると、GUIでは以下のようなメッセージが表示されてACLを変更することができないからです(画面6)。
このように、継承されたACLの一部または全部を変更したい場合には、「継承の無効化」が必要となります(画面7)。
$ACL = Get-Acl .\Test_File10.txt $isProtected = $true $preserveInheritance = $true $ACL.SetAccessRuleProtection($isProtected,$preserveInheritance) Set-Acl -Path .\Test_File10.txt -AclObject $ACL
Set-Aclコマンドレットを実行する前後にGet-Aclコマンドレットで継承設定(IsInherited)を確認していますが、実行前は継承が「有効」、実行後には継承が「無効」になっていることが分かります。
これを実現しているのが4行目の「SetAccessRuleProtection」メソッドです。SetAccessRuleProtectionメソッドの設定は2つの引数が必要となり、1つ目の「$isProtected」がACLを継承から保護する(継承を無効化する)か否か、2つ目の「$preserveInheritance」が継承されたアクセス権を保持するか否かの設定になります。
今回の場合は両方とも「$true」に設定されているため、「継承から保護し($true)、ACLは保持する($true)」という設定になります。
変数$ACLのSetAccessRuleProtectionメソッドを変更し、その結果をSet-Aclコマンドレットで元のファイルに適用することで、ACLの継承設定を無効化しつつ、現在のACLを保持するという動きになっています。
なお、$isProtectedや$preserveInheritanceは必ずしも変数として用意する必要はなく、SetAccessRuleProtectionメソッドの引数は順序が固定化されており、第1引数は「継承からの保護」、第2引数は「ACLの保持する」になるため、以下のような形でのコマンドレット実行も可能です(画面8)。
$ACL = Get-Acl .\Test_File10.txt $ACL.SetAccessRuleProtection($true,$true) 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.