PowerShellを使用したNTFSアクセス許可の管理:チュートリアル

組織のファイルシステムのアクセス許可の設定に苦労しているITプロフェッショナルの方へ、朗報です。多くのユーザーやグループと作業する場合、GUIを使用してNTFSのアクセス許可を管理するのは時間がかかります。幸いなことに、PowerShellがあります。どのようにしてかと言いますと、Microsoft.PowerShell.Securityモジュールを利用することです。

PowerShellには、ACLを操作するための2つのコマンドレット、Get-ACLSet-ACLがあります。これらのコマンドレットを使用すると、任意の数のNTFSのアクセス許可を取得および割り当てることができます。このチュートリアルでは、NTFSのアクセス許可の管理を効率化し、すぐに役立つスキルを身につけることができます。

読む時間がない場合は問題ありません!下記のTechSnips.ioのAnthony Howellによる動画をご覧ください。

ManageEngine ADManager Plusを使用してActive Directory、Exchange、およびMicrosoft 365を管理およびレポートします。無料トライアルをダウンロード!

前提条件

このチュートリアルの例に従うには、以下が必要です:

テスト用のファイル/フォルダの作成

このチュートリアルは、単一のフォルダーまたは「ラボ」を中心に構築されます。NTFSのアクセス許可をPowerShellで基礎から学びます。あなたの側で追加の作業は必要ありません。

  1. まず、管理者としてPowerShellセッションを開いてください。
  2. ファイルシステムのどこかに、Shareという名前の空のフォルダーを作成してください。以下の例では、そのフォルダーがC:\Shareにあると仮定しています。これにより、例が短く、追いやすくなります。以下のコードをコピーしてこのディレクトリを作成できます:
New-Item -ItemType Directory -Path 'C:\Share'

3. C:\Share\Assetsという名前のフォルダーを作成してください。

New-Item -ItemType Directory -Path 'C:\Share\Assets'

4. C:\Shareフォルダーにclient_list.txtという名前のファイルを作成してください。

New-Item -ItemType File -Path 'C:\Share\Client_list.txt'

5. C:\Shareフォルダーにclient_projects.txtという名前のファイルを作成してください。

New-Item -ItemType File -Path 'C:\Share\Client_projects.txt'

6. 次に、変数を作成してShareフォルダーのパスを指定します。変数を作成すると、入力を削減し、パスの再利用が容易になります。C:\Shareを使用していると仮定して、以下のコード例をPowerShellセッションにコピーしてください:

$dir = 'C:\Share'

7. Enterキーを押してください。これで空のディレクトリが作成され、そのパスが変数として保存されました。

Get-Aclを使用してNTFSのアクセス許可を表示する

PowerShellでは、Get-Aclコマンドレットを使用してNTFSのアクセス許可を簡単に表示することができます。次のセクションでは、ファイルまたはフォルダーのNTFSのアクセス許可を表示する方法を学びます。

アクセス制御リスト(ACL)は、アクセス制御エントリ(ACE)のリストです。ACL内の各ACEは、信託者を識別し、許可、拒否、または監査されるアクセス権を指定します。セキュリティ記述子には、セキュアオブジェクトのDACLとSACLの2種類のACLが含まれることがあります。

NTFSのアクセス許可の表示

従来、ACLを表示するには、C:\Shareフォルダを右クリックし、プロパティをクリックし、セキュリティタブを選択し、詳細ボタンをクリックする必要がありました。以下にGUIがアクセス許可を表示する例を示します。

Access Control List using Advanced Security Settings for Share

上記の例では、いくつかのアクセス許可エントリとプロパティが番号付けされています。このセクションの後で比較するため、注意深く確認してください。

以前に作成したディレクトリを使用して、Get-Aclを使用してディレクトリの現在のNTFSアクセス許可を表示します。

Get-Acl -Path $dir

次のスクリーンショットに、パス、所有者、アクセスレベルの詳細が表示されます。

Access Control List

上のスクリーンショットに表示されているAccessプロパティには、ACLに関する追加情報が含まれていますが、FullControlの末尾に表示されている三点リーダーによって画面からはみ出しています。以前のコマンドを丸括弧で囲むことで、Access オブジェクトのプロパティを表示するためのより良い方法があります。以下のコードを実行して、このオブジェクトでAccessプロパティのみを検索します。

(Get-Acl -Path $dir).Access

上記のコマンドは、Accessオブジェクトを使用し、-ExpandPropertiesパラメータを使用して次のように表現することもできます:Get-Acl -Path $dir | Select-Object -ExpandProperty Access

以下のスクリーンショットに示すように、出力はコマンドを個別に見るのが簡単になるように折り返されます。

Access Control Entities

