Private/Check-UserGroupMembershipByEmail.ps1
function Check-UserGroupMembershipByEmail { <# .SYNOPSIS Checks if a user (by email) is a member of a specified group across multiple AD domains using ADSISearcher. .PARAMETER Email User email (matches `mail` attribute). .PARAMETER GroupCN Common name (CN) of the group to check (e.g., "test-token"). .PARAMETER Domains Array of domain DNS names to search, e.g., @("lab.company.com", "test.company.com"). .OUTPUTS $true if user is in the group, $false otherwise. #> [CmdletBinding()] param( [Parameter(Mandatory)][string] $Email, [Parameter(Mandatory)][string] $GroupCN, [Parameter(Mandatory)][string[]] $Domains ) # Escape email for LDAP filter $safeMail = $Email -replace '([\\*()\0])', { '\{0:x2}' -f [byte][char]$args[0].Value } # LDAP filter for enabled user by mail $ldapFilter = "(&(objectCategory=person)(objectClass=user)(mail=$safeMail)" + "(!(userAccountControl:1.2.840.113556.1.4.803:=2)))" foreach ($dnsDomain in $Domains) { # Convert DNS domain to DC= notation $dcParts = $dnsDomain -split '\.' | ForEach-Object { "DC=$_" } $nc = $dcParts -join ',' try { $searchRoot = [ADSI]"GC://$nc" $searcher = New-Object DirectoryServices.DirectorySearcher $searcher.SearchRoot = $searchRoot $searcher.SearchScope = 'Subtree' $searcher.PageSize = 100 $searcher.Filter = $ldapFilter $null = $searcher.PropertiesToLoad.Clear() $null = $searcher.PropertiesToLoad.AddRange(@("memberOf", "samAccountName", "distinguishedName")) $result = $searcher.FindOne() if ($result) { $memberof = $result.Properties["memberOf"] if ($memberof) { foreach ($groupDN in $memberof) { if ($groupDN -like "CN=$GroupCN,*") { return $true } } } return $false } } catch { Write-Warning "Error searching domain $dnsDomain : $_" } } Write-Verbose "User not found in any supplied domain." return $false } |