Private/Get-ADUserByMail.ps1
function Get-ADUserByMail { <# .SYNOPSIS Searches for a user by mail attribute across multiple domains using ADSISearcher. .PARAMETER Email The user’s email address. .PARAMETER Domains An array of DNS domain names (e.g., @("lab.company.com", "test.company.com")). .OUTPUTS The user’s distinguishedName as a [string], or $null if not found or ambiguous. #> param( [Parameter(Mandatory)][string]$Email, [Parameter(Mandatory)][string[]]$Domains ) $escapedEmail = $Email -replace '([\\*()\0])', { '\{0:x2}' -f [byte][char]$args[0].Value } $filter = "(&(objectCategory=person)(objectClass=user)" + "(mail=$escapedEmail)" + "(!(userAccountControl:1.2.840.113556.1.4.803:=2)))" $matchedUsers = @() foreach ($domain in $Domains) { try { $dcParts = $domain -split '\.' | ForEach-Object { "DC=$_" } $dcPath = $dcParts -join ',' $searchRoot = [ADSI]"GC://$dcPath" $searcher = New-Object DirectoryServices.DirectorySearcher $searcher.SearchRoot = $searchRoot $searcher.SearchScope = 'Subtree' $searcher.PageSize = 100 $searcher.Filter = $filter $searcher.PropertiesToLoad.Add("distinguishedName") | Out-Null $results = $searcher.FindAll() if ($results.Count -gt 0) { $matchedUsers += $results } } catch { Write-Warning "Error checking user in $domain : $_" } } if ($matchedUsers.Count -eq 1) { return $matchedUsers[0].Properties["distinguishedName"][0] } if ($matchedUsers.Count -gt 1) { Write-Warning "Multiple users matched for email '$Email'. Skipping." } else { Write-Verbose "User not found in any domain." } return $null } |