Photo by regularguy.eth / Unsplash
Tester authentification AD avec PowerShell

Tester authentification AD avec PowerShell

Published on 18 Apr 2019

Bastien Perez
Bastien Perez

Clap

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

Freelance Microsoft 365 - Active Directory - Modern Workplace

France