Ich habe den Netzwerk-Anmeldenamen eines Benutzers. Kann man von PowerShell und WMI eine gültige E-Mail für diesen Benutzer erhalten? Beachten Sie, dass sich der Anmeldename von dem Namen in der E-Mail unterscheidet. Daher kann ich den Anmeldenamen nicht einfach mit der E-Mail-Domäne kombinieren.
Der einfachste Weg ist, Active-Directory zu verwenden.
Da Sie das PowerShell-Tag und nicht PowerShell V2.0 verwenden, können Sie ADSI verwenden.
Clear-Host
$dn = New-Object System.DirectoryServices.DirectoryEntry ("LDAP://WM2008R2ENT:389/dc=dom,dc=fr","[email protected]","Pwd")
# Look for a user
$user2Find = "user1"
$Rech = new-object System.DirectoryServices.DirectorySearcher($dn)
$rc = $Rech.filter = "((sAMAccountName=$user2Find))"
$rc = $Rech.SearchScope = "subtree"
$rc = $Rech.PropertiesToLoad.Add("mail");
$theUser = $Rech.FindOne()
if ($theUser -ne $null)
{
Write-Host $theUser.Properties["mail"]
}
Sie können auch userPrincipalName
anstelle von sAMAccountName
im Filter verwenden. Für userPrincipalName
können Sie das Formular user @ domain verwenden.
Mit WMI : Wenn Sie es unbedingt mit WMI machen wollen.
$user2Find = "user1"
$query = "SELECT * FROM ds_user where ds_sAMAccountName='$user2find'"
$user = Get-WmiObject -Query $query -Namespace "root\Directory\LDAP"
$user.DS_mail
Sie können die zweite Lösung lokal auf Ihrem Server oder von einem Computer in der Domäne verwenden. Die Authentifizierung bei WMI außerhalb der Domäne ist jedoch etwas komplizierter.
Verwenden von PowerShell 2.0
Import-Module activedirectory
$user2Find = "user1"
$user = Get-ADUser $user2Find -Properties mail
$user.mail
Hier ist ein anderer möglicher Weg ( Originalquelle ):
PS> [adsisearcher].FullName
System.DirectoryServices.DirectorySearcher
PS> $searcher = [adsisearcher]"(objectClass=user)"
PS> $searcher
CacheResults : True
ClientTimeout : -00:00:01
PropertyNamesOnly : False
Filter : (objectClass=user)
PageSize : 0
PropertiesToLoad : {}
ReferralChasing : External
SearchScope : Subtree
ServerPageTimeLimit : -00:00:01
ServerTimeLimit : -00:00:01
SizeLimit : 0
SearchRoot :
Sort : System.DirectoryServices.SortOption
Asynchronous : False
Tombstone : False
AttributeScopeQuery :
DerefAlias : Never
SecurityMasks : None
ExtendedDN : None
DirectorySynchronization :
VirtualListView :
Site :
Container :
PS> $searcher = [adsisearcher]"(samaccountname=$env:USERNAME)"
PS> $searcher.FindOne().Properties.mail
Nicht WMI, aber das kann die Arbeit genauso gut machen:
PS> ([adsi]"WinNT://$env:USERDOMAIN/$env:USERNAME,user").Properties["mail"]