【问题标题】:PowerShell Setting advanced NTFS permissionsPowerShell 设置高级 NTFS 权限
【发布时间】:2014-12-20 00:12:36
【问题描述】:

我正在尝试应用在 Windows 安全设置的“高级”选项卡中定义的 NTFS 权限。一个 ACL $Rule 用于 This folder only,另一个 ACL 用于 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

我似乎无法正确使用语法。谢谢您的帮助。

感谢post 我已经找到了以下部分:

  • '仅子文件夹和文件':"ContainerInherit, ObjectInherit", "InheritOnly"
  • '仅此文件夹':"None", "InheritOnly"

【问题讨论】:

    标签: powershell permissions ntfs


    【解决方案1】:

    Windows 中的对象访问权限是通过Access Control Lists (ACL) 控制的,它基本上由Access Control Entries (ACE) 的列表组成。每个 ACE 都是一组属性,用于控制是授予还是拒绝访问、ACE 适用于谁、ACE 是否继承自父对象以及是否应由子对象继承。

    如果您查看 FileSystemAccessRule 类的文档,您会发现“完整”构造函数采用 5 个参数:

    • IdentityReference/String:一个对象或字符串,用于标识 ACE 适用的受托者(用户、组、计算机等)。
    • FileSystemRights:实际的permissions 被授予或拒绝。
    • InheritanceFlags:用于控制哪些对象类型从该对象(容器、叶对象或无)继承权限的标志。
    • PropagationFlags:控制propagation 权限的标志。标志InheritOnly 使当前对象免于接收ACE。标志 NoPropagateInherit 将继承限制为直接子对象。
    • AccessControlType:ACE 的type(允许或拒绝)。

    现在,如果您想为给定的受托人分配多个访问权限,您可以使用单个 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

    【讨论】:

    • 感谢您的帮助 Ansgar。这意味着我们不需要将它放入Array 格式,但它也被接受为'Value1, Value2, Value3, ...' 格式的字符串。很高兴知道:)
    • 轻微更正:InheritanceFlags 控制哪些类型的子对象将继承 ACE(对于文件系统,这些标志控制屏幕截图中“应用到:”下拉框的子文件夹和/或文件部分)。 PropagationFlags 控制 ACE 是否将应用于对象本身和/或 ACE 是否将应用于孙子(对于文件系统,这些标志控制“应用于:”框的“此文件夹”部分,和/或屏幕截图中的“仅将这些权限应用于此容器中的对象和/或容器”复选框)。
    • @RohnEdwards 确实如此。感谢您的指正。固定。
    【解决方案2】:

    当你与世界问题作斗争时,你知道它是怎么回事。从你发布问题的那一刻起,5分钟后你就找到了答案……

    感谢Frode F. 对另一个问题的回答,我找到了解决自己问题的方法。我必须将FileSystemRights 行的输出复制到$Correct.Access 中并将其粘贴到Array 中,如下所示:

     $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("$ADobject", @("CreateFiles", "AppendData", "DeleteSubdirectoriesAndFiles"," ReadAndExecute", "Synchronize"), "None", "InheritOnly", "Allow") # This folder only   
     $acl.AddAccessRule($rule)
     $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("$ADobject", @("DeleteSubdirectoriesAndFiles", "Modify", "Synchronize"), "ContainerInherit, ObjectInherit", "InheritOnly", "Allow") # Subfolders and files only
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      • 2019-01-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多