ANAVEM
Référence
Languageen
Comment importer en masse des utilisateurs dans Microsoft 365 avec PowerShell et CSV

Comment importer en masse des utilisateurs dans Microsoft 365 avec PowerShell et CSV

Apprenez à importer efficacement des centaines d'utilisateurs dans Microsoft 365 en utilisant Microsoft Graph PowerShell et des fichiers CSV avec une gestion des erreurs et une vérification appropriées.

Emanuel DE ALMEIDAEmanuel DE ALMEIDA
3/16/2026 15 min 0
mediummicrosoft365 7 étapes 15 min

Pourquoi utiliser PowerShell pour l'importation en masse d'utilisateurs dans Microsoft 365 ?

Gérer les comptes utilisateurs dans Microsoft 365 devient difficile lorsqu'il s'agit de dizaines ou de centaines de nouveaux employés. Le centre d'administration basé sur le web fonctionne bien pour les utilisateurs individuels, mais créer manuellement plus de 50 comptes est chronophage et sujet aux erreurs. L'automatisation avec PowerShell résout ce problème en traitant des fichiers CSV contenant des données utilisateur et en créant des comptes de manière programmée.

Qu'est-ce qui a changé dans la gestion des utilisateurs de Microsoft 365 ?

Microsoft a déprécié les modules PowerShell MSOnline et AzureAD en 2024-2025, faisant de Microsoft Graph PowerShell la seule méthode prise en charge pour les opérations en masse. Le nouveau SDK Microsoft Graph (version 2.21.1 en mars 2026) offre un meilleur support des opérations en masse, une meilleure gestion des erreurs et une gestion améliorée du throttling. Cette transition nécessite la mise à jour des scripts des cmdlets hérités comme New-MsolUser vers les cmdlets modernes Graph comme New-MgUser.

Que réaliserez-vous dans ce tutoriel ?

Vous apprendrez à créer une solution complète d'importation en masse qui gère efficacement des centaines d'utilisateurs. Le processus inclut la validation des CSV, la détection des conflits, la gestion des erreurs, le suivi des progrès et l'attribution automatique de licences. À la fin, vous disposerez d'un script PowerShell réutilisable capable d'importer des utilisateurs avec une vérification appropriée et une journalisation détaillée. Cette approche s'adapte des petits lots aux importations de niveau entreprise tout en maintenant l'intégrité des données et en fournissant des pistes d'audit complètes.

Guide de mise en oeuvre

Procédure complète

01

Installer le module PowerShell Microsoft Graph

Tout d'abord, installez le SDK Microsoft Graph PowerShell, qui a remplacé les modules MSOnline et AzureAD obsolètes. Ouvrez PowerShell 7+ en tant qu'administrateur et exécutez la commande d'installation.

Install-Module Microsoft.Graph -Force -AllowClobber -Scope CurrentUser
Import-Module Microsoft.Graph.Users

L'installation télécharge la dernière version (2.21.1 en mars 2026) avec un support amélioré des opérations en masse et une meilleure gestion du throttling.

Astuce pro : Utilisez -Scope CurrentUser pour éviter de nécessiter des privilèges administrateur pour l'installation du module.

Vérification : Vérifiez la version installée :

Get-Module Microsoft.Graph -ListAvailable | Select-Object Name, Version

Vous devriez voir la version 2.21.1 ou ultérieure répertoriée.

02

Créer le fichier CSV avec les en-têtes requis

Créez un fichier CSV correctement formaté avec un encodage UTF-8. Le fichier doit inclure des en-têtes spécifiques qui correspondent aux paramètres utilisateur de Microsoft Graph. Enregistrez ceci sous le nom users.csv :

UserPrincipalName,DisplayName,MailNickname,GivenName,Surname,PasswordProfile,UsageLocation,City,Department
user1@contoso.com,"John Smith","jsmith","John","Smith","TempPass123!","US","Seattle","IT"
user2@contoso.com,"Jane Doe","jdoe","Jane","Doe","TempPass123!","US","New York","HR"
user3@contoso.com,"Mike Johnson","mjohnson","Mike","Johnson","TempPass123!","US","Chicago","Finance"