上記の方法でアクセスプロパティを表示すると、多くのアクセス制御エンティティ(ACE)がある場合、ターミナルの出力が画面を高速にスクロールします。各エンティティにはFileSystemRights、AccessControlType、IdentityReference、IsInherited、InheritenceFlags、およびPropagationFlagsのプロパティが含まれています。この情報をより読みやすくするために、オブジェクトをFormat-Table -AutoSizeにパイプしてください。以下のコマンドを実行します。

(Get-Acl -Path $dir).Access | Format-Table -AutoSize

以下のスクリーンショットで示されるように、Format-Table -AutoSizeを使用すると、アクセスプロパティがより整理されて見やすくなります。

Cleaner output when piping to Format-Table

プロパティと列番号を調べてください。これらは、チュートリアルの最初にGUIで見たものと同じプロパティです。

Access Control List using Advanced Security Settings for Share

アクセスオブジェクトのフィルタリング

NTFSのアクセス許可を特定する際に、より正確にしたい場合があります。その場合、PowerShellを使用して特定のACEをフィルタリングしたり、ACL内で継承または明示的なNTFSのアクセス許可を持つ特定の結果を見つけたりすることができます。目で1行ずつターミナルウィンドウをスクロールする代わりに、フィルタリングを行うためにWhere-Objectコマンドレットを使用することができます。

以下のコード例では、NTFSのアクセス許可を継承していないオブジェクトをフィルタリングしています。これは、Where-Objectを使用して、-Notオペランドを使用してパイプライン内の現在のオブジェクトを見ている$_.メンバーオブジェクトのプロパティIsInheritedを使用して行われます。これは、ACEが継承の結果であり、明示的に設定されていないことを示します。

(Get-Acl -Path $dir).Access | Where-Object {$_.IsInherited -eq $true} | Format-Table -AutoSize

オブジェクトをFormat-Table -AutoSizeにパイプすることを忘れずに。そうしないと出力が画面からスクロールしてしまいます。これを新しい習慣にしてください。後で感謝されるでしょう!

以下のコードを使用して、'USERNAME'を別のユーザー名に置き換えて特定の結果を表示します。

(Get-Acl -Path $dir).Access | Where-Object {$_.IdentityReference -like 'USERNAME'} | Format-Table -AutoSize

以下は、結果の例です:

Sample output from the filtering

上記の例は、IdentityReferenceプロパティがユーザーまたはセキュリティグループに割り当てられた許可を持つすべてのACEを示しています。

これまでに学んだGet-Aclについての知識を活かして練習してください。システム上のさまざまなファイルとフォルダを調べてみましょう。これにより、さまざまなコンテキストでのさまざまなセキュリティ記述子が表示されます。また、これにより、筋肉の記憶を構築するのに役立ちます。

さらに一歩進んで、NTFSアクセス許可を割り当てましょう。

Set-Aclを使用してNTFSアクセス許可を変更する

NTFSアクセス許可を表示できるようになったので、PowerShellを使用してNTFSアクセス許可を割り当てて変更する時が来ました。Set-Aclコマンドレットがそれを可能にします。次のセクションでは、このコマンドレットをGet-Aclと組み合わせて、ファイルまたはフォルダからNTFSアクセス許可をコピーし、編集、削除する方法を示します。

NTFSアクセス許可のコピー

必要なレベルのNTFSアクセス許可が含まれているファイルやフォルダがあるかもしれません。別のACLに使用するためにファイルやフォルダからアクセス許可をコピーすることで時間を節約できます。

既存のACL / ACEをコピーすることで、NTFSアクセス許可の設定時の人為的なミスを減らすことができます。ただし、コピー元のセキュリティ記述子が最初から宛先に対して正確で適切であることを前提としています。「力には責任が伴う」という言葉を心に留めておいてください。

次のスクリーンショットをご覧ください。ここでは、C:\ShareにあるClient_List.txtというファイルのACLを確認しています。このACLには、必要なNTFSの権限が正しく設定されています。

Client list with appropriate NTFS permissions for Bill, the new employee.

次に、次のスクリーンショットをご覧ください。今度は、C:\ShareにあるClient_Projects.txtという別のファイルのACLを確認しています。このファイルには、必要なNTFSの権限が設定されていません。

Client Projects with no access for Bill.

Client_List.txtからNTFSの権限をClient_Projects.txtにコピーする必要があります。これを行うには、Client_List.txtからACLを取得し、Set-Aclコマンドレットの-AclObjectパラメータを使用します。以下のコードを実行すると、Client_List.txtのACL全体がClient_Projects.txtにコピーされます:

# Client_List.txtのセキュリティディスクリプタをClient_Projects.txtにコピーする
$Acl = Get-Acl -Path 'C:\Share\Client_list.txt'
Set-Acl -AclObject $Acl -Path 'C:\Share\Client_Projects.txt'

