Contexte
Une entreprise intègre 15 nouveaux collaborateurs le même jour suite à une fusion. Le service RH transmet un fichier nouveaux_employes.csv à l’administrateur la veille, qui écrit un script PowerShell pour créer les comptes AD en masse et gagner du temps.
Le fichier CSV transmis par le RH :
csv
Prenom,Nom,Service,MotDePasse,Actif,ChangerMotDePasse
Jean,Dupont,Comptabilité,Winter2024!,True,False
Marie,Martin,RH,Winter2024!,True,False
Pierre,Bernard,Informatique,Winter2024!,True,False
...Le script écrit par l’administrateur :
powershell
Import-Csv "C:\RH\nouveaux_employes.csv" | ForEach-Object {
$password = ConvertTo-SecureString $_.MotDePasse -AsPlainText -Force
New-ADUser `
-GivenName $_.Prenom `
-Surname $_.Nom `
-Name "$($_.Prenom) $($_.Nom)" `
-SamAccountName "$($_.Prenom[0])$($_.Nom)".ToLower() `
-AccountPassword $password `
-Enabled $_.ChangerMotDePasse `
-ChangePasswordAtLogon $_.Actif `
-Path "OU=Utilisateurs,DC=corp,DC=lan"
}Le lendemain matin, les 15 collaborateurs se présentent avec leur poste, tentent de se connecter et aucun n’y arrive. Certains obtiennent :
« Ce compte est désactivé. Veuillez contacter votre administrateur. »
D’autres parviennent à saisir leur mot de passe mais tombent sur :
« Le mot de passe de cet utilisateur a expiré. Veuillez contacter votre administrateur. »
L’administrateur vérifie dans dsa.msc : les 15 comptes sont bien créés, dans la bonne OU, avec les bons groupes. Pourtant personne ne peut se connecter.
Problème
Les comptes sont créés mais inutilisables. Identifier les erreurs dans le script et corriger pour que les comptes soient directement opérationnels à la création.
Cause racine : L’administrateur a inversé les colonnes CSV dans les paramètres -Enabled et -ChangePasswordAtLogon :
-Enabledreçoit la valeur de$_.ChangerMotDePasse→False→ les comptes sont désactivés-ChangePasswordAtLogonreçoit la valeur de$_.Actif→True→ le mot de passe est marqué comme expiré dès la création
Les deux bugs combinés expliquent les deux messages d’erreur différents observés — selon l’ordre dans lequel Windows évalue les conditions au moment de la connexion.
Script corrigé :
powershell
Import-Csv "C:\RH\nouveaux_employes.csv" | ForEach-Object {
$password = ConvertTo-SecureString $_.MotDePasse -AsPlainText -Force
New-ADUser `
-GivenName $_.Prenom `
-Surname $_.Nom `
-Name "$($_.Prenom) $($_.Nom)" `
-SamAccountName "$($_.Prenom[0])$($_.Nom)".ToLower() `
-AccountPassword $password `
-Enabled $_.Actif `
-ChangePasswordAtLogon $_.ChangerMotDePasse `
-Path "OU=Utilisateurs,DC=corp,DC=lan"
}Correction des comptes déjà créés :
powershell
Get-ADUser -Filter * -SearchBase "OU=Utilisateurs,DC=corp,DC=lan" -Properties PasswordExpired |
ForEach-Object {
Set-ADUser $_ -Enabled $true -ChangePasswordAtLogon $false
}Vérification :
powershell
Get-ADUser -Filter * -SearchBase "OU=Utilisateurs,DC=corp,DC=lan" `
-Properties Enabled, PasswordExpired, PasswordLastSet |
Select-Object Name, Enabled, PasswordExpired, PasswordLastSet→ Enabled à True et PasswordExpired à False pour tous les comptes
Salut, je pense aux parms inversés : « -ChangePasswordAtLogon $_.Actif » et « $_.Enabled ».
Après ce script est forcément mauvais car si deux utilisateurs ont le même début de prénom ça plante (homomorphe).
Pour ça j’avais mis en place un check de l’AD avant, et si collision on rajouter une lettre du prénom jusqu’à obtenir un compte unique.
Mettre un peu de log aussi 🙂
Bonne journée!