Les colonnes requises incluent UserPrincipalName, DisplayName, MailNickname, et PasswordProfile. Des champs optionnels comme UsageLocation sont cruciaux pour l'attribution de licences ultérieure.

Avertissement : Les mots de passe doivent répondre aux exigences de complexité de votre locataire (minimum 8 caractères avec majuscules, minuscules, chiffre et symbole). Les mots de passe faibles entraîneront des échecs d'importation.

Vérification : Ouvrez le fichier CSV dans un éditeur de texte pour assurer l'encodage UTF-8 et une séparation correcte par des virgules sans espaces supplémentaires.

03

Se connecter à Microsoft Graph avec les autorisations requises

Établissez une connexion à Microsoft Graph avec les autorisations nécessaires pour la gestion des utilisateurs. Exécutez cette commande et complétez l'authentification interactive :

Connect-MgGraph -Scopes "User.ReadWrite.All"

Cela ouvre une fenêtre de navigateur pour l'authentification. Connectez-vous avec votre compte d'administrateur global ou d'administrateur utilisateur. Le scope User.ReadWrite.All accorde la permission de créer et modifier des utilisateurs.

Pour les scripts automatisés sans authentification interactive, utilisez l'authentification basée sur un certificat :

# Pour l'automatisation (nécessite l'enregistrement de l'application)
Connect-MgGraph -ClientId "your-app-id" -TenantId "your-tenant-id" -CertificateThumbprint "your-cert-thumbprint"
Astuce pro : Si l'AMF bloque la connexion, utilisez l'authentification par code de périphérique : Connect-MgGraph -UseDeviceAuthentication -Scopes "User.ReadWrite.All"

Vérification : Confirmez la connexion et les autorisations :

Get-MgContext | Select-Object Scopes, Account, TenantId
04

Valider les données CSV et vérifier les conflits

Chargez le fichier CSV et validez que tous les champs requis sont présents. Cette étape prévient les erreurs lors du processus d'importation en masse :

# Charger les données CSV
$userData = Import-Csv -Path "C:\temp\users.csv" -Encoding UTF8

# Valider les champs requis
$requiredFields = @('UserPrincipalName', 'DisplayName', 'MailNickname', 'PasswordProfile')
foreach ($field in $requiredFields) {
    if ($field -notin ($userData[0].PSObject.Properties.Name)) {
        Write-Error "Champ requis manquant : $field"
        exit 1
    }
}

Write-Host "Chargé $($userData.Count) utilisateurs pour l'importation" -ForegroundColor Green

Ensuite, vérifiez les utilisateurs existants pour éviter les conflits :

# Vérifier les utilisateurs existants
$conflicts = @()
foreach ($user in $userData) {
    try {
        $existingUser = Get-MgUser -Filter "userPrincipalName eq '$($user.UserPrincipalName)'" -ErrorAction SilentlyContinue
        if ($existingUser) {
            $conflicts += $user.UserPrincipalName
        }
    } catch {
        # L'utilisateur n'existe pas, continuer
    }
}

if ($conflicts.Count -gt 0) {
    Write-Warning "Trouvé $($conflicts.Count) utilisateurs existants : $($conflicts -join ', ')"
}

Vérification : Examinez la sortie pour vous assurer que tous les utilisateurs sont chargés et qu'aucun conflit critique n'existe.

05

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

Exécutez le processus d'importation en masse avec une gestion complète des erreurs et un suivi de la progression. Ce script crée des utilisateurs un par un avec une journalisation détaillée :

# Initialiser les variables de suivi
$results = @()
$successCount = 0
$errorCount = 0