以下の番号付きスクリーンショットで確認できるように、Client_Projects.txtファイルには、Client_List.txtと同じセキュリティディスクリプタが設定されています。

  1. 既存のファイルからACLを取得します。
  2. コピーしたACLオブジェクトをファイルまたはフォルダに設定します。
  3. ACLが正しくファイルまたはフォルダにコピーされたことを確認します。
NTFS Permissions Copied

Client_Projects.txtファイルのACLが、Client_List.txtファイルのIdentityReference列とAccessControlTypeAllowに設定されたものと同じであることがわかります。同じテクニックをフォルダに対してもNTFSの権限を割り当てるために使用します。

NTFSの権限の追加

前のセクションでは、既存のNTFSのアクセス許可を1つのファイルオブジェクトから別のオブジェクトにコピーしました。今回は、NTFSのアクセス許可をゼロから作成します。これにより、ファイルまたはフォルダに割り当てられるNTFSのアクセス許可を割り当てることができます。

まず、Set-Aclで使用する新しいオブジェクトのプロパティを作成するためのいくつかの変数を割り当てます。この方法で行うと、コマンドを実行する際に少し簡単になります。以下のコードは、ファイルまたはフォルダに割り当てられるNTFSのアクセス許可となるACEのプロパティを構築します:

# ACEを作成
$identity = 'domain\user'
$rights = 'FullControl' #その他のオプション:[enum] ::GetValues('System.Security.AccessControl.FileSystemRights')
$inheritance = 'ContainerInherit, ObjectInherit' #その他のオプション:[enum] ::GetValues('System.Security.AccessControl.Inheritance')
$propagation = 'None' #その他のオプション:[enum] ::GetValues('System.Security.AccessControl.PropagationFlags')
$type = 'Allow' #その他のオプション:[enum] ::GetValues('System.Security.AccessControl.AccessControlType')
$ACE = New-Object System.Security.AccessControl.FileSystemAccessRule($identity,$rights,$inheritance,$propagation, $type)

次に、変数を1つ割り当て、フォルダAssetsの初期ACLを取得します。次に、AddAccessRuleメソッドメンバータイプを使用して、$ACE変数を使用してアクセスルールを追加します:

$Acl = Get-Acl -Path "$dir\Assets"
$Acl.AddAccessRule($ACE)

これで、新しく作成されたACEをC:\Share\AssetsのACLに追加する準備が整いました。次に、Set-Aclを使用してこの新しいACEを適切なディレクトリに適用します:

Set-Acl -Path "$dir\Assets" -AclObject $Acl

次に、以下のコードを使用して、選択したユーザーが必要なディレクトリを表示するためのアクセス許可を持っているかを確認します。

(Get-Acl -Path "$dir\Assets").Access | Format-Table -Autosize

NTFSのアクセス権限を削除する方法について説明します。

リソースからNTFSのアクセス権限を削除する必要がある場合があります。

NTFSのアクセス権限を削除するには、まず対象のファイルまたはフォルダの現在のACLを取得します。この例では、ファイル名はClient_Projects.txtです。

$Acl = Get-Acl -Path "$dir\Client_Projects.txt"

次に、削除したい特定のACEをフィルタリングします。これは、$Aclメンバーオブジェクトを呼び出し、その結果をWhere-Objectといくつかのオペランドにパイプします。

$Ace = $Acl.Access | Where-Object {($_.IdentityReference -eq 'domain\user') -and -not ($_.IsInherited)}

次に、現在のACLセキュリティ記述子が含まれている$Acl変数を使用し、New-Objectコマンドレットを使用して作成したACEオブジェクトをRemoveAccessRule()メソッドに渡します。これにより、エントリが削除されます。

$Acl.RemoveAccessRule($Ace)

ここで既存のACLを変更したことを覚えておくことが重要です。この時点では変更はまだ確定されていません。

これらの変更を反映させるために、Set-Aclコマンドレットを実行し、-Pathおよび-AclObjectパラメータに適切な値("$dir\Client_Projects.txt"および$Acl)を指定します。以下のコマンドを入力した後、Enterキーを押してください。

Set-Acl -Path "$dir\Client_Projects.txt" -AclObject $Acl

ManageEngine ADManager Plusを使用して、Active Directory、Exchange、およびMicrosoft 365を管理およびレポートします。 無料トライアルをダウンロード!

要約

この記事では、PowerShellを使用してNTFSのアクセス許可を管理する方法について学びました。Get-AclおよびSet-Aclという2つのコマンドレットと、それらがNTFSのアクセス許可に対して行う操作について学びました。

また、上記のコマンドレットで使用するために、特定のACEをACLで対象とするためのフィルターの使い方も学びました。少し練習すれば、これまで以上に簡単にNTFSのアクセス許可リクエストを管理できるようになります。

さらなる参考資料

Source:
https://adamtheautomator.com/ntfs-permissions/