获取acl重复组-Powershell



我正试图在同一域中的远程服务器上使用以下PowerShell命令获取分配给文件夹的组列表:

get-acl '\Testservertest' | % {$_.access} | ft IdentityReference -HideTableHeaders

发生的情况是,有一组被重复了3次。我检查了NTFS权限,该组只分配了一次。下面是输出。有什么帮助吗?:(

testdiomintestgroup
testdiomintestgroup
testdiomintestgroup
BUILTINAdministrators

只是补充一下,我检查了文件夹的高级安全性,这个组被分配了一次。如果我去掉ft命令,重复组的所有属性看起来都是相同的!

我有一个测试文件夹,在其中我向用户授予了允许和拒绝权限。在windows中,如果我只看文件夹的安全选项卡,我会看到用户列出一次。然而,当我在该特定对象上使用Get-Acl时,我会看到权限崩溃。是的,用户被多次列出,但FileSystemRightsAccessControlType不同。你应该在没有Format-Table的情况下运行get-acl '\Testservertest' | % {$_.access},你就会明白我在说什么。

上面描述了我自己的文件夹中的一些截断的示例输出。

get-acl 'c:tempnew folder' | Select-Object -ExpandProperty access 
FileSystemRights  : ReadExtendedAttributes, ReadAttributes
AccessControlType : Deny
IdentityReference : BAsslvpn
IsInherited       : False
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : None
..........
FileSystemRights  : ReadData, ExecuteFile, Synchronize
AccessControlType : Allow
IdentityReference : BAsslvpn
IsInherited       : False
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : None

正如您所看到的,单个用户被列出两次。这也在"安全">"高级"下的"Windows资源管理器文件/文件夹"属性中进行了说明。

如果你只是在寻找名称,而不关心权限本身,你可以使用-Unique

get-acl 'c:tempnew folder' | Select-Object -ExpandProperty access | Select IdentityReference -Unique | Ft -HideTableHeaders

Get-Acl返回的安全描述符将以比Windows Acl编辑器(在文件夹属性的"安全"选项卡上获得的视图)更未经过滤的方式包含自由Acl(控制访问)和系统Acl(控制审核)。换句话说,ACL编辑器正试图帮助您,并以更易于使用的格式显示信息。一个应该在任何Windows系统上工作的简单例子是检查实际的Windows文件夹(实际上有几个不同的文件夹和注册表项,你可以在其中看到):

PS> Get-Acl C:Windows | select -exp access | Format-Table
           FileSystemRights AccessControlType IdentityReference                                      IsInherited                InheritanceFlags Propagation
                                                                                                                                                       Flags
           ---------------- ----------------- -----------------                                      -----------                ---------------- -----------
                  268435456             Allow CREATOR OWNER                                                False ContainerInherit, ObjectInherit InheritOnly
                  268435456             Allow NT AUTHORITYSYSTEM                                          False ContainerInherit, ObjectInherit InheritOnly
        Modify, Synchronize             Allow NT AUTHORITYSYSTEM                                          False                            None        None
                  268435456             Allow BUILTINAdministrators                                       False ContainerInherit, ObjectInherit InheritOnly
        Modify, Synchronize             Allow BUILTINAdministrators                                       False                            None        None
                -1610612736             Allow BUILTINUsers                                                False ContainerInherit, ObjectInherit InheritOnly
ReadAndExecute, Synchronize             Allow BUILTINUsers                                                False                            None        None
                  268435456             Allow NT SERVICETrustedInstaller                                  False                ContainerInherit InheritOnly
                FullControl             Allow NT SERVICETrustedInstaller                                  False                            None        None
ReadAndExecute, Synchronize             Allow APPLICATION PACKAGE AUTHORITYALL APPLICATION PACKAGES       False                            None        None
                -1610612736             Allow APPLICATION PACKAGE AUTHORITYALL APPLICATION PACKAGES       False ContainerInherit, ObjectInherit InheritOnly

如果将该输出与ACL编辑器提供的输出进行比较,您会注意到ACE的数量不匹配,例如,应该有一个"Users"条目,而不是Get-ACL输出显示的两个条目。请注意上面是如何将一些数字权限和友好的文本权限混合在一起的?这些被称为通用权限,它们是定义四组权限的快捷方式:读取、执行、写入、全部。它们是一种快捷方式,因为根据ACE所属对象的类型(即文件/文件夹、注册表项、服务、打印机、AD对象等),它们的翻译方式不同,但您可以使用这四位来描述每种类型的对象的基本相同的内容。

无论如何,ACL编辑器正在将通用权限转换为特定于对象的权限,然后查看是否有任何ACE可以逻辑地分组在一起。让我们举一个例子。在上面的输出中,"用户"有两个ACE:

IdentityReference              FileSystemRights                   InheritanceFlags     PropagationFlags
-----------------              ----------------                   ----------------     ----------------
BUILTINUsers                       -1610612736    ContainerInherit, ObjectInherit          InheritOnly
BUILTINUsers       ReadAndExecute, Synchronize                               None                 None

当从一般权限转换为FileSystemRights时,-1610612736值表示ReadAndExecute, Synchronize。翻译完成后,请注意这两个ACE在Type(Allow)、IdentityReference(BUILTIN\Users)和FileSystemRights(ReadAndExecute、Synchronize)中匹配。唯一不匹配的是InheritanceFlags和PropagationFlags。第一个具有ContainerInherit, ObjectInherit继承标志,这意味着ACE将应用于子文件夹和文件,以及InheritOnly传播标志,这表示ACE将不应用于文件夹本身。第二个ACE没有继承或传播标志,这意味着它将只应用于文件夹本身。这意味着您可以将它们逻辑地组合到一个ACE中,该ACE授予将应用于文件夹、子文件夹和文件的ReadAndExecuteUsers

所以,这可能很正常。不过,您需要查看Access属性的原始输出来确认这一点。

这里有一个可用的模块,它试图以ACL编辑器的方式显示信息。以下是C:\Windows:的输出

PS> Get-AccessControlEntry C:Windows

    DisplayName      : C:Windows
    Owner            : NT SERVICETrustedInstaller
    DACL Inheritance : Disabled

AceType             Principal                      AccessMask                     InheritedFrom        AppliesTo                     
-------             ---------                      ----------                     -------------        ---------                     
AccessAllowed       CREATOR OWNER                  FullControl                    <not inherited>        CC CO                       
AccessAllowed       SYSTEM                         FullControl                    <not inherited>        CC CO                       
AccessAllowed       SYSTEM                         Modify, Synchronize            <not inherited>      O                             
AccessAllowed       Administrators                 FullControl                    <not inherited>        CC CO                       
AccessAllowed       Administrators                 Modify, Synchronize            <not inherited>      O                             
AccessAllowed       Users                          ReadAndExecute, Synchronize    <not inherited>      O CC CO                       
AccessAllowed       NT SERVICETrustedInstaller    FullControl                    <not inherited>      O CC                          
AccessAllowed       APPLICATION PACKAGE            ReadAndExecute, Synchronize    <not inherited>      O CC CO                       
                    AUTHORITYALL APPLICATION                                                                                                  
                    PACKAGES                                                                                                                   

可供下载的当前版本并不总是在可以分组的情况下对ACE进行逻辑分组(它不会对"AppliesTo"区域中相等的、可以合并其权限的ACE进行分组)。在未来的版本中寻找它。

正如Matt已经谈到的,这归结为[System.Security.AccessControl.FileSystemAccessRule]的构建方式。当你创建一个访问控制规则时,你必须指定5件事。它们是:

  • 用户:Security.Principal.NTAccount对象,这类似于"Domain\TMTech"
  • 权限:Security.AccessControl.FileSystemRights对象,您知道,读取、写入、删除子目录和文件。。。您可以执行[enum]::GetNames([Security.AccessControl.FileSystemRights])来查看您的选项
  • 继承:Security.AccessControl.InheritanceFlags对象,影响此对象中的文件和文件夹继承此规则的方式
  • 属性:System.Security.AccessControl.PropagationFlags对象,与Inertence非常相似,只是它只适用于容器中的对象,而不适用于容器本身
  • 类型:Security.AccessControl.AccessControlType对象,这只是Allow或Deny

话虽如此,由于有太多的东西可以设置为访问规则,因此很有可能为同一用户显示两个以上的项目,特别是如果您有单独的允许和拒绝规则,以及不同的继承和属性规则设置。例如允许用户读取文件夹的属性,以及文件夹属性中的所有对象,但只允许用户更改文件夹中对象的属性。这是一个具有继承性的规则,也是一个具有属性设置的规则。然后你设置了一个拒绝规则,这样他们就不能删除任何内容,还有第三个规则会显示给他们。

ACL很快就会变得极其复杂。实际上,我手头有一个代码片段,只是为了帮助我记住所有这些,以便在我必须深入处理ACL时使用,而不仅仅是从一个对象复制到另一个对象,或者简单地从某个对象中删除规则。以下是我为自己保留的:

$colRights = [System.Security.AccessControl.FileSystemRights]"Read, Write, Modify, DeleteSubdirectoriesAndFiles" 
$InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]::None 
$PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None 
$objType =[System.Security.AccessControl.AccessControlType]::Allow 
$objUser = New-Object System.Security.Principal.NTAccount("DigitalGhost$strOwnerName") 
$objACE = New-Object System.Security.AccessControl.FileSystemAccessRule `
    ($objUser, $colRights, $InheritanceFlag, $PropagationFlag, $objType) 
$objACL = Get-ACL "Z:ACLSource" 
$objACL.AddAccessRule($objACE) 
#If the output path doesn't exist, make it quietly.
If(!(Test-Path "z:$strOwnerName")){$null = New-Item "Z:$strOwnerName" -ItemType directory}

Set-ACL "Z:$strOwnerName" $objACL

最新更新