# Traiter chaque utilisateur
foreach ($user in $userData) {
    try {
        # Préparer le profil de mot de passe
        $passwordProfile = @{
            Password = $user.PasswordProfile
            ForceChangePasswordNextSignIn = $true
        }
        
        # Préparer les paramètres de l'utilisateur
        $userParams = @{
            DisplayName = $user.DisplayName
            UserPrincipalName = $user.UserPrincipalName
            MailNickname = $user.MailNickname
            GivenName = $user.GivenName
            Surname = $user.Surname
            UsageLocation = $user.UsageLocation
            City = $user.City
            Department = $user.Department
            PasswordProfile = $passwordProfile
            AccountEnabled = $true
        }
        
        # Créer l'utilisateur
        $newUser = New-MgUser @userParams
        
        # Journaliser le succès
        $results += [PSCustomObject]@{
            UPN = $user.UserPrincipalName
            Status = "Succès"
            Id = $newUser.Id
            Error = ""
        }
        $successCount++
        Write-Host "✓ Créé : $($user.DisplayName)" -ForegroundColor Green
        
        # Délai de limitation pour éviter les limites de l'API
        Start-Sleep -Seconds 2
        
    } catch {
        # Journaliser l'échec
        $results += [PSCustomObject]@{
            UPN = $user.UserPrincipalName
            Status = "Échec"
            Id = ""
            Error = $_.Exception.Message
        }
        $errorCount++
        Write-Host "✗ Échec : $($user.UserPrincipalName) - $($_.Exception.Message)" -ForegroundColor Red
    }
}

# Exporter les résultats
$results | Export-Csv -Path "C:\temp\import_results.csv" -NoTypeInformation
Write-Host "\nRésumé de l'importation : Succès : $successCount | Échec : $errorCount" -ForegroundColor Cyan
Avertissement : Microsoft Graph a des limites de limitation. Le délai de 2 secondes empêche d'atteindre la limite de 50 utilisateurs/heure pour les opérations en masse.

Vérification : Vérifiez le fichier CSV des résultats et vérifiez les utilisateurs réussis dans le centre d'administration Microsoft 365.

06

Attribuer des licences aux utilisateurs créés avec succès

Après avoir créé des utilisateurs, attribuez des licences pour activer les services Microsoft 365. Tout d'abord, identifiez les SKU de licence disponibles dans votre locataire :

# Obtenir les licences disponibles
$availableLicenses = Get-MgSubscribedSku | Select-Object SkuPartNumber, SkuId, ConsumedUnits, PrepaidUnits
$availableLicenses | Format-Table

# Obtenir la licence Microsoft 365 E3 (exemple)
$e3Sku = (Get-MgSubscribedSku | Where-Object SkuPartNumber -eq "ENTERPRISEPACK").SkuId

Maintenant, attribuez des licences aux utilisateurs créés avec succès :

# Attribuer des licences aux utilisateurs réussis
$successfulUsers = $results | Where-Object Status -eq "Success"
$licenseSuccessCount = 0
$licenseErrorCount = 0

foreach ($user in $successfulUsers) {
    try {
        # Attribuer la licence
        Set-MgUserLicense -UserId $user.Id -AddLicenses @(@{SkuId = $e3Sku}) -RemoveLicenses @()
        
        Write-Host "✓ Licencié : $($user.UPN)" -ForegroundColor Green
        $licenseSuccessCount++
        
        # Petit délai pour éviter le throttling
        Start-Sleep -Seconds 1
        
    } catch {
        Write-Host "✗ Échec de la licence : $($user.UPN) - $($_.Exception.Message)" -ForegroundColor Red
        $licenseErrorCount++
    }
}

Write-Host "\nRésumé des licences : Succès : $licenseSuccessCount | Échec : $licenseErrorCount" -ForegroundColor Cyan
Conseil pro : UsageLocation doit être défini avant d'attribuer des licences. Si vous rencontrez des erreurs de licence, vérifiez que le champ UsageLocation dans votre CSV correspond aux pays autorisés de votre locataire.

Vérification : Vérifiez les licences utilisateur dans le centre d'administration ou exécutez :

Get-MgUser -UserId "user@contoso.com" | Select-Object DisplayName, AssignedLicenses
07

Vérifier les résultats d'importation et nettoyer

Effectuez la vérification finale du processus d'importation et nettoyez la session PowerShell. Tout d'abord, vérifiez un échantillon d'utilisateurs créés :

# Vérifier un échantillon aléatoire d'utilisateurs créés
$sampleUsers = $results | Where-Object Status -eq "Success" | Get-Random -Count 3

foreach ($user in $sampleUsers) {
    $verifyUser = Get-MgUser -UserId $user.Id | Select-Object DisplayName, UserPrincipalName, AccountEnabled, AssignedLicenses
    Write-Host "Vérifié : $($verifyUser.DisplayName) - Activé : $($verifyUser.AccountEnabled)" -ForegroundColor Green
}

