Microsoft Entra ID (anciennement Azure AD) est le service d’identité cloud de Microsoft permettant la gestion centralisée des utilisateurs, groupes et ressources dans un environnement Microsoft 365.
# Installation et connexion Microsoft Graphif (!(Get-Module -ListAvailable -Name Microsoft.Graph)) { Write-Host "Installation du module Microsoft.Graph..." -ForegroundColor Green Install-Module -Name Microsoft.Graph -Force -Scope CurrentUser}# Installation module ImportExcel pour traiter le CSVif (!(Get-Module -ListAvailable -Name ImportExcel)) { Write-Host "Installation du module ImportExcel..." -ForegroundColor Green Install-Module -Name ImportExcel -Force -Scope CurrentUser}# Connexion avec les permissions nécessairesWrite-Host "Connexion à Microsoft Graph..." -ForegroundColor GreenConnect-MgGraph -Scopes "User.ReadWrite.All", "Group.ReadWrite.All"# Configuration générale (à adapter selon votre environnement)$csvPath = "C:\temp\NouveauxUtilisateurs.csv"$logPath = "C:\temp\creation_utilisateurs_log.txt"$domainePrincipal = "monentreprise.com"$departementDefaut = "IT"$paysDefaut = "France"$usageLocation = "FR"# Créer le fichier de logNew-Item -Path $logPath -ItemType File -ForceWrite-Host "Fichier de log créé : $logPath" -ForegroundColor Yellow# Importer les données CSV (colonnes attendues : FirstName, LastName, JobTitle, Department)if (Test-Path $csvPath) { $utilisateurs = Import-Csv -Path $csvPath -Delimiter ";" Write-Host "Fichier CSV importé : $($utilisateurs.Count) utilisateurs trouvés" -ForegroundColor Green} else { Write-Host "Fichier CSV non trouvé : $csvPath" -ForegroundColor Red exit}# Fonction pour générer un mot de passe sécuriséfunction New-RandomPassword { param([int]$Length = 12) $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%" return -join ((1..$Length) | ForEach-Object { $chars[(Get-Random -Maximum $chars.Length)] })}# Boucle de création des utilisateursforeach ($user in $utilisateurs) { # Vérifications des champs obligatoires if ([string]::IsNullOrWhiteSpace($user.FirstName) -or [string]::IsNullOrWhiteSpace($user.LastName)) { $message = "ERREUR: Prénom ou nom manquant pour l'utilisateur ligne $($utilisateurs.IndexOf($user) + 2)" Write-Host $message -ForegroundColor Red Add-Content -Path $logPath -Value "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - $message" continue } # Génération des informations utilisateur $prenom = $user.FirstName.Trim() $nom = $user.LastName.Trim() $nomComplet = "$prenom $nom" $mailNickname = "$($prenom.ToLower()).$($nom.ToLower())" $email = "$mailNickname@$domainePrincipal" $motDePasse = New-RandomPassword $poste = if (![string]::IsNullOrWhiteSpace($user.JobTitle)) { $user.JobTitle } else { "Utilisateur" } $service = if (![string]::IsNullOrWhiteSpace($user.Department)) { $user.Department } else { $departementDefaut } Write-Host "Création de l'utilisateur : $nomComplet ($email)" -ForegroundColor Cyan try { # Vérifier si l'utilisateur existe déjà $existingUser = Get-MgUser -Filter "UserPrincipalName eq '$email'" -ErrorAction SilentlyContinue if ($existingUser) { $message = "ATTENTION: L'utilisateur $email existe déjà" Write-Host $message -ForegroundColor Yellow Add-Content -Path $logPath -Value "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - $message" continue } # Création de l'utilisateur $passwordProfile = @{ Password = $motDePasse ForceChangePasswordNextSignIn = $true } $nouveauUtilisateur = @{ DisplayName = $nomComplet UserPrincipalName = $email MailNickname = $mailNickname GivenName = $prenom Surname = $nom JobTitle = $poste Department = $service Country = $paysDefaut UsageLocation = $usageLocation PasswordProfile = $passwordProfile AccountEnabled = $true } $userCreated = New-MgUser @nouveauUtilisateur # Log de succès avec mot de passe $successMessage = "SUCCESS: Utilisateur $nomComplet créé | Email: $email | Mot de passe: $motDePasse" Write-Host "✓ Utilisateur créé avec succès" -ForegroundColor Green Add-Content -Path $logPath -Value "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - $successMessage" # Pause pour éviter les limitations de taux Start-Sleep -Milliseconds 500 } catch { # Log d'erreur $errorMessage = "ERREUR: Échec création $nomComplet ($email) - $($_.Exception.Message)" Write-Host "✗ Erreur lors de la création: $($_.Exception.Message)" -ForegroundColor Red Add-Content -Path $logPath -Value "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - $errorMessage" }}Write-Host "`n=== RÉSUMÉ ===" -ForegroundColor MagentaWrite-Host "Script terminé. Consultez le fichier de log pour les détails : $logPath" -ForegroundColor YellowWrite-Host "Pour assigner des licences, utilisez : Set-MgUserLicense" -ForegroundColor Yellow# DéconnexionDisconnect-MgGraph
Format CSV attendu
Créez un fichier CSV avec ces colonnes (séparateur ;) :
FirstName;LastName;JobTitle;DepartmentJean;Dupont;Administrateur Système;ITMarie;Martin;Développeuse;ITPierre;Durant;Chef de projet;MarketingSophie;Bernard;Comptable;Finance
Points clés du script
🔒 Sécurisé : Génération de mots de passe aléatoires robustes
📝 Logging complet : Tous les succès/échecs sont tracés
⚡ Limitation de débit : Pause entre créations pour éviter les erreurs API
🔍 Vérifications : Contrôle si l’utilisateur existe avant création
🎫 Licences
Attribution de licences
# Voir les licences disponiblesGet-MgSubscribedSku# Définir la localisation (obligatoire)Update-MgUser -UserId "john@domain.com" -UsageLocation "FR"# Attribuer une licence$SkuId = (Get-MgSubscribedSku | Where-Object {$_.SkuPartNumber -eq "SPE_E3"}).SkuIdSet-MgUserLicense -UserId "john@domain.com" -AddLicenses @(@{SkuId=$SkuId}) -RemoveLicenses @()