PowerShell : créer des utilisateurs AD depuis un CSV
- Loïs Dutour
Table of Contents
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.
Format du fichier CSV
Le fichier C:\temp\import.csv doit utiliser ; comme délimiteur et contenir les colonnes suivantes :
| Colonne | Description |
|---|---|
Prenom | Prénom de l’utilisateur |
Nom | Nom de famille |
Service | Nom de l’OU cible (doit exister dans l’AD) |
DateIn | Date d’entrée (format dd/MM/yyyy) |
DateOut | Date d’expiration du compte (format dd/MM/yyyy) |
Tel | Numé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 Dupont → jdupont.
$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 :
- L’OU existe – si elle n’existe pas, l’utilisateur est ignoré avec un warning
- Le compte n’existe pas déjà – si le
SamAccountNameest 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@ssword59est en clair dans le script – en production, utiliserRead-Host -AsSecureStringou un coffre-fort (KeePass, Azure Key Vault) - Le script ne gère pas les doublons par nom complet, seulement par
SamAccountName– deuxJ. Dupontdans l’entreprise créeront un conflit - L’OU doit exister avant l’import – le script ne la crée pas automatiquement