使用PowerShell有效访问Active Directory对象

使用PowerShell有效访问Active Directory对象,powershell,active-directory,Powershell,Active Directory,我正在尝试获取某些active directory用户对各种active directory对象的有效权限。我可以从UI中看到这些权限- 我正在尝试使用Powershell获取此信息。我已经尝试了dsacl和Get acl,但它们没有提供有效的权限。它们都给出了“谁拥有访问权/权限”,这与“谁拥有什么有效权限”不同。这些也没有列出所有能够提供有效访问上下文的细节 任何关于如何以编程方式实现这一点的建议都将不胜感激 更新- 这里的有效权限意味着根据继承或在不同级别设置的其他规则,实际上允许对象拥有

我正在尝试获取某些active directory用户对各种active directory对象的有效权限。我可以从UI中看到这些权限-

我正在尝试使用Powershell获取此信息。我已经尝试了
dsacl
Get acl
,但它们没有提供有效的权限。它们都给出了“谁拥有访问权/权限”,这与“谁拥有什么有效权限”不同。这些也没有列出所有能够提供有效访问上下文的细节

任何关于如何以编程方式实现这一点的建议都将不胜感激

更新-

这里的有效权限意味着根据继承或在不同级别设置的其他规则,实际上允许对象拥有哪些权限

比如说-

下面示例中的所有属性在Get ACL中都不可见。

Get Acl显示的另一个例子是,在解析ObjectType和InheritedObjectType(使用Santiago Squarzon提到的Get-effective access函数)中的值后,我通过Get Acl获取了其中一个OU上的域管理员权限-

当UI显示有效访问时-


我的最终目标是使用powershell获得上述屏幕截图中的所有权限。

这与您要查找的内容非常接近。更多细节。带有
Get ACL
的访问控制列表不像高级安全设置上的有效访问那么容易阅读,我认为没有办法解决这个问题。我确实认为,一旦习惯了它,
Get ACL
会在您知道要查找的内容时提供更多详细信息\过滤ACL以获取您要查找的内容

代码 用法 默认情况下,该函数将过滤所有孤立ACL。使用
IncludeOrphan
开关包括所有以
S-1-*

编辑 作为参考,这是使用
获取ACL时完全控制的样子

内置\Administrators相比,后者对此OU具有写入权限,但不具有完全控制权


您可以尝试模块,我想本模块的详细信息将在功能
获取有效访问
中介绍。这将有助于您获取信息。该模块已从中删除。我不确定您如何能够从Github安装该模块,我无法尝试,因为我正在使用Mac。

获取Acl
应该会向您提供该信息。使用分组运算符(..)公开该代码属性<代码>(获取ACL.\).Access
。您能澄清一下“有效权限”是什么意思吗?
您显示的ACL中的所有对象(完全控制)
表示完全控制
ActiveDirectoryRights
,它与高级安全设置上的有效访问不同。将
IdentityReference
的结果与显示的结果进行比较,您将看到差异。此外,您没有显示是否有其他ACL拒绝对该
标识引用的
完全控制
。正如我在回答中所说,您需要知道如何读取
Get ACL
的输出。这是域控制器的唯一条目。它没有任何否认规则。我没有包括身份参考,因为我想避免审查图像。两个屏幕截图都显示了相同身份引用的结果。仅供参考,我编辑了我的答案,向您展示了与WriteDACL相比完全控制的效果。感谢您提供信息和代码。这非常有用。根据我的初始测试,通过解析ObjectType和InheritedObjectType中的值,这提供了比解析更多的信息。它仍然无法获得您可以在有效访问中看到的权限。此外,对于get acl,此函数使用的权限(如Write ObjectSid、Read ObjectSid等)不可见。(将更新问题)另外,像Write属性这样的属性不能准确地告诉我哪些属性是用户授予的访问权限,而哪些属性被拒绝。
Function Get-EffectiveAccess {
[CmdletBinding()]
param(
    [Parameter(
        Mandatory,
        ValueFromPipelineByPropertyName
    )]
    [ValidatePattern(
        '(?:(CN=([^,]*)),)?(?:((?:(?:CN|OU)=[^,]+,?)+),)?((?:DC=[^,]+,?)+)$'
    )][string]$DistinguishedName,
    [switch]$IncludeOrphan
)

    begin
    {
        # requires -Modules ActiveDirectory
        $ErrorActionPreference = 'Stop'
        $GUIDMap = @{}
        $domain = Get-ADRootDSE
        $z = '00000000-0000-0000-0000-000000000000'
        $hash = @{
            SearchBase = $domain.schemaNamingContext
            LDAPFilter = '(schemaIDGUID=*)'
            Properties = 'name','schemaIDGUID'
            ErrorAction = 'SilentlyContinue'
        }
        $schemaIDs = Get-ADObject @hash 

        $hash = @{
            SearchBase = "CN=Extended-Rights,$($domain.configurationNamingContext)"
            LDAPFilter = '(objectClass=controlAccessRight)'
            Properties = 'name','rightsGUID'
            ErrorAction = 'SilentlyContinue'
        }
        $extendedRigths = Get-ADObject @hash

        foreach($i in $schemaIDs)
        {
            if(-not $GUIDMap.ContainsKey([System.GUID]$i.schemaIDGUID))
            {
                $GUIDMap.add([System.GUID]$i.schemaIDGUID,$i.name)
            }
        }
        foreach($i in $extendedRigths)
        {
            if(-not $GUIDMap.ContainsKey([System.GUID]$i.rightsGUID))
            {
                $GUIDMap.add([System.GUID]$i.rightsGUID,$i.name)
            }
        }
    }

    process
    {
        $result = [system.collections.generic.list[pscustomobject]]::new()
        $object = Get-ADObject $DistinguishedName
        $acls = (Get-ACL "AD:$object").Access
        
        foreach($acl in $acls)
        {
            
            $objectType = if($acl.ObjectType -eq $z)
            {
                'All Objects (Full Control)'
            }
            else
            {
                $GUIDMap[$acl.ObjectType]
            }

            $inheritedObjType = if($acl.InheritedObjectType -eq $z)
            {
                'Applied to Any Inherited Object'
            }
            else
            {
                $GUIDMap[$acl.InheritedObjectType]
            }

            $result.Add(
                [PSCustomObject]@{
                    Name = $object.Name
                    IdentityReference = $acl.IdentityReference
                    AccessControlType = $acl.AccessControlType
                    ActiveDirectoryRights = $acl.ActiveDirectoryRights
                    ObjectType = $objectType
                    InheritedObjectType = $inheritedObjType
                    InheritanceType = $acl.InheritanceType
                    IsInherited = $acl.IsInherited
            })
        }
        
        if(-not $IncludeOrphan.IsPresent)
        {
            $result | Sort-Object IdentityReference |
            Where-Object {$_.IdentityReference -notmatch 'S-1-*'}
            return
        }

        return $result | Sort-Object IdentityReference
    }
}
PS \> Get-ADOrganizationalUnit -Filter {Name -eq 'ExampleOU'} | Get-EffectiveAccess | Out-GridView
PS \> Get-EffectiveAccess -DistinguishedName 'OU=ExampleOU,DC=domainName,DC=com' | Out-GridView
PS \> $effectiveAccess = Get-ADGroup exampleGroup | Get-EffectiveAccess -IncludeOrphan
PS \> Get-ADOrganizationalUnit -Filter * | Select -First 10 | Get-EffectiveAccess | Out-GridView