Problème n° 5 — PowerShell : Comptes AD créés mais inutilisables le premier jour

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 :

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.

✅ Solution

Cause racine : L’administrateur a inversé les colonnes CSV dans les paramètres -Enabled et -ChangePasswordAtLogon :

  • -Enabled reçoit la valeur de $_.ChangerMotDePasse → False → les comptes sont désactivés
  • -ChangePasswordAtLogon reç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é :

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 :

Get-ADUser -Filter * -SearchBase "OU=Utilisateurs,DC=corp,DC=lan" -Properties PasswordExpired | 
    ForEach-Object {
        Set-ADUser $_ -Enabled $true -ChangePasswordAtLogon $false
    }

Vérification :

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

Romain Drouche

Romain Drouche

Architecte Système | MCSE: Core Infrastructure

Expert en infrastructures IT avec plus de 15 ans d'expérience sur le terrain. Actuellement Chef de projet Systèmes et Réseaux et Référent SSI (Sécurité des Systèmes d'Information), je mets mon expertise au service de la fiabilité et de la sécurité des environnements technologiques.

GHinM▶