J'ai le nom de connexion réseau d'un utilisateur. De PowerShell et de WMI, est-il possible d’obtenir un email valide pour cet utilisateur? Notez que le nom de connexion est différent du nom de l'e-mail, je ne peux donc pas simplement combiner le nom de connexion avec le domaine de messagerie.
Le moyen le plus simple est d'utiliser Active-Directory.
Comme vous utilisez le tag PowerShell et non PowerShell V2.0, vous pouvez utiliser ADSI.
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"]
}
Vous pouvez également utiliser userPrincipalName
au lieu de sAMAccountName
dans le filtre. Pour userPrincipalName
, vous pouvez utiliser le formulaire user @ domain.
Utilisation de WMI : Si vous voulez absolument le faire avec WMI.
$user2Find = "user1"
$query = "SELECT * FROM ds_user where ds_sAMAccountName='$user2find'"
$user = Get-WmiObject -Query $query -Namespace "root\Directory\LDAP"
$user.DS_mail
Vous pouvez utiliser la deuxième solution localement sur votre serveur ou à partir d'un ordinateur du domaine, mais l'authentification auprès de WMI depuis l'extérieur du domaine est un peu plus compliquée.
Utilisation de PowerShell 2.0
Import-Module activedirectory
$user2Find = "user1"
$user = Get-ADUser $user2Find -Properties mail
$user.mail
Voici un autre moyen possible ( source originale ):
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
Pas WMI, mais cela peut faire le travail aussi bien:
PS> ([adsi]"WinNT://$env:USERDOMAIN/$env:USERNAME,user").Properties["mail"]