ANAVEM
Référence
Languageen
Comment importer en masse des utilisateurs Active Directory à partir d'un CSV en utilisant PowerShell

Comment importer en masse des utilisateurs Active Directory à partir d'un CSV en utilisant PowerShell

Apprenez à importer efficacement plusieurs utilisateurs dans Active Directory à partir d'un fichier CSV en utilisant des scripts PowerShell avec une validation et une gestion des erreurs appropriées.

Emanuel DE ALMEIDAEmanuel DE ALMEIDA
17 mars 2026 15 min 8
mediumpowershell 7 étapes 15 min

Pourquoi utiliser PowerShell pour les importations en masse d'utilisateurs Active Directory ?

Gérer des centaines ou des milliers de comptes utilisateurs manuellement via la console Utilisateurs et ordinateurs Active Directory est chronophage et sujet aux erreurs. Le module Active Directory de PowerShell offre une solution robuste et scriptable pour les opérations en masse sur les utilisateurs, permettant aux administrateurs de gagner un temps précieux tout en garantissant cohérence et précision.

Le processus d'importation en masse utilisant PowerShell et des fichiers CSV offre plusieurs avantages clés : validation automatisée, gestion des erreurs, journalisation détaillée et capacité à définir des attributs utilisateur complexes en une seule opération. Cette approche est particulièrement précieuse lors de l'intégration organisationnelle, des migrations de système ou lors de l'intégration avec des systèmes RH qui exportent des données utilisateur au format CSV.

Qu'est-ce qui fait de PowerShell le meilleur choix pour la gestion des utilisateurs AD ?

Le module Active Directory de PowerShell, partie des outils d'administration de serveur à distance (RSAT), offre un accès direct aux objets Active Directory via des cmdlets comme New-ADUser, Set-ADUser et Get-ADUser. Contrairement aux outils basés sur une interface graphique, les scripts PowerShell peuvent gérer une logique complexe, effectuer une validation pré-importation, vérifier les doublons et fournir des rapports détaillés de succès/échec.

Le flux de travail CSV-vers-PowerShell s'intègre également parfaitement aux processus métier existants. Les départements RH peuvent exporter directement les données des employés depuis leurs systèmes, et les administrateurs informatiques peuvent transformer ces données en comptes Active Directory avec un placement correct dans les unités organisationnelles, des adhésions à des groupes et des paramètres de sécurité appliqués automatiquement.

Que réaliserez-vous dans ce tutoriel ?

En suivant ce tutoriel, vous créerez une solution complète d'importation en masse qui gère des scénarios réels, y compris la gestion des erreurs, la détection des doublons et la configuration post-création. Vous apprendrez à structurer correctement les fichiers CSV, à écrire des scripts PowerShell robustes avec des capacités de journalisation et à vérifier la création réussie des utilisateurs avec des rapports complets. Les scripts fournis sont prêts pour la production et incluent les meilleures pratiques en matière de sécurité, de performance et de maintenabilité.

Guide de mise en oeuvre

Procédure complète

01

Installer et importer le module PowerShell Active Directory

Tout d'abord, assurez-vous d'avoir installé le module PowerShell Active Directory. Sur Windows Server, il est préinstallé. Sur les machines clientes, vous avez besoin de RSAT (Remote Server Administration Tools).

Pour Windows 10/11, installez RSAT via Paramètres :

# Ouvrez Paramètres > Applications > Fonctionnalités facultatives > Ajouter une fonctionnalité
# Recherchez "RSAT: Active Directory Domain Services and Lightweight Directory Services Tools"
# Ou installez via PowerShell (exécutez en tant qu'administrateur) :
Get-WindowsCapability -Name RSAT* -Online | Add-WindowsCapability -Online

Une fois installé, ouvrez PowerShell en tant qu'administrateur et importez le module :

Import-Module ActiveDirectory

Vérifiez que le module a été chargé avec succès :

Get-Module ActiveDirectory

Vous devriez voir le module ActiveDirectory listé avec les informations de version. Si vous obtenez une erreur, redémarrez PowerShell et réessayez.

