Get-acl重复组 - Powershell

时间:2014-10-17 15:05:52

标签: powershell

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

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

有一个小组会重复3次。我检查了NTFS权限,这个组只分配了一次。以下是输出。对此有何帮助? :(

testdiomin\testgroup
testdiomin\testgroup
testdiomin\testgroup
BUILTIN\Administrators

只是要添加,我检查了文件夹的高级安全性,并且该组被分配一次。如果我从命令中取出ft,则重复组的所有属性看起来都相同!

3 个答案:

答案 0 :(得分:2)

我有一个测试文件夹,我给了用户允许和拒绝权限。在Windows中,如果我只看文件夹的安全选项卡,我会看到用户列出一次。但是,当我在该特定用途上使用Get-Acl时,我看到权限被打破了。是的,用户被多次列出,但FileSystemRightsAccessControlType不同。你应该在没有get-acl '\\Testserver\test' | % {$_.access}的情况下运行Format-Table,你会看到我在说什么。

上面描述的我自己文件夹中的一些截断样本输出。

get-acl 'c:\temp\new folder' | Select-Object -ExpandProperty access 

FileSystemRights  : ReadExtendedAttributes, ReadAttributes
AccessControlType : Deny
IdentityReference : BA\sslvpn
IsInherited       : False
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : None

..........

FileSystemRights  : ReadData, ExecuteFile, Synchronize
AccessControlType : Allow
IdentityReference : BA\sslvpn
IsInherited       : False
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : None

如您所见,单个用户列出两次。在安全性>下的Windows资源管理器文件/文件夹中也说明了这一点。高级。

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

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

答案 1 :(得分:1)

正如马特已经提到的那样,这取决于如何构建[System.Security.AccessControl.FileSystemAccessRule]。创建访问控制规则时,必须指定5个内容。那些是:

  • 用户: Security.Principal.NTAccount对象,这类似于' Domain \ TMTech'
  • 权利: Security.AccessControl.FileSystemRights对象,你知道,Read,Write,DeleteSubdirectoriesAndFiles ......你可以做一个[enum] :: GetNames([Security.AccessControl.FileSystemRights])来看看你的选择。
  • 继承: Security.AccessControl.InheritanceFlags对象,影响其中的文件和文件夹如何继承此规则
  • Propegation: System.Security.AccessControl.PropagationFlags对象,与Inhertence非常相似,但这仅适用于容器内的对象,而不适用于容器本身。
  • 输入: Security.AccessControl.AccessControlType对象,这只是允许或拒绝

尽管如此,由于有很多东西可以设置为访问规则,因此可以为同一个用户显示两个以上的项目,特别是如果你有单独的允许和拒绝规则,以及不同的Inheritence和Propegation规则设置。例如允许用户读取文件夹的属性以及其中的所有对象的属性,但仅允许用户更改其中对象的属性。这是一个具有继承性的规则,另一个具有Propegation设置。然后,您设置了拒绝规则,以便他们无法删除任何内容,并且会出现第三条规则。

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

答案 2 :(得分:1)

Get-Acl返回的安全描述符将包含自由选择的ACL(控制访问)和系统ACL(控制审计),其方式比Windows 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 AUTHORITY\SYSTEM                                          False ContainerInherit, ObjectInherit InheritOnly
        Modify, Synchronize             Allow NT AUTHORITY\SYSTEM                                          False                            None        None
                  268435456             Allow BUILTIN\Administrators                                       False ContainerInherit, ObjectInherit InheritOnly
        Modify, Synchronize             Allow BUILTIN\Administrators                                       False                            None        None
                -1610612736             Allow BUILTIN\Users                                                False ContainerInherit, ObjectInherit InheritOnly
ReadAndExecute, Synchronize             Allow BUILTIN\Users                                                False                            None        None
                  268435456             Allow NT SERVICE\TrustedInstaller                                  False                ContainerInherit InheritOnly
                FullControl             Allow NT SERVICE\TrustedInstaller                                  False                            None        None
ReadAndExecute, Synchronize             Allow APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES       False                            None        None
                -1610612736             Allow APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES       False ContainerInherit, ObjectInherit InheritOnly

如果您将该输出与ACL编辑器提供的输出进行比较,您会注意到ACE的数量不匹配,例如,'用户&应该有一个条目#39;而不是Get-Acl的输出显示的两个。请注意上面如何将友好文本权利中的某些数字权利混合在一起?这些被称为通用权利,它们是定义四组权限的捷径:Read,Execute,Write,All。它们是一种快捷方式,因为它们根据ACE所属的对象类型(即文件/文件夹,注册表项,服务,打印机,AD对象等)进行不同的翻译,但您可以使用这四种用于描述每种类型对象的基本相同的位。

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

IdentityReference              FileSystemRights                   InheritanceFlags     PropagationFlags
-----------------              ----------------                   ----------------     ----------------
BUILTIN\Users                       -1610612736    ContainerInherit, ObjectInherit          InheritOnly
BUILTIN\Users       ReadAndExecute, Synchronize                               None                 None

从通用权限转换为FileSystemRights时,-1610612736值表示ReadAndExecute, Synchronize。翻译完成后,请注意两个ACE在Type(允许),IdentityReference(BUILTIN \ Users)和FileSystemRights(ReadAndExecute,Synchronize)中匹配。唯一不匹配的是InheritanceFlags和PropagationFlags。第一个具有ContainerInherit, ObjectInherit继承标志,这意味着ACE将应用于子文件夹和文件,以及InheritOnly传播标志,这意味着ACE将不会应用于文件夹本身。第二个ACE没有继承或传播标志,这意味着它只适用于文件夹本身。这意味着您可以将它们逻辑地组合到一个ACE中,该ACE将ReadAndExecute Users授予将应用于文件夹,子文件夹和文件的PS> Get-AccessControlEntry C:\Windows DisplayName : C:\Windows Owner : NT SERVICE\TrustedInstaller 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 SERVICE\TrustedInstaller FullControl <not inherited> O CC AccessAllowed APPLICATION PACKAGE ReadAndExecute, Synchronize <not inherited> O CC CO AUTHORITY\ALL APPLICATION PACKAGES

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

可用的模块here试图以ACL编辑器的方式显示信息。这是C:\ Windows的输出结果:

{{1}}

可以下载的当前版本并不总是在对ACE进行分组时对其进行逻辑分组(它不会将ACE在“应用程序”和“#39;可以将其权利结合起来的区域)。在将来的版本中寻找它。