public/Get-ADGroupMembership.ps1
#Requires -Module ActiveDirectory <# .SYNOPSIS Module for performing recursive lookup of the groups to which an AD object belongs. .DESCRIPTION Use this module to perform a lookup of all global groups to which an object belongs, both direct and recursive. This requires the AtiveDirectory module .EXAMPLE Get-ADGroupMembership -Identity someName -Recursive .PARAMETER Identity This parameter is required and must be in the form of valid SAMAccountName. If you wish to search a computer account, use must use the SAMAccountName with the trailing '$' $Identity = 'someName' .PARAMETER PageSize This parameter is optional and sets the size of the search set and must be in the form of valid integer. The defualt is 1000. $PageSize = 1000 .PARAMETER Recursive This parameter is optional. It is a switch that will perform a recursive search of all global groups. The default returns only direct membership. .NOTES Project: https://github.com/tmknight/TMK-CoreModules #> Function Get-ADGroupMembership { [CmdletBinding()] Param( ## Identity, required. [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, Position = 0)] [string]$Identity, [Parameter(Mandatory = $false, Position = 1)] [int]$PageSize = 1000, ## Perform recursive search [Parameter(Mandatory = $false, Position = 2)] [switch]$Recursive ) Begin { ## Setup LDAP search $strDN = { SAMAccountName -like $Identity } $objDomain = New-Object System.DirectoryServices.DirectoryEntry $objSearcher = New-Object System.DirectoryServices.DirectorySearcher $objSearcher.SearchRoot = $objDomain $objSearcher.PageSize = $PageSize $objSearcher.SearchScope = 'Subtree' $objSearcher.Filter = $strDN $colProplistUsr = 'name' } Process { try { ## User or computer switch -RegEx ($Identity) { '\$$' { $usr = (Get-ADComputer -Filter $strDN).DistinguishedName } Default { $usr = (Get-ADUser -Filter $strDN).DistinguishedName } } ## Direct or recursive membership if ($Recursive.IsPresent) { $strGroup = "(&(objectCategory=group)(member:1.2.840.113556.1.4.1941:=$usr))" } else { $strGroup = "(&(objectCategory=group)(member=$usr))" } ForEach ($u in $colProplistUsr) { $objSearcher.PropertiesToLoad.Add($u) | Out-Null } $objSearcher.Filter = $strGroup $colProplistGrp = 'name' ForEach ($g in $colProplistGrp) { $objSearcher.PropertiesToLoad.Add($g) | Out-Null } $obj = @() $colResultsGrp = $objSearcher.FindAll() ForEach ($objResultGrp in $colResultsGrp) { $vars = 'objItemGrp', 'grpDN', 'name', 'sid' Remove-Variable $vars -ErrorAction SilentlyContinue $objItemGrp = $objResultGrp.Properties $grpDN = $objItemGrp.adspath -replace 'LDAP://' $name = $($objItemGrp.name) if ($grpDN -match 'OU=Mail') { $sid = 'Mail Group' } else { try { $sid = (Get-ADGroup "$name" -ErrorAction SilentlyContinue).SID if ($sid -notmatch 'S-1-5') { $sid = 'unknown' } } catch { $sid = 'unknown' } } $obj += [PSCustomObject] @{ Name = "$name" DN = "$grpDN" SID = $sid } } if (-not $obj) { Write-Warning "$Identity is not a member of any AD groups" } } catch { Return $_ } } End { Return $obj | Sort-Object Name } } |