Photo by Fallon Michael / Unsplash
PowerShell - Tester si un objet AD existe

PowerShell - Tester si un objet AD existe

Published on 06 Nov 2018

Bastien Perez
Bastien Perez

Clap

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)"
}
Si vous utiliez une autre méthode pour chercher un objet, comme par exeple Get-ADUser -Filter, cela ne levera pas l'erreur. Dans ce cas, vous devez utiliser une des méthodes avec @ ou boolean présenté dans la section 'On Windows Server 2008/2008R2 ou Windows 7 ou avec -Filter'

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

Comments

banner-Bastien Perez
Bastien Perez

Freelance Microsoft 365 - Active Directory - Modern Workplace

France