PowerShell : créer des utilisateurs AD depuis un CSV

Script PowerShell pour importer des utilisateurs dans Active Directory depuis un fichier CSV avec vérification des OUs et gestion des erreurs.
15 January 2025 579 words Reading: 3 min Authors:
  • Loïs Dutour

Script PowerShell pour créer des comptes utilisateurs dans Active Directory en masse à partir d’un fichier CSV. Inclut la vérification des OUs, la détection des doublons et la gestion des dates d’expiration.

PowerShell Windows Server Active Directory

Format du fichier CSV

Le fichier C:\temp\import.csv doit utiliser ; comme délimiteur et contenir les colonnes suivantes :

ColonneDescription
PrenomPrénom de l’utilisateur
NomNom de famille
ServiceNom de l’OU cible (doit exister dans l’AD)
DateInDate d’entrée (format dd/MM/yyyy)
DateOutDate d’expiration du compte (format dd/MM/yyyy)
TelNuméro de téléphone

Script

Import-Module ActiveDirectory
Import-Module 'Microsoft.PowerShell.Security'

$users = Import-Csv -Delimiter ";" -Path "C:\temp\import.csv"

# Liste les utilisateurs existants avant import
Get-ADUser -Filter * | Select-Object Surname, GivenName, Name, DistinguishedName, SamAccountName, Mail, Enabled

foreach ($user in $users) {

    $fname   = $user.Prenom
    $lname   = $user.Nom
    $login   = ($fname.Substring(0,1) + $lname).ToLower()
    $password = "P@ssword59"
    $service = $user.Service
    $dateOut = $user.DateOut
    $tel     = $user.Tel
    $UO      = "OU=$service,OU=Services,DC=bagdad,DC=lan"

    # Vérification de l'existence de l'OU
    if (-Not (Get-ADOrganizationalUnit -Filter "DistinguishedName -eq '$UO'")) {
        Write-Warning "L'OU $UO n'existe pas. L'utilisateur $login sera ignoré."
        continue
    }

    Write-Host "Vérification de la présence de l'utilisateur : $login dans l'AD"

    $existingUser = Get-ADUser -Filter "SamAccountName -eq '$login'" -SearchBase "DC=bagdad,DC=lan"

    if ($existingUser) {
        Write-Host "$login existe déjà dans l'Active Directory. Aucune création." -ForegroundColor Yellow
    } else {

        # Validation de la date d'expiration
        try {
            $expirationDate = [datetime]::ParseExact($dateOut, "dd/MM/yyyy", $null)
        } catch {
            Write-Warning "La date d'expiration $dateOut pour $fname $lname est invalide. Skipping..."
            continue
        }

        # Création du compte
        try {
            New-ADUser `
                -Name "$fname $lname" `
                -SamAccountName $login `
                -UserPrincipalName "$login@bagdadmedilab.fr" `
                -DisplayName "$lname, $fname" `
                -GivenName $fname `
                -Surname $lname `
                -AccountPassword (ConvertTo-SecureString $password -AsPlainText -Force) `
                -Path $UO `
                -OfficePhone $tel `
                -ChangePasswordAtLogon $true `
                -Enabled $true `
                -Description "Date d'entrée : $($user.DateIn)" `
                -AccountExpirationDate $expirationDate

            Write-Host "Utilisateur $login ($fname $lname) ajouté avec succès." -ForegroundColor Green
        } catch {
            Write-Warning "Erreur lors de la création de $login : $_"
        }
    }
}

Explication ligne par ligne

Chargement des modules

Import-Module ActiveDirectory
Import-Module 'Microsoft.PowerShell.Security'

Charge les modules nécessaires – AD pour la gestion des comptes, Security pour la manipulation des mots de passe.

Import du CSV

$users = Import-Csv -Delimiter ";" -Path "C:\temp\import.csv"

Importe la liste des utilisateurs depuis le CSV en utilisant ; comme séparateur de colonnes.

Construction des variables

$login = ($fname.Substring(0,1) + $lname).ToLower()

Génère l’identifiant de connexion automatiquement : initiale du prénom + nom, en minuscules. Exemple : Jean Dupontjdupont.

$UO = "OU=$service,OU=Services,DC=bagdad,DC=lan"

Construit le Distinguished Name de l’OU cible dynamiquement depuis la colonne Service du CSV.

Vérifications avant création

Le script effectue deux vérifications avant toute création :

  1. L’OU existe – si elle n’existe pas, l’utilisateur est ignoré avec un warning
  2. Le compte n’existe pas déjà – si le SamAccountName est déjà pris, aucune création

Gestion de la date d’expiration

$expirationDate = [datetime]::ParseExact($dateOut, "dd/MM/yyyy", $null)

Parse la date au format dd/MM/yyyy. Si le format est invalide, le compte est ignoré plutôt que créé sans date d’expiration.

Création du compte

New-ADUser crée le compte avec :

  • Mot de passe temporaire + obligation de changement à la première connexion (-ChangePasswordAtLogon $true)
  • Compte activé immédiatement (-Enabled $true)
  • Date d’expiration automatique depuis le CSV

Points d’attention

  • Le mot de passe par défaut P@ssword59 est en clair dans le script – en production, utiliser Read-Host -AsSecureString ou un coffre-fort (KeePass, Azure Key Vault)
  • Le script ne gère pas les doublons par nom complet, seulement par SamAccountName – deux J. Dupont dans l’entreprise créeront un conflit
  • L’OU doit exister avant l’import – le script ne la crée pas automatiquement