Tester un mot de passe

Il est parfois nécessaire de tester des identifiants Active Directory afin de valider la conformité du login ou du mot de passe. Par exemple suite à la création en masse d’utilisateurs.

Les actions les plus souvent utilisées pour tester sont la connexion à un bureau à distance (RDP) ou la connexion à un webmail. Cependant, soit le nombre d’identifiants à tester est trop important, soit aucun service n’est accessible pour tester une authentification.

PowerShell à la rescousse

Attention de ne pas tester des authentifications en boucle avec un mauvais mot de passe, sinon cela peut engendrer un verrouillage du compte AD.

Le script a été testé pour une authentification NTLM avec domain\sAMAccountName. L'authentification Kerberos n'a pas été testée. Ces méthodes peuvent ne pas fonctionner pour les utilisateurs du groupe 'Protected Users' ou si NTLM a été désactivé.

PowerShell permet de tester des authentifications login/mot de passe auprès d’un Active Directory avec l’une de ces deux méthodes :

$UserName = 'xxxx'
$Password = 'yyyy'

Function Test-ADAuthentication {
    param(
        $username,
        $password)
    
    (New-Object DirectoryServices.DirectoryEntry "",$username,$password).psbase.name -ne $null
}

Test-ADAuthentication -username $UserName -password $password

ou une fonction avancée si vous devez tester sur un autre domaine :

function Test-ADAuthentication {
	Param(
		[Parameter(Mandatory)]
		[string]$User,
		[Parameter(Mandatory)]
		$Password,
		[Parameter(Mandatory = $false)]
		$Server,
		[Parameter(Mandatory = $false)]
		[string]$Domain = $env:USERDOMAIN
	)
  
	Add-Type -AssemblyName System.DirectoryServices.AccountManagement
	
	$contextType = [System.DirectoryServices.AccountManagement.ContextType]::Domain
	
	$argumentList = New-Object -TypeName "System.Collections.ArrayList"
	$null = $argumentList.Add($contextType)
	$null = $argumentList.Add($Domain)

	if($null -ne $Server){
		$argumentList.Add($Server)
	}
	
	$principalContext = New-Object System.DirectoryServices.AccountManagement.PrincipalContext -ArgumentList $argumentList -ErrorAction SilentlyContinue

	if ($null -eq $principalContext) {
		Write-Warning "$Domain\$User - AD Authentication failed"
	}
	
	if ($principalContext.ValidateCredentials($User, $Password)) {
		Write-Host -ForegroundColor green "$Domain\$User - AD Authentication OK"
	}
	else {
		Write-Warning "$Domain\$User - AD Authentication failed"
	}
}

#Test-ADAuthentication -User toto -Password passXX

#Test-ADAuthentication -User toto -Password passXX -Server xxx.domain.com

Les valeurs de retour sont :

  • TRUE si l'authentification a réussi
  • FALSE si l’authentification a échoué. L’échec peut être dû à :
    • mauvais login. Vérifier si l’utilisateur existe
    • mauvais mot de passe
    • compte AD verrouillé : Get-ADUser -Identity xxx -Properties LockedOut,AccountLockoutTime | Select samaccountname,LockedOut,AccountLockoutTime
    • compte AD désactivé : Get-ADUser -Identity xxxx | Select samaccountname,Enable

Comments

banner-Bastien Perez
Bastien Perez's avatar

Freelance Microsoft 365 - Active Directory - Modern Workplace

France