PowerShell を使用して ACL 権限を管理する方法
- PowerShell における NTFS 権限タイプ
-
PowerShell でフォルダーやファイルの ACL を取得するために
Get-Acl
コマンドを使用する -
PowerShell でファイルやフォルダーの ACL を設定するために
Set-Acl
コマンドを使用する -
PowerShell でユーザー権限を削除するために
-RemoveAccessRule
パラメーターを使用する - PowerShell で権限の継承を無効または有効にする
-
PowerShell でファイルとフォルダーの所有権を変更するために
SetOwner
メソッドを使用する

システム管理者は、最小特権モデルを実装するために、NTFS ファイルサーバーにアクセス制御エントリ(ACE)を追加することで NTFS アクセス制御リスト(ACL)を構成します。
この記事では、さまざまな権限タイプと、PowerShell を使用してファイルやフォルダーの ACL を照会、変更、削除する方法を学びます。
PowerShell における NTFS 権限タイプ
高度な NTFS 権限と基本的な NTFS 権限の両方があります。たとえば、各権限を「拒否」または「許可」に設定できます。
フルコントロール
: この権限を持つユーザーは、ファイルやディレクトリ、及びそれに関連するプロパティを変更、追加、移動、削除できます。また、この権限を持つユーザーは、すべてのサブディレクトリやファイルの権限設定を変更できます。変更
: この権限を持つユーザーは、ファイルやファイルプロパティを表示および変更でき、ディレクトリにファイルを追加したり、ファイルのプロパティを削除したりできます。読み取りと実行
: この権限を持つユーザーは、実行可能ファイルを実行できます(スクリプトを含む)。読み取り
: この権限を持つユーザーは、ファイル、ファイルプロパティ、およびディレクトリを表示できます。書き込み
: この権限を持つユーザーは、ファイルに書き込み、ディレクトリにファイルを追加できます。
高度な権限のリストは次のとおりです。
フォルダーを横断
またはファイルを実行
: この高度な権限を持つユーザーは、ファイルやフォルダーに対する権限がなくても、他のフォルダーやファイルに到達するためにフォルダーを移動できます。この高度な権限を持つユーザーは、実行可能ファイルも実行できます。「フォルダーを横断」権限は、ユーザーまたはグループに「トラバーサーチをバイパス」する権利がない場合に適用されます。フォルダーのリスト
またはデータの読み取り
: この高度な権限を持つユーザーは、フォルダー内のファイルやサブフォルダーのリストとファイルの内容を表示できます。属性の読み取り
: この高度な権限を持つユーザーは、フォルダーまたはファイルの属性(隠し属性や読み取り専用かどうかなど)を表示できます。属性の書き込み
: この高度な権限を持つユーザーは、ファイルまたはフォルダーの属性を変更できます。拡張属性の読み取り
: この高度な権限を持つユーザーは、フォルダーまたはファイルの拡張属性(権限、作成および変更時刻など)を表示できます。拡張属性の書き込み
: この高度な権限を持つユーザーは、フォルダーまたはファイルの拡張属性を変更できます。ファイルの作成
またはデータの書き込み
: 「ファイルの作成」権限は、ユーザーがこの高度な権限を持つフォルダー内でファイルを作成できるようにします。「この権限は、フォルダーのみに適用されます。」 「データの書き込み」権限は、この高度な権限を持つユーザーがファイルを変更し、既存の内容を上書きできるようにします。この権限はファイルのみに適用されます。フォルダーの作成
またはデータの追加
: 「フォルダーの作成」権限は、ユーザーがこの高度な権限を持つフォルダー内でフォルダーを作成できるようにします。「この権限は、フォルダーのみに適用されます。」 「データの追加」権限は、この高度な権限を持つユーザーがファイルの末尾に変更を加えることを可能にしますが、既存のデータを変更、上書き、または削除することはできません。この権限はファイルのみに適用されます。削除
: この高度な権限を持つユーザーは、フォルダーまたはファイルを削除できます。ユーザーがフォルダーまたはファイルに対して「削除」権限を持っていない場合でも、親フォルダーに「サブフォルダーとファイルを削除」権限を持っていればオブジェクトを削除できます。権限の読み取り
: この高度な権限を持つユーザーは、フォルダーまたはファイルの権限(フルコントロール
、読み取り
、書き込み
など)を読み取ることができます。権限の変更
: この高度な権限を持つユーザーは、ファイルまたはフォルダーの権限を変更できます。所有権の取得
: この高度な権限を持つユーザーは、ファイルまたはフォルダーの所有権を取得できます。ファイルまたはフォルダーの所有者は、ファイルまたはフォルダーを保護する既存の権限に関係なく、その権限を常に変更できます。同期
: この高度な権限を持つユーザーは、オブジェクトを同期に使用できます。この権限により、スレッドはオブジェクトがシグナル状態になるまで待機します。この権限は ACL エディターには表示されません。
以下の PowerShell スクリプトを実行することで、これらのユーザー権限に関するすべての情報を見つけることができます。
[System.Enum]::GetNames([System.Security.AccessControl.FileSystemRights])
NTFS 権限は明示的または継承的のいずれかです。明示的な権限は個別に構成され、継承された権限は親フォルダーから継承されます。
権限の階層は次のとおりです。
- 明示的拒否
- 明示的許可
- 継承拒否
- 継承許可
PowerShell でフォルダーやファイルの ACL を取得するために Get-Acl
コマンドを使用する
ファイルとフォルダーの権限を管理するために使用される最初の PowerShell コマンドは Get-Acl
です。すべてのオブジェクトの権限をリストします。
Get-Acl \\fs1\shared\hr | fl
ユーザーは、権限をコピーするためにターゲットとソースの両方のフォルダーの所有者である必要があります。
Get-Acl \\fs1\shared\hr | Set-Acl \\fs1\shared\hr
PowerShell でファイルやフォルダーの ACL を設定するために Set-Acl
コマンドを使用する
PowerShell の Set-Acl
コマンドは、ファイル、フォルダー、またはレジストリキーといった特定の項目のセキュリティ記述子を変更するために使用されます。言い換えれば、ファイルやフォルダーの権限を変更するために使用されます。
$acl = Get-Acl \\fs1\shared\hr
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("ENTERPRISE\User01", "FullControl", "Allow")
$acl.SetAccessRule($AccessRule)
$acl | Set-Acl \\fs1\shared\hr
PowerShell でユーザー権限を削除するために -RemoveAccessRule
パラメーターを使用する
$acl = Get-Acl \\fs1\shared\hr
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("ENTERPRISE\User01", "FullControl", "Allow")
$acl.RemoveAccessRule($AccessRule)
$acl | Set-Acl \\fs1\shared\hr
PowerShell で権限の継承を無効または有効にする
継承を管理するために、SetAccessRuleProtection
メソッドを使用できます。このメソッドには 2つのパラメーターがあります。
- 最初のパラメーターは、親フォルダーからの継承をブロックする役割があります。これはブール値の状態(
$true
と$false
)を返します。 - 2 番目のパラメーターは、現在の継承権限が削除されるか保持されるかを指定します。これもブール値の状態(
$true
と$false
)を返します。
$acl = Get-Acl \\fs1\shared\hr
$acl.SetAccessRuleProtection($true, $false)
$acl | Set-Acl \\fs1\shared\hr
この変更を元に戻し、フォルダーの継承を再度有効にしましょう。
$acl = Get-Acl \\fs1\shared\hr
$acl.SetAccessRuleProtection($false, $true)
$acl | Set-Acl \\fs1\shared\hr
PowerShell でファイルとフォルダーの所有権を変更するために SetOwner
メソッドを使用する
フォルダーの所有者を設定したい場合は、SetOwner
メソッドを実行する必要があります。
$acl = Get-Acl \\fs1\shared\hr
$object = New-Object System.Security.Principal.Ntaccount("ENTERPRISE\User01")
$acl.SetOwner($object)
$acl | Set-Acl \\fs1\shared\hr
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn