1. ホーム
  2. powershell

[解決済み] PowerShell NTFSの高度なパーミッションの設定

2022-02-18 08:55:22

質問

Windowsのセキュリティ設定の「詳細」タブで定義されているNTFSのパーミッションを適用しようとしています。1つのACL $RuleThis folder only と、もうひとつは Subfolders and files only .

以下のように、パーミッションが大きく変更されています。

(Get-Acl 'L:\Test\Beez\RAPJOUR\Appels List\Correct').Access

FileSystemRights  : FullControl
AccessControlType : Allow
IdentityReference : BUILTIN\Administrators
IsInherited       : False
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : None

FileSystemRights  : CreateFiles, AppendData, DeleteSubdirectoriesAndFiles, ReadAndExecute, Synchronize
AccessControlType : Allow
IdentityReference : Domain\Dirk
IsInherited       : False
InheritanceFlags  : None
PropagationFlags  : None

FileSystemRights  : DeleteSubdirectoriesAndFiles, Modify, Synchronize
AccessControlType : Allow
IdentityReference : Domain\Dirk
IsInherited       : False
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : InheritOnly

<イグ

  • を除いてすべてオンになっています。フルコントロール、属性書き込み、拡張属性書き込み、削除、権限変更、所有権取得を除くすべてをオンにします。

  • を除き、すべてオンになっています。フルコントロール、パーミッションの変更、オーナーシップの取得を除くすべてをオンにします。

これは、パーミッションを適用するために使用するコードの一部です。この場合、以下の部分で定義する必要があります。 Change :

 $f = 'L:\Test\Beez\RAPJOUR\Appels List\Wrong'
 $ADobject = 'Domain\User'
 $acl = Get-Acl $f

 $Grant = 'Change'
    # Remove user/group first
    $rule = New-Object system.security.AccessControl.FileSystemAccessRule("$ADobject","Read",,,"Allow")
    $acl.RemoveAccessRuleAll($rule)

    # Add read permissions
    if ($Grant -eq 'ReadAndExecute') {
        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("$ADobject", "ReadAndExecute", "ContainerInherit, ObjectInherit", "None", "Allow")
    }

    if ($Grant -eq 'Change') {
        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("$ADobject", "Modify", "ContainerInherit, ObjectInherit", "Synchronize", "Allow  DeleteSubdirectoriesAndFiles")
        $acl.AddAccessRule($rule)
        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("$ADobject", "AppendData", "ContainerInherit, ObjectInherit", "ReadAndExecute","Synchronize", "Allow  CreateFiles","DeleteSubdirectoriesAndFiles")
    }

    if ($Grant -eq 'Modify') {
        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("$ADobject", "Modify", "ContainerInherit, ObjectInherit", "None", "Allow")
    }

    if ($Grant -eq 'FullControl') {
        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("$ADobject", "FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")
    }

    if ($Grant -eq 'ListFolderContents') {
        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("$ADobject", "ReadAndExecute", "ContainerInherit", "None", "Allow")
    }

$acl.AddAccessRule($rule)
Set-Acl $f $acl

構文がうまくいかないのですが・・・。よろしくお願いします。

おかげさまで ポスト の部品はもう見つけた。

  • サブフォルダとファイルのみ」。 "ContainerInherit, ObjectInherit", "InheritOnly"
  • このフォルダーのみ」。 "None", "InheritOnly"

解決方法は?

Windowsのオブジェクトアクセス許可は、以下の方法で制御されます。 アクセス制御リスト (ACL) のリストで構成され、基本的には アクセスコントロールエントリ (ACE)といいます。各ACEは、アクセスを許可するか拒否するか、ACEが誰に適用されるか、ACEが親オブジェクトから継承されたかどうか、子オブジェクトに継承されるべきかどうかを制御する属性の集合である。

のドキュメントを見てみると FileSystemAccessRule クラスでは、コンストラクタが 5 つのパラメータを受け取ることがわかります。

  • IdentityReference / String : ACE が適用される受託者(ユーザー、グループ、コンピュータ、...)を識別するオブジェクトまたは文字列。
  • FileSystemRights : 実際の パーミッション を許可または拒否します。
  • InheritanceFlags : このオブジェクトから権限を継承するオブジェクトの種類を制御するためのフラグです(コンテナ、リーフオブジェクト、またはなし)。
  • PropagationFlags : 制御するフラグ プロパゲーション のパーミッションがあります。フラグ InheritOnly は、現在のオブジェクトがACEを受け取ることを免除する。フラグ NoPropagateInherit は、継承を直系の子オブジェクトに制限する。
  • AccessControlType : は タイプ のACE(allowまたはdeny)。

さて、ある受託者に複数のアクセス権を割り当てたい場合、個々のACEでそれを行うことができます。

$acl  = Get-Acl $path
$ace1 = New-Object Security.AccessControl.FileSystemAccessRule 'DOMAIN\user',
        'ListDirectory', 'ContainerInherit, ObjectInherit', 'InheritOnly',
        'Allow'
$acl.AddAccessRule($ace1)
$ace2 = New-Object Security.AccessControl.FileSystemAccessRule 'DOMAIN\user',
        'ReadAttributes', 'ContainerInherit, ObjectInherit', 'InheritOnly',
        'Allow'
$acl.AddAccessRule($ace2)
...

または、パーミッションをカンマ区切りの文字列として提供する。

$acl = Get-Acl $path
$ace = New-Object Security.AccessControl.FileSystemAccessRule 'DOMAIN\user',
       'ListDirectory, ReadAttributes, ...', 'ContainerInherit,  ObjectInherit',
       'InheritOnly', 'Allow'
$acl.AddAccessRule($ace)

ただし、同じACEでパーミッションの付与と拒否ができないことに注意してください。特定のアクセス権を拒否したい場合は、別のACEでそれを行う必要があります。

$acl  = Get-Acl $path
$ace1 = New-Object Security.AccessControl.FileSystemAccessRule 'DOMAIN\user',
        'Modify', 'ContainerInherit, ObjectInherit', 'InheritOnly',
        'Allow'
$acl.AddAccessRule($ace1)
$ace2 = New-Object Security.AccessControl.FileSystemAccessRule 'DOMAIN\user',
        'CreateDirectories', 'ContainerInherit, ObjectInherit', 'InheritOnly',
        'Deny'
$acl.AddAccessRule($ace2)
...

また、明示的なパーミッションは継承されたパーミッションより優先されることに注意してください。 Deny よりも優先されます。 Allow .