Astuce pro : Ajoutez la commande Import-Module à votre profil PowerShell pour le charger automatiquement à chaque session.
02

Créez et structurez votre fichier CSV

Créez un fichier CSV correctement formaté avec tous les attributs utilisateur requis. Les en-têtes de colonne doivent correspondre exactement à ce que votre script PowerShell attend.

Créez un fichier appelé users.csv avec cette structure :

FirstName,LastName,SamAccountName,Password,OU,Email,Description,Department,Title
John,Doe,jdoe,TempPass123!,"OU=Users,DC=contoso,DC=com",jdoe@contoso.com,Marketing Manager,Marketing,Manager
Jane,Smith,jsmith,TempPass456!,"OU=Users,DC=contoso,DC=com",jsmith@contoso.com,IT Specialist,IT,Specialist
Mike,Johnson,mjohnson,TempPass789!,"OU=IT,OU=Users,DC=contoso,DC=com",mjohnson@contoso.com,System Administrator,IT,Administrator

Enregistrez le fichier avec l'encodage UTF-8 pour éviter les problèmes de caractères. Dans Notepad, utilisez Enregistrer sous et sélectionnez "UTF-8" dans le menu déroulant d'encodage.

Vérifiez la structure de votre CSV :

Import-Csv -Path "C:\users.csv" | Format-Table
Avertissement : Assurez-vous que vos chemins OU sont des noms distinctifs valides. Utilisez des guillemets autour des chemins OU contenant des virgules pour éviter les erreurs d'analyse CSV.

Testez que vos chemins OU existent :

Get-ADOrganizationalUnit -Filter "Name -eq 'Users'"
03

Valider les prérequis et la connectivité du domaine

Avant d'exécuter l'importation en masse, vérifiez que votre environnement est correctement configuré et que vous disposez des autorisations nécessaires.

Testez la connectivité de votre domaine :

# Test de la connectivité du contrôleur de domaine
Test-ComputerSecureChannel -Verbose

# Vérifiez que vous pouvez interroger Active Directory
Get-ADDomain

Vérifiez les autorisations de votre utilisateur actuel :

# Obtenez votre contexte utilisateur actuel
whoami

# Testez si vous pouvez créer des utilisateurs (essayez de créer un utilisateur de test)
$TestPassword = ConvertTo-SecureString "TempTest123!" -AsPlainText -Force
New-ADUser -Name "TestUser" -SamAccountName "testuser" -AccountPassword $TestPassword -WhatIf

Le paramètre -WhatIf montre ce qui se passerait sans réellement créer l'utilisateur. Si vous ne voyez pas d'erreurs, vous avez les autorisations requises.

Vérifiez que vos UO cibles existent et sont accessibles :

# Listez toutes les UO pour vérifier les chemins
Get-ADOrganizationalUnit -Filter * | Select-Object Name, DistinguishedName | Sort-Object Name
Astuce pro : Exécutez toujours votre script avec -WhatIf d'abord pour prévisualiser les changements avant d'exécuter l'importation réelle.
04

Créer le script PowerShell d'importation en masse

Créez un script PowerShell complet qui gère les erreurs, vérifie les doublons et fournit une journalisation détaillée. Enregistrez ceci sous Import-ADUsers.ps1 :

# Import-ADUsers.ps1
# Importation en masse des utilisateurs Active Directory à partir de CSV

param(
    [Parameter(Mandatory=$true)]
    [string]$CSVPath,
    [string]$LogPath = "C:\ADImport.log"
)

# Importer le module requis
Import-Module ActiveDirectory -ErrorAction Stop

# Initialiser les compteurs
$SuccessCount = 0
$FailureCount = 0
$SkippedCount = 0

# Commencer la journalisation
Start-Transcript -Path $LogPath -Append
Write-Host "Début de l'importation des utilisateurs AD depuis : $CSVPath" -ForegroundColor Green
Write-Host "Fichier journal : $LogPath" -ForegroundColor Yellow

