NTFSのアクセス許可の種類

前回はGet-Aclコマンドレットを使用して、アクセス許可設定を確認する方法を紹介しましたが、今回はSet-Aclコマンドレットを使用して、アクセス許可設定を変更する方法を紹介します。

アクセス許可として設定できる規則には、ReadData(データの読み取り許可)、ListDirectory(ディレクトリの表示許可)、CreateFiles(ファイルの作成許可)など、詳細で多岐にわたりますが、これらを常に厳密に設定するのは大変なので、Windowsではよく使う展開的なアクセス許可規則の組み合わせを「基本アクセス規則」として用意しています。その中でも特に使用頻度が高いのはFullControl(フルコントロール許可)、Read(読み出し許可)、ReadAndExecute(読み出しと実行許可)、Write(書き込み許可)、Modify(編集許可)です。

ファイルのプロパティウィンドウでも確認できます。

ファイルやフォルダのプロパティの「セキュリティ」タブにまず表示するのは、基本アクセス規則です。すべてのアクセス規則を確認または変更するには「詳細設定」ボタンをクリックします。

さらに「編集」ボタンをクリックします。

設定を変更するユーザーをクリックして選択し、[編集]ボタンをクリックします。

すべてのアクセス規則を確認できます。

※ 管理者であってもすべての規則を簡単に自由に設定変更できるわけではありません。設定規則によっては、対象ファイルの所有権を取得したり、親ディレクトリからの規則の継承を解消したりしなければなりません。

アクセス許可の設定をパイプラインでコピーする

ファイルまたはフォルダのアクセス許可設定を変更するとき、見本となるアクセス許可設定があれば、とてもPowerShellらしい操作で、簡単にアクセス許可を複製できます。元になるファイルやフォルダからGet-Aclでアクセス許可設定の情報を取り出し、パイプラインでSet-Aclに送って、対象となるファイルまたはフォルダに設定します。

たとえば、file2.txtに対して、file1.txtと全く同じアクセス許可を設定するのであれば、以下のように実行します。

Get-Acl  file1.txt  |  Set-Acl  file2.txt

(Get-Acl file1.txt).Accessで、file1.txtのアクセス許可設定を確認。file1.txtにはUsersグループにフルコントロールを許可してあります。

(Get-Acl file2.txt).Accessで、file2.txtのアクセス許可設定を確認。file2.txtではEveryoneにファイルの変更を許可してあります。

file1.txtのアクセス許可設定を、file2.txtに設定。

もう一度file2.txtのアクセス許可設定を確認すると、file1.txtと同じになっています。

※ Get-Aclが出力する情報、Set-Aclで設定する情報は、.NET FrameworksのSystem.Security.AccessControl.FileSystemAccessRuleクラスのオブジェクトとなります。詳細な内容は、.NET Frameworksの資料で確認してください。たとえば、Microsoft TechNetでFileSystemAccessRuleを検索してください。

アクセス許可の設定を変数を介してコピーする

同じ設定を何度も使うのであれば、Get-Aclが出力するオブジェクトを、一度変数に格納するといいでしょう。以下は、aclという変数に代入して何度も使う例です。

$acl  =  Get-Acl  file1.txt
$acl  |  Set-Acl  file2.txt
$acl  |  Set-Acl  file3.jpg
$acl  |  Set-Acl  C:\Users\Public\Documents\file4.db

パイプラインを使用せずにACLのオブジェクトを設定するときは -AclObject パラメータを使用します。以下の2行は、同じ結果になります。

$acl  |  Set-Acl  file2.txt
Set-Acl  -Path  file2.txt  -AclObject  $acl

設定対象を指定するパラメータ -Path は省略できます。また、操作対象としてファイル指定する他の多くのコマンドレットと同様に、-Include(対象に含むファイルの指定)、-Exclude(対象から除外するファイルの指定)、ワイルドカードを使用できます。

以下の例は、2010で始まるファイル名のうち、拡張子がdbのものを除外して、アクセス許可を設定する例です。

Set-Acl  2010*  -Exclude  *.db  -AclObject  $acl

アクセス許可設定をPowerShellで変更する

PowerShellを使ってアクセス許可設定の規則を変更するときは、PowerShellでFileSystemAccessRuleクラスのオブジェクトを直接操作する必要があります。

一般的には、以下の手順になります。

 1. 適用する規則のデータを変数として作成します。

 2. 作成した変数を使ってFileSystemAccessRuleオブジェクトを作成します。

 3. 対象ファイルの現在の許可設定をGet-Aclで変数に取り出します。

 4. 変数に取り出したオブジェクトに、2で作成したオブジェクトを追加、削除等の変更を操作します。

 5. 変更したオブジェクトを、Set-Aclでファイルやフォルダに設定します。

オブジェクトを操作するには、FileSystemAccessRuleクラスのメソッド(メンバ関数)を使用します。Get-Aclで取得したオブジェクトからGet-Member でメソッドを確認できます。必要に応じて、ヘルプやTechNetで各メソッドの仕様を検索するといいでしょう。

Get-Acl file1.txt | Get-Member を実行し、Get-Aclが出力するFileSystemAccessRuleクラスのオブジェクトから、メソッドを確認します。

標準テキストファイル(拡張子.txt)に、Everyoneのフルコントロール(Fullcontrol)アクセス許可を追加する例を紹介します。

 1. 追加するアクセス許可規則、「Everyoneにフルコントロールを許可(Allow)」を配列変数aclparamに保存します。@(...)は、()内の要素を配列化します。

$aclparam = @("Everyone", "Fullcontrol", "Allow")

 2. 変数aclparamを設定したFileSystemAccessRuleクラスのオブジェクトを作成し、変数ruleに保存します。

$rule = New-Object  System.Security.AccessControl.FileSystemAccessRule  $aclparam

 3. 変数aclに現在のfile1.txtのアクセス許可設定を取得します。

$acl = Get-Acl  file1.txt

 4. 変数aclに、新しく追加する規則のオブジェクトである変数ruleの内容を追加します。

$acl.AddAccessRule($rule)

 5. 変更した規則aclをfile1.txtに設定します。

Set-Acl file1.txt  -AclObject  $acl

上記の例の実行画面。

上記の例を実行後、Get-Aclでfile1.txtのアクセス許可設定を確認すると、Everyoneのアクセス許可が追加されています。

※ 当連載ではGet-ChildItemやFor-Eachを使った繰り返し処理なども紹介していますが、サブディレクトリごと検索したファイルにFor-EachをつかってSet-Aclを実行すれば、サブディレクトリごとアクセス許可を変更するなど、応用できます。