Générez un rapport récapitulatif complet :

# Générer le rapport final
$report = @{
    TotalProcessed = $userData.Count
    SuccessfulCreations = $successCount
    FailedCreations = $errorCount
    SuccessfulLicensing = $licenseSuccessCount
    FailedLicensing = $licenseErrorCount
    Timestamp = Get-Date
}

$report | ConvertTo-Json | Out-File "C:\temp\import_summary.json"
Write-Host "\n=== RÉSUMÉ FINAL DE L'IMPORTATION ===" -ForegroundColor Yellow
$report | Format-List

Nettoyez la session PowerShell :

# Déconnexion de Microsoft Graph
Disconnect-MgGraph
Write-Host "Déconnecté de Microsoft Graph" -ForegroundColor Green
Conseil pro : Conservez le fichier CSV des résultats pour référence future et dépannage. Il contient les IDs d'objet des utilisateurs créés pour une gestion facile.

Vérification : Connectez-vous au centre d'administration Microsoft 365 et accédez à Utilisateurs > Utilisateurs actifs pour confirmer que tous les utilisateurs apparaissent avec les informations et les attributions de licences correctes.

Questions Fréquentes

Quels modules PowerShell sont nécessaires pour l'importation en masse d'utilisateurs Microsoft 365 en 2026 ?+
Le SDK Microsoft Graph PowerShell (version 2.21.1 ou ultérieure) est le seul module pris en charge pour les opérations en masse sur les utilisateurs. Les modules MSOnline et AzureAD hérités ont été dépréciés en 2024-2025 et ne fonctionnent plus avec l'authentification moderne. Installez en utilisant 'Install-Module Microsoft.Graph -Scope CurrentUser' et importez spécifiquement le module Users.
Combien d'utilisateurs puis-je importer à la fois avec PowerShell dans Microsoft 365 ?+
Il n'y a pas de limite stricte sur la taille des fichiers CSV, mais Microsoft Graph a des limites de régulation d'environ 50 créations d'utilisateurs par heure pour les opérations en masse. Pour des importations plus importantes, implémentez des délais entre les requêtes (2-3 secondes) ou utilisez le regroupement avec Invoke-MgGraphRequest. La plupart des organisations importent avec succès 100 à 500 utilisateurs par session avec une régulation appropriée.
Quel format CSV et encodage sont requis pour l'importation d'utilisateurs Microsoft 365 ?+
Utilisez l'encodage UTF-8 avec des valeurs séparées par des virgules. Les colonnes requises incluent UserPrincipalName, DisplayName, MailNickname et PasswordProfile. Les colonnes facultatives mais recommandées sont GivenName, Surname, UsageLocation (requis pour la licence), City et Department. Les mots de passe doivent respecter les exigences de complexité du locataire avec un minimum de 8 caractères incluant des majuscules, des minuscules, des chiffres et des symboles.
Comment gérer les erreurs et les conflits lors de l'importation en masse d'utilisateurs vers Microsoft 365 ?+
Implémentez des blocs try-catch autour des cmdlets New-MgUser pour capturer des messages d'erreur spécifiques. Les problèmes courants incluent les conflits de UserPrincipalName en double, les mots de passe faibles et l'absence de UsageLocation pour la licence. Pré-validez en vérifiant les utilisateurs existants avec des filtres Get-MgUser. Exportez les résultats en CSV avec le statut de réussite/échec et les détails des erreurs pour le dépannage et les opérations de réessai.
Puis-je attribuer automatiquement des licences lors de l'importation en masse d'utilisateurs avec PowerShell ?+
L'attribution de licence nécessite une étape distincte après la création de l'utilisateur en utilisant la cmdlet Set-MgUserLicense. Identifiez d'abord les SKU disponibles avec Get-MgSubscribedSku, puis attribuez des licences aux utilisateurs créés avec succès. UsageLocation doit être défini dans l'objet utilisateur avant l'attribution de la licence. Les SKU courants incluent ENTERPRISEPACK (Microsoft 365 E3) et ENTERPRISEPREMIUM (Microsoft 365 E5).
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...