Tester l’authentification d’un compte AD avec PowerShell
I. Présentation
Dans ce tutoriel, nous allons voir comment tester l'authentification d'un compte AD avec PowerShell, afin de vérifier si un couple "nom d'utilisateur" et "mot de passe" est correct, sans avoir à s'authentifier sur une machine.
Prenons l'exemple suivant : vous avez en votre possession un compte utilisateur et son mot de passe, et vous avez besoin de savoir si les informations sont correctes. Plutôt que d'ouvrir une session en local sur une machine du domaine avec le compte en question, pour vérifier s'il est valide ou non, on peut s'appuyer sur PowerShell. Ce sera surement plus rapide puisque l'on a le résultat en direct, sans avoir à attendre que la session s'ouvre, etc... Vous voyez l'idée.
II. Tester un compte AD avec PowerShell
Pour atteindre notre objectif, nous ne pouvons pas utiliser un cmdlet prêt à l'emploi du module Active Directory, car il n'en existe pas aujourd'hui. Ce n'est pas très grave, nous allons créer un objet spécifique et créer notre propre fonction. Plus précisément, nous allons créer un objet de type "DirectoryServices.DirectoryEntry" qui permet de récupérer différentes informations auprès d'un annuaire Active Directory. Notre objectif, c'est simple de voir si les informations d'authentifications sont correctes.
Nous avons besoin de définir 3 arguments pour créer cet objet :
- Le nom du domaine, de la racine (nous laisserons vide, il prendra le domaine actuel)
- Le nom d'utilisateur
- Le mot de passe
Si l'on parvient à créer notre objet, c'est que l'authentification a réussi, et donc que les informations sont bonnes. Dans le cas où ce n'est pas correct, la création de l'objet retournera le message "L'exception suivante s'est produite lors de la récupération du membre « distinguishedName » : « Le nom d’utilisateur ou le mot de passe est incorrect.". Nous allons récupérer la base DN du domaine et si elle n'est pas nulle, c'est que l'on a pu s'authentifier et récupérer la valeur.
Appelons cette fonction "Test-ADUserAuthentication" (ou "Test-ADAuthentication" comme on peut trouver sur le net). Cette fonction va avoir deux paramètres obligatoires pour le nom d'utilisateur et le mot de passe. Ce qui donne :
Function Test-ADUserAuthentication { param( [parameter(Mandatory=$true)] [string]$ADUserLogin, [parameter(Mandatory=$true)] [string]$ADUserPassword) ((New-Object DirectoryServices.DirectoryEntry -ArgumentList "",$ADUserLogin,$ADUserPassword).psbase.name) -ne $null }
Si la fonction retourne "True" c'est que les informations sont bonnes, sinon elle retournera "False". Il ne reste plus qu'à définir les deux variables :
$ADUserLogin = "NomUtilisateur" $ADUserPassword = "MotDePasse"
Puis, on appelle notre fonction :
Test-ADUserAuthentication -ADUserLogin $ADUserLogin -ADUserPassword $ADUserPassword
Si l'on préfère avoir une jolie phrase, ou effectuer une action dans le cas où le mot de passe est bon/pas bon, on peut utiliser une condition if :
if(Test-ADUserAuthentication -ADUserLogin $ADUserLogin -ADUserPassword $ADUserPassword){ Write-Host "Le compte est valide !" -ForegroundColor Green }else{ Write-Host "Le compte est invalide !" -ForegroundColor Red }
Voici un exemple :
Il faut savoir que si l'authentification échoue, cela peut être dû à plusieurs choses : l'identifiant ou le mot de passe est incorrect (ou les deux), le compte AD est désactivé, le compte AD est verrouillé, ou l'utilisateur doit changer son mot de passe à la prochaine connexion.
Notre fonction est prête, vous n'avez plus qu'à l'utiliser au besoin ! 🙂
Je vous rappelle que le cours sur l'Administration de l'Active Directory avec PowerShell est toujours disponible !
Bonjour,
Est-il possible de faire en sorte que le mot de passe soit masqué svp ?
Exemple: un utilisateur souhaite tester son compte sur mon poste mais ne veux pas qu’il soit tapé en clair
Merci
Bonjour Mehdy,
C’est possible avec la déclaration de variable comme ci-dessous :
Write-Host « Entrer le matricule : » -ForegroundColor « Yellow »
$ADUserLogin = Read-Host -Prompt ‘Matricule’
Write-Host « Entrer le mot de passe : » -ForegroundColor « Yellow »
$ADUserPassword = Read-Host -Prompt ‘Mot de passe’
Hello, merci pour ce tuto ! Par contre une astuce pour que le mot de passe puis contenir le signe $ ?
Hello, tu peux essayer de mettre un « \ » avant le signe $ pour l’échappement. A voir comment ça réagit…
Bonjour à tous,
Petite question bête, faut il d’enregistrer cette fonction dans fichier de type script ?
Bien à vous ?
Bonjour Bertrand,
Il suffit de copier-coller ce bout de code dans Visual Studio Code ou PowerShell ISE, et de l’exécuter.
Pour garder le bout de code PowerShell de côté, vous pouvez l’enregistrer dans un fichier « .ps1 ».
Bonjour,
pour complètement masquer la saisie du mot-de-passe :
$ADUserPassword = Read-Host -Prompt « Mot de passe » -AsSecureString
Bien à vous,
Stéphane
Bonjour,
est-ce que le fait de tester un mauvais mot de passe est traité comme une erreur d’authentification comme lors d’une tentative de connexion.
Autrement dit peut-on locker un compte si on teste plusieurs mots de passe erronés ?
Merci
Bonjour,
Quel paramètre puis-je ajouter pour pointer vers un serveur en particulier ?
Bonjour,
Avec « DirectoryServices.DirectoryEntry » il me semble qu’il n’y a pas de paramètre pour préciser un serveur DC à cibler. A vérifier dans la doc 🙂