組織のファイルシステムのアクセス許可の設定に苦労しているITプロフェッショナルの方へ、朗報です。多くのユーザーやグループと作業する場合、GUIを使用してNTFSのアクセス許可を管理するのは時間がかかります。幸いなことに、PowerShellがあります。どのようにしてかと言いますと、Microsoft.PowerShell.Securityモジュールを利用することです。
PowerShellには、ACLを操作するための2つのコマンドレット、Get-ACL
とSet-ACL
があります。これらのコマンドレットを使用すると、任意の数のNTFSのアクセス許可を取得および割り当てることができます。このチュートリアルでは、NTFSのアクセス許可の管理を効率化し、すぐに役立つスキルを身につけることができます。
読む時間がない場合は問題ありません!下記のTechSnips.ioのAnthony Howellによる動画をご覧ください。
ManageEngine ADManager Plusを使用してActive Directory、Exchange、およびMicrosoft 365を管理およびレポートします。無料トライアルをダウンロード!
前提条件
このチュートリアルの例に従うには、以下が必要です:
- PowerShell 7またはWindows PowerShell 5.1
- A basic understanding of NTFS file and folder permissions
テスト用のファイル/フォルダの作成
このチュートリアルは、単一のフォルダーまたは「ラボ」を中心に構築されます。NTFSのアクセス許可をPowerShellで基礎から学びます。あなたの側で追加の作業は必要ありません。
- まず、管理者としてPowerShellセッションを開いてください。
- ファイルシステムのどこかに、Shareという名前の空のフォルダーを作成してください。以下の例では、そのフォルダーがC:\Shareにあると仮定しています。これにより、例が短く、追いやすくなります。以下のコードをコピーしてこのディレクトリを作成できます:
3. C:\Share\Assetsという名前のフォルダーを作成してください。
4. C:\Shareフォルダーにclient_list.txtという名前のファイルを作成してください。
5. C:\Shareフォルダーにclient_projects.txtという名前のファイルを作成してください。
6. 次に、変数を作成してShareフォルダーのパスを指定します。変数を作成すると、入力を削減し、パスの再利用が容易になります。C:\Shareを使用していると仮定して、以下のコード例をPowerShellセッションにコピーしてください:
7. Enterキーを押してください。これで空のディレクトリが作成され、そのパスが変数として保存されました。
Get-Aclを使用してNTFSのアクセス許可を表示する
PowerShellでは、Get-Acl
コマンドレットを使用してNTFSのアクセス許可を簡単に表示することができます。次のセクションでは、ファイルまたはフォルダーのNTFSのアクセス許可を表示する方法を学びます。
NTFSのアクセス許可の表示
従来、ACLを表示するには、C:\Shareフォルダを右クリックし、プロパティをクリックし、セキュリティタブを選択し、詳細ボタンをクリックする必要がありました。以下にGUIがアクセス許可を表示する例を示します。

上記の例では、いくつかのアクセス許可エントリとプロパティが番号付けされています。このセクションの後で比較するため、注意深く確認してください。
以前に作成したディレクトリを使用して、Get-Acl
を使用してディレクトリの現在のNTFSアクセス許可を表示します。
次のスクリーンショットに、パス、所有者、アクセスレベルの詳細が表示されます。

上のスクリーンショットに表示されているAccess
プロパティには、ACLに関する追加情報が含まれていますが、FullControlの末尾に表示されている三点リーダーによって画面からはみ出しています。以前のコマンドを丸括弧で囲むことで、Access
オブジェクトのプロパティを表示するためのより良い方法があります。以下のコードを実行して、このオブジェクトでAccess
プロパティのみを検索します。
上記のコマンドは、
Access
オブジェクトを使用し、-ExpandProperties
パラメータを使用して次のように表現することもできます:Get-Acl -Path $dir | Select-Object -ExpandProperty Access
以下のスクリーンショットに示すように、出力はコマンドを個別に見るのが簡単になるように折り返されます。

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

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