try {
    # Importer le fichier CSV
    $ADUsers = Import-Csv -Path $CSVPath -ErrorAction Stop
    Write-Host "Trouvé $($ADUsers.Count) utilisateurs dans le fichier CSV" -ForegroundColor Cyan
    
    # Traiter chaque utilisateur
    foreach ($User in $ADUsers) {
        $Username = $User.SamAccountName
        
        try {
            # Vérifier si l'utilisateur existe déjà
            $ExistingUser = Get-ADUser -Filter {SamAccountName -eq $Username} -ErrorAction SilentlyContinue
            
            if ($ExistingUser) {
                Write-Warning "L'utilisateur $Username existe déjà. Passage..."
                $SkippedCount++
                continue
            }
            
            # Préparer les attributs de l'utilisateur
            $UserParams = @{
                SamAccountName = $Username
                UserPrincipalName = "$Username@$((Get-ADDomain).DNSRoot)"
                Name = "$($User.FirstName) $($User.LastName)"
                GivenName = $User.FirstName
                Surname = $User.LastName
                EmailAddress = $User.Email
                Path = $User.OU
                AccountPassword = (ConvertTo-SecureString $User.Password -AsPlainText -Force)
                Enabled = $true
                ChangePasswordAtLogon = $true
                Description = $User.Description
                Department = $User.Department
                Title = $User.Title
            }
            
            # Créer l'utilisateur
            New-ADUser @UserParams -ErrorAction Stop
            Write-Host "✓ Utilisateur créé avec succès : $Username" -ForegroundColor Green
            $SuccessCount++
            
        } catch {
            Write-Error "✗ Échec de la création de l'utilisateur $Username`: $($_.Exception.Message)"
            $FailureCount++
        }
    }
    
} catch {
    Write-Error "Erreur critique : $($_.Exception.Message)"
    exit 1
}

# Afficher le résumé
Write-Host "`n=== RÉSUMÉ DE L'IMPORTATION ===" -ForegroundColor Magenta
Write-Host "Réussi : $SuccessCount" -ForegroundColor Green
Write-Host "Échoué : $FailureCount" -ForegroundColor Red
Write-Host "Passé : $SkippedCount" -ForegroundColor Yellow
Write-Host "Total traité : $($SuccessCount + $FailureCount + $SkippedCount)" -ForegroundColor Cyan

Stop-Transcript

Rendez le script exécutable et testez-le :

# Tester le script avec WhatIf (exécution à sec)
.\Import-ADUsers.ps1 -CSVPath "C:\users.csv" -WhatIf
05

Exécuter l'importation en masse avec gestion des erreurs

Exécutez le script d'importation avec une gestion des erreurs et une surveillance appropriées. Commencez toujours par un petit lot de test avant d'importer des centaines d'utilisateurs.

Tout d'abord, créez un CSV de test avec seulement 2-3 utilisateurs :

# Créer un sous-ensemble de test
$TestUsers = Import-Csv -Path "C:\users.csv" | Select-Object -First 3
$TestUsers | Export-Csv -Path "C:\users-test.csv" -NoTypeInformation

Exécutez l'importation de test :

# Exécuter le script d'importation
.\Import-ADUsers.ps1 -CSVPath "C:\users-test.csv" -LogPath "C:\ADImport-test.log"

Surveillez attentivement la sortie. Vous devriez voir un retour d'information en temps réel pour chaque tentative de création d'utilisateur. Vérifiez le fichier journal pour des informations détaillées :

# Examiner le fichier journal
Get-Content "C:\ADImport-test.log" | Select-Object -Last 20

Si l'importation de test réussit, procédez à l'importation complète :

# Importation complète
.\Import-ADUsers.ps1 -CSVPath "C:\users.csv" -LogPath "C:\ADImport-full.log"
Avertissement : Les importations importantes (>500 utilisateurs) peuvent prendre beaucoup de temps et peuvent affecter les performances du contrôleur de domaine. Envisagez de les exécuter en dehors des heures de travail.

Pour les importations très importantes, procédez par lots :

