PowerShell スクリプトでファイルシステムの ACL を管理する方法
Aug 26, 2025
NTFS のアクセス制御リスト(ACL)は Windows のファイルシステムで最小権限のアクセスを強制し、PowerShell はそれらを管理するための効率的なツールを提供します。管理者は Get-Acl を使って権限を確認し、Set-Acl を使って権利を付与または削除し、PurgeAccessRules または SetAccessRuleProtection のような手法で明示的なエントリと継承を処理できます。スクリプトではフォルダーの所有権も変更できます。NTFS 権限の定期的な監査は data leakage を防ぎ、insider threat に対する防御を強化するうえで重要です。
Microsoft Windows 環境を持つ多くの組織では、機密データを含むストレージ デバイスの主要なファイルシステムとして NTFS に依存しています。これはユーザーがファイルを扱うための最も簡単な方法です。システムのセキュリティにおけるベストプラクティスである最小権限モデルを実装するために、IT セキュリティ担当者とシステム管理者は、NTFS ファイルサーバー上にアクセス制御エントリ(ACE)を追加することで、NTFS のアクセス制御リスト(ACL)を設定します。
ファイルおよびフォルダーの NTFS 権限の種類
NTFS のアクセス許可には、基本と詳細の両方があります。各アクセス許可を「許可」または「拒否」に設定できます。次は 基本的なアクセス許可:
- フル コントロール: ユーザーは、ファイルおよびディレクトリならびにそれらに関連するプロパティを、変更・追加・移動・削除できます。さらに、すべてのファイルおよびサブディレクトリのアクセス許可設定を変更することもできます。
- 変更: ユーザーは、ディレクトリにファイルを削除/追加したり、ファイルにファイル プロパティを追加したりすることを含め、ファイルおよびファイル プロパティを表示して変更できます。
- 読み取りと実行: ユーザーは、スクリプトを含む実行可能ファイルを実行できます
- 読み取り: ユーザーはファイル、ファイルのプロパティ、およびディレクトリを表示できます。
- 書き込み: ユーザーはファイルに書き込み、ディレクトリにファイルを追加できます。
以下は 高度な権限 の一覧です:
- フォルダーのトラバース/ファイルの実行: ユーザーは、これらのファイルまたはフォルダーに対する権限がない場合でも、フォルダーを移動して他のファイルまたはフォルダーに到達できます。ユーザーは実行可能ファイルも実行できます。フォルダーのトラバース権限は、グループまたはユーザーが Group Policy スナップインで「Bypass Traverse Checking」権限を持っていない場合にのみ有効になります。
- フォルダーの一覧表示/データの読み取り: ユーザーは、フォルダー内のファイルおよびサブフォルダーの一覧と、ファイルの内容を表示できます。
- 属性の読み取り: ユーザーは、読み取り専用かどうか、または非表示かどうかなど、ファイルまたはフォルダーの属性を表示できます。
- 属性の書き込み:ユーザーはファイルまたはフォルダーの属性を変更できます。
- 拡張属性の読み取り: ユーザーは、アクセス許可や作成日時・更新日時など、ファイルまたはフォルダーの拡張属性を表示できます。
- 拡張属性の書き込み: ユーザーはファイルまたはフォルダーの拡張属性を変更できます。
- ファイルの作成/データの書き込み: 「Create Files(ファイルの作成)」のアクセス許可により、ユーザーはフォルダー内にファイルを作成できます。(このアクセス許可はフォルダーのみに適用されます。)「Write Data(データの書き込み)」のアクセス許可により、ユーザーはファイルを変更し、既存のコンテンツを上書きできます。(このアクセス許可はファイルのみに適用されます。)
- フォルダーの作成/データの追加: 「フォルダーの作成」権限により、ユーザーはフォルダー内にフォルダーを作成できます。(この権限はフォルダーにのみ適用されます。)「データの追加」権限により、ユーザーはファイルの末尾を変更できますが、既存のデータを変更・削除・上書きすることはできません。(この権限はファイルにのみ適用されます。)
- 削除: ユーザーはファイルまたはフォルダーを削除できます。(ファイルまたはフォルダーに「削除」権限がない場合でも、親フォルダーに「サブフォルダーとファイルの削除」権限があれば削除できます。)
- 読み取り権限: ユーザーは、「完全な制御」、「読み取り」、「書き込み」など、ファイルまたはフォルダーの権限を読み取れます。
- 権限の変更: ユーザーはファイルまたはフォルダーの権限を変更できます。
- 所有権の取得: ユーザーはファイルまたはフォルダーの所有権を取得できます。ファイルまたはフォルダーの所有者は、そのファイルまたはフォルダーを保護する既存の権限が何であっても、常にその権限を変更できます。
- 同期:ユーザーはオブジェクトを同期に使用できます。これにより、スレッドはオブジェクトが通知済み(signaled)の状態になるまで待機できるようになります。この権限は ACL Editor には表示されません。詳細は こちら を参照してください。
次の PowerShell スクリプトを実行すると、これらすべてのユーザー権限を確認できます:
[system.enum]::getnames([System.Security.AccessControl.FileSystemRights])
NTFS の権限は、明示的なもの、または継承されたもののいずれかです。明示的な権限は個別に設定された権限であり、継承された権限は親フォルダーから継承される権限です。権限の階層は次のとおりです:
- 明示的な拒否
- 明示的な許可
- 継承の拒否
- 継承の許可
NTFS のアクセス許可が何であるかを理解したところで、次はそれらを管理する方法を見ていきましょう。
Netwrix Directory Manager で権限管理を効率化
特定のファイルやフォルダーにアクセスできるのは、権限のあるユーザーのみとします
ファイルとフォルダーの ACL を取得
ファイルとフォルダーの権限を管理するために使用される最初の PowerShell コマンドレットは「get-acl」です。これは、すべてのオブジェクト権限を一覧表示します。たとえば、オブジェクトパス「\fs1sharedsales”:
get-acl \fs1sharedsales | fl
PowerShell 経由で NTFS 権限レポート の全体を取得したい場合は、 NTFS 権限を CSV にエクスポートする ためのこの簡単な手順を参照してください。
ファイルとフォルダーの権限をコピーする
権限をコピーするには、ユーザーはソースフォルダーとターゲットフォルダーの両方を所有している必要があります。次のコマンドは、「Accounting」フォルダーの権限を「Sales」フォルダーにコピーします:
get-acl \fs1sharedaccounting | Set-Acl \fs1sharedsales
権限コピーの前後で「get-acl」コマンドの出力を見ると、「Sales」共有フォルダーの権限が変更されたことがわかります。
ファイルおよびフォルダーのアクセス許可を設定する
PowerShell の “set-acl” cmdlet は、ファイル、フォルダー、またはレジストリ キーなど、指定した項目のセキュリティ記述子(security descriptor)を変更するために使用します。つまり、ファイルまたはフォルダーのアクセス許可を変更するためのものです。次のスクリプトは、ユーザー “ENTERPRISET.Simpson” に対してフォルダー “Sales” の “FullControl” 権限を “Allow” に設定します:
$acl = Get-Acl \fs1sharedsales
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("ENTERPRISET.Simpson","FullControl","Allow")
$acl.SetAccessRule($AccessRule)
$acl | Set-Acl \fs1sharedsales
ユーザーやセキュリティ グループに対して他のアクセス許可を設定したい場合は、下の表から選択してください:
適用できる基本的なアクセス権の権限セットもあります:
ユーザーのアクセス許可を削除する
権限を削除するには、「RemoveAccessRule」パラメーターを使用します。ここでは、T.Simpson が「Sales」フォルダーに対して持つ「Allow FullControl」権限を削除しましょう:
$acl = Get-Acl \fs1sharedsales
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("ENTERPRISET.Simpson","FullControl","Allow")
$acl.RemoveAccessRule($AccessRule)
$acl | Set-Acl \fs1sharedsales
T.Simpson に「Deny FullControl」権限がまだ残っていることに注目してください。これを削除するには、「PurgeAccessRules」コマンドを使用します。これにより、T.Simpson の「Sales」フォルダーに対する権限が完全に消去されます:
$acl = Get-Acl \fs1sharedsales
$usersid = New-Object System.Security.Principal.Ntaccount ("ENTERPRISET.Simpson")
$acl.PurgeAccessRules($usersid)
$acl | Set-Acl \fs1sharedsales
「PurgeAccessRules」は、文字列のユーザー名では動作しません。SID のみで動作します。そこで、ユーザー アカウント名を文字列から SID に変換するために「Ntaccount」クラスを使用しました。なお、「PurgeAccessRules」は明示的な権限に対してのみ機能し、継承された権限は消去しない点にも注意してください。
権限の継承を無効化または有効化
継承を管理するには、「SetAccessRuleProtection」メソッドを使用します。これは次の2つのパラメーターを持ちます:
- 最初のパラメーターは、親フォルダーからの継承をブロックする役割を担います。状態は 2 つあり、「$true」と「$false」です。
- 2 つ目のパラメーターは、現在継承されている権限を保持するのか、削除するのかを決定します。同じ 2 つの状態があり、「$true」と「$false」です。
「Sales」フォルダーの継承を無効にし、継承されている権限もすべて削除してみましょう:
$acl = Get-Acl \fs1sharedsales
$acl.SetAccessRuleProtection($true,$false)
$acl | Set-Acl \fs1sharedsales
これでアクセス権は 1 つだけ残っています(明示的に追加されたため)。継承されていた権限はすべて削除されました。
この変更を元に戻し、「Sales」フォルダーの継承を再度有効にしましょう:
$acl = Get-Acl \fs1sharedsales
$acl.SetAccessRuleProtection($false,$true)
$acl | Set-Acl \fs1sharedsales
ファイルおよびフォルダーの所有権を変更する
フォルダーの所有者を設定するには、「SetOwner」メソッドを実行する必要があります。「ENTERPRISEJ.Carter」を「Sales」フォルダーの所有者にしましょう:
$acl = Get-Acl \fs1sharedsales
$object = New-Object System.Security.Principal.Ntaccount("ENTERPRISEJ.Carter")
$acl.SetOwner($object)
$acl | Set-Acl \fs1sharedsales
ここでも、ユーザー アカウント名を文字列から SID に変換するために「Ntaccount」クラスを使用していることに注目してください。
「SetOwner」メソッドでは、任意のアカウントに所有者を変更することはできません。対象のアカウントには「Take Ownership」「Read」「Change Permissions」権限が必要です。
ご覧のとおり、 PowerShell で NTFS 権限を管理する のはとても簡単です。とはいえ、NTFS 権限も必ず監査してください。ファイル サーバーに対して行われたすべての変更を追跡することは、データ漏えいを減らし、インサイダー脅威やその他の IT セキュリティ リスクに対抗するうえで重要です。次に PowerShell で NTFS 権限を監査する方法 の基本的な手順を示します。
初心者向け PowerShell スクリプト入門チュートリアル
詳しく見る共有する
もっと詳しく
著者について
Jeff Melnick
システムエンジニアリング ディレクター
Jeff は Netwrix における Global Solutions Engineering の元ディレクターです。彼は長年にわたり Netwrix のブログ執筆者であり、講演者、プレゼンターとしても活躍しています。Netwrix のブログでは、Jeff がシステム管理の体験を大きく改善できるライフハックや、役立つヒント、ちょっとしたコツを共有しています。