Administration Azure AD / Entra ID avec Microsoft Graph PowerShell - utilisateurs, groupes, MFA et tâches quotidiennes !
365
Publié le
Karl Certa Admin systèmes & réseaux5 ans dans l'IT, passé par le support puis l'admin sys, aujourd'hui Ops. J'apprends le cloud et je pose tout au propre ici. Focus sur l'IaC & le cloud AWS SAA, prochaine étape Kubernetes LinkedIn karlcerta.fr GitHub Karl Certa
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