アクセスオブジェクトのフィルタリング
NTFSのアクセス許可を特定する際に、より正確にしたい場合があります。その場合、PowerShellを使用して特定のACEをフィルタリングしたり、ACL内で継承または明示的なNTFSのアクセス許可を持つ特定の結果を見つけたりすることができます。目で1行ずつターミナルウィンドウをスクロールする代わりに、フィルタリングを行うためにWhere-Object
コマンドレットを使用することができます。
以下のコード例では、NTFSのアクセス許可を継承していないオブジェクトをフィルタリングしています。これは、Where-Object
を使用して、-Not
オペランドを使用してパイプライン内の現在のオブジェクトを見ている$_.
メンバーオブジェクトのプロパティIsInherited
を使用して行われます。これは、ACEが継承の結果であり、明示的に設定されていないことを示します。
オブジェクトを
Format-Table -AutoSize
にパイプすることを忘れずに。そうしないと出力が画面からスクロールしてしまいます。これを新しい習慣にしてください。後で感謝されるでしょう!
以下のコードを使用して、'USERNAME'
を別のユーザー名に置き換えて特定の結果を表示します。
以下は、結果の例です:

上記の例は、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の権限が正しく設定されています。

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

Client_List.txtからNTFSの権限をClient_Projects.txtにコピーする必要があります。これを行うには、Client_List.txtからACLを取得し、Set-Acl
コマンドレットの-AclObject
パラメータを使用します。以下のコードを実行すると、Client_List.txtのACL全体がClient_Projects.txtにコピーされます:
以下の番号付きスクリーンショットで確認できるように、Client_Projects.txtファイルには、Client_List.txtと同じセキュリティディスクリプタが設定されています。
- 既存のファイルからACLを取得します。
- コピーしたACLオブジェクトをファイルまたはフォルダに設定します。
- ACLが正しくファイルまたはフォルダにコピーされたことを確認します。

Client_Projects.txtファイルのACLが、Client_List.txtファイルのIdentityReference列とAccessControlTypeがAllowに設定されたものと同じであることがわかります。同じテクニックをフォルダに対してもNTFSの権限を割り当てるために使用します。
NTFSの権限の追加
前のセクションでは、既存のNTFSのアクセス許可を1つのファイルオブジェクトから別のオブジェクトにコピーしました。今回は、NTFSのアクセス許可をゼロから作成します。これにより、ファイルまたはフォルダに割り当てられるNTFSのアクセス許可を割り当てることができます。
まず、Set-Acl
で使用する新しいオブジェクトのプロパティを作成するためのいくつかの変数を割り当てます。この方法で行うと、コマンドを実行する際に少し簡単になります。以下のコードは、ファイルまたはフォルダに割り当てられるNTFSのアクセス許可となるACEのプロパティを構築します:
次に、変数を1つ割り当て、フォルダAssets
の初期ACLを取得します。次に、AddAccessRule
メソッドメンバータイプを使用して、$ACE
変数を使用してアクセスルールを追加します:
これで、新しく作成されたACEをC:\Share\Assets
のACLに追加する準備が整いました。次に、Set-Acl
を使用してこの新しいACEを適切なディレクトリに適用します:
次に、以下のコードを使用して、選択したユーザーが必要なディレクトリを表示するためのアクセス許可を持っているかを確認します。
NTFSのアクセス権限を削除する方法について説明します。
リソースからNTFSのアクセス権限を削除する必要がある場合があります。
NTFSのアクセス権限を削除するには、まず対象のファイルまたはフォルダの現在のACLを取得します。この例では、ファイル名はClient_Projects.txt
です。
次に、削除したい特定のACEをフィルタリングします。これは、$Acl
メンバーオブジェクトを呼び出し、その結果をWhere-Object
といくつかのオペランドにパイプします。
次に、現在のACLセキュリティ記述子が含まれている$Acl
変数を使用し、New-Object
コマンドレットを使用して作成したACEオブジェクトをRemoveAccessRule()
メソッドに渡します。これにより、エントリが削除されます。
ここで既存のACLを変更したことを覚えておくことが重要です。この時点では変更はまだ確定されていません。
これらの変更を反映させるために、Set-Acl
コマンドレットを実行し、-Path
および-AclObject
パラメータに適切な値("$dir\Client_Projects.txt"
および$Acl
)を指定します。以下のコマンドを入力した後、Enterキーを押してください。
ManageEngine ADManager Plusを使用して、Active Directory、Exchange、およびMicrosoft 365を管理およびレポートします。 無料トライアルをダウンロード!
要約
この記事では、PowerShellを使用してNTFSのアクセス許可を管理する方法について学びました。Get-Acl
およびSet-Acl
という2つのコマンドレットと、それらがNTFSのアクセス許可に対して行う操作について学びました。
また、上記のコマンドレットで使用するために、特定のACEをACLで対象とするためのフィルターの使い方も学びました。少し練習すれば、これまで以上に簡単にNTFSのアクセス許可リクエストを管理できるようになります。