【 Set-Acl 】コマンドレット――ファイルのアクセス権を設定する(1)基本的な使い方とアクセス権の「継承」Windows PowerShell基本Tips(82)

本連載は、PowerShellコマンドレットについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回から3回に分けて「Set-Acl」コマンドレットを詳しく解説します。

» 2023年09月08日 05時00分 公開
[後藤諭史@IT]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「Windows PowerShell基本Tips」のインデックス

連載目次

 本連載では、Windows PowerShellの基本的なコマンドレットについて、基本的な書式からオプション、具体的な実行例までを分かりやすく紹介していきます。今回からコンピュータ上のファイルにアクセス権を設定する「Set-Acl」コマンドレットを扱いますが、このコマンドレットを使うには“コツ”のようなものが必要になるため、3回に分けて詳しく解説していきます。今回は、Set-Aclコマンドレットの基本的な使い方とアクセス権の「継承」を扱います。

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コマンドレットを使う際はコツのようなものが必要になるため、今回紹介する実行例を参考に理解を深めてください。

Set-Aclコマンドレットの書式

Set-Acl [オプション]


Set-Aclコマンドレットの主なオプション

オプション 意味
-Path 設定したいファイルもしくはフォルダのパスを指定する。必須
-AclObject 設定したいACLをオブジェクト型で指定する。必須
-Include ワイルドカードを含む文字列を指定し、条件一致した項目に対して設定する。省略可能
-Exclude ワイルドカードを含む文字列を指定し、条件一致した項目を除外して、その他に対して設定する。省略可能


基本的なSet-Aclコマンドレットの考え方

 Set-Aclコマンドレットを使用する際は、必ずGet-AclコマンドレットでACLを取得するところから始まります。これは「現在設定されているACLをテンプレートとして」「テンプレートの内容を変更して」「変更したテンプレートのACLを設定する」という3ステップの考え方があるからです。

 例として、以下の画面1のようなACLが設定された2つのファイルがあるとします。

ALT 画面1 2つのファイルに設定されているACL

 ファイル「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

ALT 画面2 Set-Aclコマンドレットで$ACLに格納された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

ALT 画面3 コピーの場合は、Get-AclコマンドレットとSet-Aclコマンドレットをパイプでつないで実行することで簡略化できる


ACLの継承を無効化する

 ファイルやグループのアクセス権には「継承」という概念が存在します。これはファイルやフォルダが新規作成された際、親フォルダやカレントフォルダに設定されているアクセス権をそのまま引き継いで設定されることで、「アクセス権の継承」と呼びます。

 フォルダのアクセス権に関する詳細設定を開くと、以下の画面4ように「継承元」や「適用先(継承先)」が表示されます。

ALT 画面4 フォルダに設定されているアクセス権の継承設定

 これは「親フォルダ(ShareFolder_01)に設定されているアクセス権を継承し、かつ自フォルダに作成されたフォルダおよびファイルにもそのアクセス権を継承する」という意味になっており、設定されている5つのユーザーアカウントおよびグループに継承されています。従って、この「\ShareFolder_01\Files」フォルダにファイルを作成した場合は、アクセス権の継承が機能し、以下のようなアクセス権がファイル作成時に設定されます(画面5)。

ALT 画面5 フォルダに設定されているアクセス権を継承して、ファイルのアクセス権が設定されている

 アクセス権の継承設定とSet-Aclコマンドレットがなぜ関係してくるのかというと、継承が設定されている状態で「継承されたACL」の設定を変更しようとすると、GUIでは以下のようなメッセージが表示されてACLを変更することができないからです(画面6)。

ALT 画面6 継承が設定されているため、ACLの変更が拒否される

 このように、継承されたACLの一部または全部を変更したい場合には、「継承の無効化」が必要となります(画面7)。

コマンドレット実行例

$ACL = Get-Acl .\Test_File10.txt
$isProtected = $true
$preserveInheritance = $true
$ACL.SetAccessRuleProtection($isProtected,$preserveInheritance)
Set-Acl -Path .\Test_File10.txt -AclObject $ACL

ALT 画面7 Set-Aclコマンドレットで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

ALT 画面8 Set-Aclコマンドレットで変数を指定せずに、継承設定を無効化した

筆者紹介

後藤 諭史(ごとう さとし)

Microsoft MVP for Cloud and Datacenter Management(2012-2024)。現業の傍ら、コミュニティーイベントでの登壇や著作にてMicrosoftテクノロジーに関する技術情報の発信、共有を続けている。ネットワークやハードウェアといった物理層に近いところが大好きな、昔ながらのインフラ屋さん。得意技はケーブル整線。近著は『詳解! Windows Server仮想ネットワーク』(日経BP社)。


Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。