Given a filter value, this PowerShell function will query Active Directory to find a matching user object and store results in a memory cache. By default “samAccountName” is used for filter. Optional field name can be provided to filter by any field such as Manager, Mail, or DN.
Cheers!

Source Code
https://github.com/spjeff/spadmin/blob/master/lookupADUser.ps1
# DataTable cache $cacheUsers = New-Object System.Data.DataTable("users") $cols = @("DistinguishedName","Enabled","extensionAttribute4","Manager","Name","Mail","SamAccountName") foreach ($col in $cols) { $cacheUsers.Columns.Add($col) | Out-Null } # Find user by any field Function lookupADUser ($login, $optFieldName) { # Filter $dv = New-Object System.Data.DataView($cacheUsers) $filter = "SamAccountName = '$login'" if ($optFieldName) { $filter = $filter.Replace("SamAccountName", $optFieldName) } $dv.RowFilter = $filter # Return from cache if ($dv.Count -gt 0) { # Found return $dv } else { # Insert $cmd = "SamAccountName -eq '$login'" if ($optFieldName) { $cmd = $cmd.Replace("SamAccountName", $optFieldName) } $sb = [Scriptblock]::Create($cmd) $user = Get-ADUser -Filter $sb -Properties extensionAttribute4,manager,enabled,Mail if ($user) { $row = $cacheUsers.NewRow() foreach ($col in $cols) { $row[$col] = $user.$col } $cacheUsers.Rows.Add($row) | Out-Null return $dv } else { return $null } } } # Search by userID $sb = {lookupADUser "userID"} measure-command $sb |ft # Search by Email $sb = {lookupADUser "first_last@company.com" "Mail"} measure-command $sb |ft # Search by DN $sb = {lookupADUser "CN=First Last,OU=Regular,OU=Accounts,DC=company,DC=com" "DistinguishedName"} measure-command $sb |ft
Screenshot