# Traiter par lots de 100
$AllUsers = Import-Csv -Path "C:\users.csv"
$BatchSize = 100

for ($i = 0; $i -lt $AllUsers.Count; $i += $BatchSize) {
    $Batch = $AllUsers | Select-Object -Skip $i -First $BatchSize
    $BatchFile = "C:\users-batch-$($i/$BatchSize + 1).csv"
    $Batch | Export-Csv -Path $BatchFile -NoTypeInformation
    
    Write-Host "Traitement du lot $($i/$BatchSize + 1)..."
    .\Import-ADUsers.ps1 -CSVPath $BatchFile
    
    Start-Sleep -Seconds 10  # Pause brève entre les lots
}
06

Vérifier la création de l'utilisateur et valider les attributs

Après l'importation, vérifiez soigneusement que tous les utilisateurs ont été créés correctement avec les attributs et paramètres appropriés.

Vérifiez le nombre total d'utilisateurs créés :

# Compter les utilisateurs dans votre OU cible
$TargetOU = "OU=Users,DC=contoso,DC=com"
$ImportedUsers = Get-ADUser -Filter * -SearchBase $TargetOU
Write-Host "Total des utilisateurs dans l'OU : $($ImportedUsers.Count)" -ForegroundColor Cyan

Vérifiez que les attributs spécifiques des utilisateurs correspondent à vos données CSV :

# Vérification détaillée des utilisateurs importés
$CSVData = Import-Csv -Path "C:\users.csv"

foreach ($CSVUser in $CSVData) {
    $ADUser = Get-ADUser -Identity $CSVUser.SamAccountName -Properties EmailAddress, Department, Title, Description -ErrorAction SilentlyContinue
    
    if ($ADUser) {
        Write-Host "✓ Utilisateur : $($ADUser.SamAccountName)" -ForegroundColor Green
        Write-Host "  Email : $($ADUser.EmailAddress)" -ForegroundColor Gray
        Write-Host "  Département : $($ADUser.Department)" -ForegroundColor Gray
        Write-Host "  Titre : $($ADUser.Title)" -ForegroundColor Gray
        Write-Host "  Activé : $($ADUser.Enabled)" -ForegroundColor Gray
    } else {
        Write-Host "✗ Utilisateur non trouvé : $($CSVUser.SamAccountName)" -ForegroundColor Red
    }
}

Testez l'authentification des utilisateurs (optionnel, mais recommandé pour quelques comptes de test) :

# Tester l'authentification pour un utilisateur spécifique
$TestUser = "jdoe"
$TestPassword = "TempPass123!"

try {
    $SecurePassword = ConvertTo-SecureString $TestPassword -AsPlainText -Force
    $Credential = New-Object System.Management.Automation.PSCredential($TestUser, $SecurePassword)
    
    # Cela réussira si l'utilisateur peut s'authentifier
    Get-ADUser -Identity $TestUser -Credential $Credential -ErrorAction Stop
    Write-Host "✓ Test d'authentification réussi pour $TestUser" -ForegroundColor Green
} catch {
    Write-Host "✗ Test d'authentification échoué pour $TestUser`: $($_.Exception.Message)" -ForegroundColor Red
}

Générez un rapport de synthèse :

# Créer un rapport de vérification
$ReportPath = "C:\ADImport-Report.csv"
$ImportedUsers | Select-Object Name, SamAccountName, EmailAddress, Department, Title, Enabled, Created | 
    Export-Csv -Path $ReportPath -NoTypeInformation

Write-Host "Rapport de vérification enregistré à : $ReportPath" -ForegroundColor Yellow
Astuce pro : Conservez vos journaux d'importation et rapports de vérification à des fins d'audit. Ils sont inestimables pour le dépannage et la conformité.
07

Configurer des paramètres utilisateur supplémentaires et des appartenances à des groupes

Après la création réussie d'un utilisateur, vous devrez peut-être configurer des paramètres supplémentaires tels que les appartenances à des groupes, les répertoires personnels ou les chemins de profil. Cette étape gère la configuration post-création.

