Point d’attention sur le module AD
Lors du développement de scripts PowerShell pour Active Directory, il est souvent utile de tester si un objet AD (utilisateur, ordinateur, groupe) existe ou non.
Premièrement, il faut installer le module Active Directory.
Sur les dernières versions de PowerShell livrées avec Windows Server 2012 R2, 2016 et 2019, la non-existence d’un objet dans l’AD provoque une erreur qu’il est possible de gérer avec un try/catch.
Cependant, le fonctionnement est différent sur les anciennes versions. La gestion des erreurs bloquantes en PowerShell étant parfois capricieuses, on pourrait tenter en ajoutant paramètre -ErrorAction Stop
pour forcer l’arrêt… belle tentative mais cela ne fonctionne pas.
Cet article présente donc les différents méthodes afin tester l’existence d’un utilisateur dans un Active Directory avec PowerShell en fonction de la version.
Sur un serveur 2012/2012R2/2016/2019 ou Windows 8/8.1/10
Avec PowerShell 3.0 et supérieur, il est possible d'utiliser les CMDlets Get-ADUser
/ Get-ADComputer
/ Get-ADGroup
/ Get-ADObject
et gérer l'erreur.
En cas d’erreur, une exception sera levée, il est donc possible de la gérer avec try/catch
:
try {
$ADUser = Get-ADUser -Identity $user -ErrorAction Stop
} catch {
Write-Warning "An error occured: $($_.Exception.Message)"
}
Sur Windows 2008/2008R2 ou Windows 7 ou avec -Filter
Pour les anciennes versions de PowerShell (1.0 ou 2.0), les CMDlets Get-AD*
(Get-ADComputer
, Get-ADUser
, Get-ADGroup
, Get-Object
, etc.) ne lèvent pas d’erreur d’exécution, donc la partie catch
n’est jamais exécutée. Cela pose donc un problème évident de non gestion des erreurs.
Pour pallier ce problème, vous pouvez utiliser l’une des méthodes présentés ci-dessous.
Méthode 1 – caster en array
Caster la valeur retournée en array en utilisant la notation @() et vérifier la propriété .Count. Si elle est égale à 0, l’utilisateur n’existe pas, sinon il existe :
if (@(Get-ADUser -Filter {SamAccountName -eq "xxx"}).Count -eq 0) {
Write-Warning -Message "User xxx does not exist."
}
Méthode 2 – caster en booléen
Caster la valeur retournée en booléen avec la notation [bool]. Un booléen peut être TRUE ou FALSE (respectivement représenté par 0
ou 1
).
# existing account
$samAccountName = 'Administrator'
[bool] (Get-ADUser -Filter {sAMAccountName -eq 'Administrator'} # return TRUE
# nonexisting account
[bool] (Get-ADUser -Filter {sAMAccountName -eq 'toto'} # return TRUE
# Note : si une variable est utilisée dans le paramètre Filter, le filtre doit être différent (chaine de caractères au lieu de {} )
# existing account $samAccountName = 'Administrator'
[bool] (Get-ADUser -Filter "sAMAccountName -eq '$($samAccountName)'") # return TRUE
# nonexisting account $SamAccountName = 'toto'
[bool] (Get-ADUser -Filter "sAMAccountName -eq '$($samAccountName)'") # return FALSE
Clap
Comments