Note
The function used in this answer was rewritten as a binary cmdlet and published to the Gallery. There is no longer a dependency on the Active Directory Module.
If you want to try out the Module version, first install it:
Install-Module ADEffectiveAccess -Scope CurrentUser
Then the usage is similar to what's shown below however you can use the cmdlet itself for filtering, see the Usage section for details.
This is pretty close to what you're looking for. Source for more details. Access Control Lists with Get-ACL are not as easy to read as Effective Access on Advanced Security Settings and I don't think there is a way around that. I do think that, once used to it, Get-ACL gives a lot more details when you know what you're looking for \ filter the ACLs to get what you're looking for.
Code
function Get-EffectiveAccess {
[CmdletBinding()]
param(
[Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)]
[ValidatePattern('(?:(CN=([^,]*)),)?(?:((?:(?:CN|OU)=[^,]+,?)+),)?((?:DC=[^,]+,?)+)$')]
[alias('DistinguishedName')]
[string] $Identity,
[parameter()]
[alias('Domain')]
[string] $Server
)
begin {
$guid = [guid]::Empty
$GUIDMap = @{}
if($PSBoundParameters.ContainsKey('Server')) {
$domain = Get-ADRootDSE -Server $Server
}
else {
$domain = Get-ADRootDSE
}
$params = @{
SearchBase = $domain.schemaNamingContext
LDAPFilter = '(schemaIDGUID=*)'
Properties = 'name', 'schemaIDGUID'
ErrorAction = 'SilentlyContinue'
}
$adObjParams = @{
Properties = 'nTSecurityDescriptor'
}
if($PSBoundParameters.ContainsKey('Server')) {
$params['Server'] = $Server
$adObjParams['Server'] = $Server
}
$schemaIDs = Get-ADObject @params
$params['SearchBase'] = "CN=Extended-Rights,$($domain.configurationNamingContext)"
$params['LDAPFilter'] = '(objectClass=controlAccessRight)'
$params['Properties'] = 'name', 'rightsGUID'
$extendedRigths = Get-ADObject @params
foreach($i in $schemaIDs) {
if(-not $GUIDMap.ContainsKey([guid] $i.schemaIDGUID)) {
$GUIDMap.Add([guid] $i.schemaIDGUID, $i.name)
}
}
foreach($i in $extendedRigths) {
if(-not $GUIDMap.ContainsKey([guid] $i.rightsGUID)) {
$GUIDMap.Add([guid] $i.rightsGUID, $i.name)
}
}
}
process {
try {
$adObjParams['Identity'] = $Identity
$object = Get-ADObject @adObjParams
foreach($acl in $object.nTSecurityDescriptor.Access) {
if($guid.Equals($acl.ObjectType)) {
$objectType = 'All Objects (Full Control)'
}
elseif($GUIDMap.ContainsKey($acl.ObjectType)) {
$objectType = $GUIDMap[$acl.ObjectType]
}
else {
$objectType = $acl.ObjectType
}
if($guid.Equals($acl.InheritedObjectType)) {
$inheritedObjType = 'Applied to Any Inherited Object'
}
elseif($GUIDMap.ContainsKey($acl.InheritedObjectType)) {
$inheritedObjType = $GUIDMap[$acl.InheritedObjectType]
}
else {
$inheritedObjType = $acl.InheritedObjectType
}
[PSCustomObject]@{
Name = $object.Name
IdentityReference = $acl.IdentityReference
AccessControlType = $acl.AccessControlType
ActiveDirectoryRights = $acl.ActiveDirectoryRights
ObjectType = $objectType
InheritedObjectType = $inheritedObjType
InheritanceType = $acl.InheritanceType
IsInherited = $acl.IsInherited
}
}
}
catch {
$PSCmdlet.WriteError($_)
}
}
}
Examples
- Get the Effective Access of the Organizational Unit named
ExampleOU:
Get-ADOrganizationalUnit -Filter "Name -eq 'ExampleOU'" |
Get-EffectiveAccess | Out-GridView
- Get the Effective Access of the Organizational Unit named
ExampleOU on a Trusted Domain:
Get-ADOrganizationalUnit -Filter "Name -eq 'ExampleOU'" -Server trustedDomain |
Get-EffectiveAccess -Server trustedDomain | Out-GridView
- Same as above but using the OU's
DistinguishedName attribute:
Get-EffectiveAccess -Identity 'OU=ExampleOU,DC=domainName,DC=com' | Out-GridView
- Store the Effective Access of the group named
exampleGroup in a variable:
$effectiveAccess = Get-ADGroup exampleGroup | Get-EffectiveAccess
- Get the Effective Access of the first 10 OUs found in the Domain:
Get-ADOrganizationalUnit -Filter * | Select -First 10 |
Get-EffectiveAccess | Out-GridView
Sample
For reference, this is how Full Control looks like with Get-ACL

Compared with BUILTIN\Administrators which has write permissions on this OU but not Full Control

Get-Aclshould give you that information. Use the grouping operator (..) to expose that code property.(Get-ACL .\).Access. Can you clarify what you mean by "effective permissions"?All Objects (Full Control)in the ACL you're showing means full control over theActiveDirectoryRights, it is not the same as Effective Access on Advanced Security Settings. Compare the result of anIdentityReferencethe you know has full control with the one you're showing, you'll see the difference. In addition, you're not showing if there is other ACL denyingFull Controlover thatIdentityReference. As I said in my answer, you need to know how to read the output ofGet-ACL.