Ajoutez des utilisateurs à des groupes de sécurité en fonction de leur département ou rôle :

# Ajouter des utilisateurs à des groupes basés sur des données CSV
$CSVData = Import-Csv -Path "C:\users.csv"

foreach ($User in $CSVData) {
    $Username = $User.SamAccountName
    $Department = $User.Department
    
    try {
        # Ajouter au groupe spécifique au département
        $GroupName = "$Department-Users"
        
        # Vérifier si le groupe existe
        $Group = Get-ADGroup -Filter "Name -eq '$GroupName'" -ErrorAction SilentlyContinue
        
        if ($Group) {
            Add-ADGroupMember -Identity $GroupName -Members $Username -ErrorAction Stop
            Write-Host "✓ Ajouté $Username au groupe $GroupName" -ForegroundColor Green
        } else {
            Write-Warning "Le groupe $GroupName n'existe pas. Ignorer l'attribution de groupe pour $Username"
        }
        
        # Ajouter tous les utilisateurs à un groupe commun
        Add-ADGroupMember -Identity "All-Users" -Members $Username -ErrorAction SilentlyContinue
        
    } catch {
        Write-Error "Échec de l'ajout de $Username aux groupes : $($_.Exception.Message)"
    }
}

Configurer les répertoires personnels (si nécessaire) :

# Définir les répertoires personnels
$HomeDirectoryBase = "\\fileserver\home$"

foreach ($User in $CSVData) {
    $Username = $User.SamAccountName
    $HomeDirectory = "$HomeDirectoryBase\$Username"
    
    try {
        # Définir le chemin du répertoire personnel
        Set-ADUser -Identity $Username -HomeDirectory $HomeDirectory -HomeDrive "H:"
        Write-Host "✓ Définir le répertoire personnel pour $Username`: $HomeDirectory" -ForegroundColor Green
        
        # Créer le répertoire (nécessite des autorisations appropriées)
        if (!(Test-Path $HomeDirectory)) {
            New-Item -Path $HomeDirectory -ItemType Directory -Force
            # Définir les autorisations (exemple - ajuster pour votre environnement)
            icacls $HomeDirectory /grant "$Username:(OI)(CI)F" /T
        }
        
    } catch {
        Write-Error "Échec de la configuration du répertoire personnel pour $Username`: $($_.Exception.Message)"
    }
}

Définir les politiques de mot de passe et l'expiration du compte si nécessaire :

# Configurer les politiques de compte
foreach ($User in $CSVData) {
    $Username = $User.SamAccountName
    
    try {
        # Définir l'expiration du compte dans 90 jours (exemple)
        $ExpirationDate = (Get-Date).AddDays(90)
        Set-ADUser -Identity $Username -AccountExpirationDate $ExpirationDate
        
        # Exiger le changement de mot de passe à la prochaine connexion
        Set-ADUser -Identity $Username -ChangePasswordAtLogon $true
        
        Write-Host "✓ Configuré les politiques de compte pour $Username" -ForegroundColor Green
        
    } catch {
        Write-Error "Échec de la définition des politiques de compte pour $Username`: $($_.Exception.Message)"
    }
}

Vérification finale de toutes les configurations :

# Vérification complète
$VerificationResults = @()

foreach ($User in $CSVData) {
    $Username = $User.SamAccountName
    $ADUser = Get-ADUser -Identity $Username -Properties MemberOf, HomeDirectory, AccountExpirationDate -ErrorAction SilentlyContinue
    
    $Result = [PSCustomObject]@{
        Username = $Username
        Exists = ($ADUser -ne $null)
        GroupCount = ($ADUser.MemberOf | Measure-Object).Count
        HomeDirectory = $ADUser.HomeDirectory
        ExpirationDate = $ADUser.AccountExpirationDate
        Enabled = $ADUser.Enabled
    }
    
    $VerificationResults += $Result
}

# Afficher les résultats
$VerificationResults | Format-Table -AutoSize

# Exporter le rapport final
$VerificationResults | Export-Csv -Path "C:\ADImport-Final-Report.csv" -NoTypeInformation
Avertissement : Testez toujours les appartenances à des groupes et les autorisations de répertoire avec quelques comptes de test avant de les appliquer à tous les utilisateurs importés.

Questions Fréquentes

Quelles autorisations sont nécessaires pour importer en masse des utilisateurs Active Directory avec PowerShell ?+
Vous avez besoin des privilèges d'administrateur de domaine ou de permissions déléguées spécifiques pour la création d'utilisateurs dans les unités organisationnelles cibles. Le compte doit avoir les permissions 'Créer des objets utilisateur' et 'Écrire toutes les propriétés' sur les UO où les utilisateurs seront créés. Vous pouvez déléguer ces permissions via la console Utilisateurs et ordinateurs Active Directory sous les paramètres de sécurité de l'UO pour éviter d'utiliser des comptes d'administrateur de domaine pour les importations de routine.
Comment gérer les exigences de complexité des mots de passe lors de l'importation d'utilisateurs AD à partir de CSV ?+
Assurez-vous que tous les mots de passe dans votre fichier CSV respectent les exigences de la politique de mot de passe de votre domaine (longueur, complexité, historique). Utilisez le cmdlet ConvertTo-SecureString pour gérer correctement les mots de passe dans PowerShell. Envisagez de générer des mots de passe complexes aléatoires par programmation ou d'utiliser un mot de passe temporaire standard qui oblige les utilisateurs à le changer lors de la première connexion. Réglez toujours le paramètre ChangePasswordAtLogon sur $true pour la sécurité.
Que dois-je faire si certains utilisateurs échouent à l'importation lors de la création en masse d'Active Directory ?+
Implémentez une gestion complète des erreurs dans votre script PowerShell en utilisant des blocs try-catch autour de chaque commande New-ADUser. Enregistrez tous les échecs avec des messages d'erreur spécifiques pour identifier les problèmes tels que les noms d'utilisateur en double, les chemins OU invalides ou les problèmes de permission. Créez un fichier CSV séparé avec les importations échouées pour une révision et une correction manuelles. Le script doit continuer à traiter les utilisateurs restants même si certains échouent, en fournissant un rapport récapitulatif complet à la fin.
Comment puis-je vérifier que tous les utilisateurs d'Active Directory ont été importés correctement depuis mon fichier CSV ?+
Utilisez les cmdlets Get-ADUser pour interroger les comptes créés et les comparer à vos données CSV d'origine. Vérifiez les attributs critiques tels que SamAccountName, EmailAddress, Department et le placement dans l'OU. Créez des scripts de vérification qui comptent le nombre total d'utilisateurs importés, valident que des attributs spécifiques correspondent aux données CSV, et testent l'authentification pour des comptes échantillons. Générez des rapports détaillés montrant les importations réussies, les échecs et toute divergence à des fins d'audit.
Quelle est la meilleure façon de gérer de grands fichiers CSV avec des milliers d'utilisateurs Active Directory ?+
Traitez les importations importantes par lots de 100 à 500 utilisateurs pour éviter les problèmes de mémoire et réduire l'impact sur les contrôleurs de domaine. Utilisez les paramètres Select-Object -Skip et -First de PowerShell pour créer des lots. Ajoutez des intervalles de pause entre les lots pour éviter de surcharger les services AD. Surveillez les performances du contrôleur de domaine pendant les importations et envisagez de les exécuter pendant les heures creuses. Testez toujours avec de petits lots d'abord et maintenez une journalisation détaillée pour résoudre les problèmes d'importations à grande échelle.
Emanuel DE ALMEIDA
Écrit par

Emanuel DE ALMEIDA

Microsoft MCSA-certified Cloud Architect | Fortinet-focused. I modernize cloud, hybrid & on-prem infrastructure for reliability, security, performance and cost control - sharing field-tested ops & troubleshooting.

Discussion

Partagez vos réflexions et analyses

Vous devez être connecté pour commenter.

Chargement des commentaires...