ANAVEM
Référence
Languageen
Comment forcer le changement de mot de passe pour tous les utilisateurs dans Microsoft 365 en utilisant PowerShell

Comment forcer le changement de mot de passe pour tous les utilisateurs dans Microsoft 365 en utilisant PowerShell

Apprenez à forcer les changements de mot de passe pour des utilisateurs individuels, des groupes ou tous les utilisateurs dans Microsoft 365 en utilisant PowerShell et Microsoft Graph API avec des scripts automatisés et des commandes de vérification.

Emanuel DE ALMEIDAEmanuel DE ALMEIDA
16 mars 2026 15 min 11
mediummicrosoft365 9 étapes 15 min

Pourquoi forcer les changements de mot de passe dans Microsoft 365 ?

La sécurité des mots de passe reste l'un des aspects les plus critiques de la cybersécurité organisationnelle. Que ce soit en réponse à une violation de sécurité, en mettant en œuvre de nouvelles politiques de mot de passe, ou en effectuant une maintenance de sécurité de routine, la capacité de forcer les changements de mot de passe dans votre environnement Microsoft 365 est essentielle. Ce tutoriel se concentre sur l'approche moderne de Microsoft Graph PowerShell, qui a remplacé le module MSOnline obsolète en tant que norme pour l'administration de Microsoft 365.

Qu'est-ce qui fait de Microsoft Graph PowerShell le bon choix ?

Le SDK Microsoft Graph PowerShell représente la norme actuelle pour l'automatisation et l'administration de Microsoft 365. Contrairement au module MSOnline hérité qui est en cours de suppression, Graph PowerShell offre un accès complet aux services Microsoft 365 via une API unifiée. Le cmdlet Update-MgUser avec les paramètres PasswordProfile offre un contrôle granulaire sur les politiques de mot de passe des utilisateurs, y compris le paramètre critique ForceChangePasswordNextSignIn.

Que réaliserez-vous dans ce tutoriel ?

Vous maîtriserez le flux de travail complet pour forcer les changements de mot de passe dans Microsoft 365, des opérations sur un seul utilisateur au traitement en masse à l'échelle de l'entreprise. Cela inclut la configuration correcte de l'authentification, la protection des comptes administratifs, la gestion des erreurs, le suivi des progrès et les procédures de vérification complètes. Vous apprendrez également des techniques avancées telles que l'attribution temporaire de mots de passe et les opérations ciblées basées sur CSV, garantissant que vous pouvez gérer tout scénario de gestion des mots de passe requis par votre organisation.

Guide de mise en oeuvre

Procédure complète

01

Installer le SDK Microsoft Graph PowerShell

Tout d'abord, vous devez installer le module SDK Microsoft Graph PowerShell, qui remplace le module MSOnline obsolète. Ouvrez PowerShell en tant qu'administrateur et exécutez la commande d'installation.

Install-Module Microsoft.Graph -Repository PSGallery -AllowClobber -Force

L'installation peut prendre plusieurs minutes car elle télécharge plusieurs sous-modules. Si une invite apparaît concernant l'installation à partir d'un dépôt non fiable, tapez 'Y' pour continuer.

Astuce pro : Utilisez le paramètre -AllowClobber pour écraser les cmdlets existants portant les mêmes noms, afin de vous assurer d'obtenir les dernières versions.

Vérification : Vérifiez la version du module installé :

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

Vous devriez voir le module Microsoft.Graph répertorié avec le numéro de version actuel.

02

Connectez-vous à Microsoft Graph avec les autorisations requises

Établissez une connexion à Microsoft Graph avec les autorisations nécessaires pour modifier les politiques de mot de passe des utilisateurs. Le scope User.ReadWrite.All fournit l'accès requis pour mettre à jour les paramètres de mot de passe des utilisateurs.

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

Cette commande ouvrira une fenêtre de navigateur pour l'authentification. Connectez-vous avec votre compte administrateur Microsoft 365 et consentez aux autorisations demandées.

Avertissement : Utilisez toujours un compte avec les privilèges administratifs appropriés. Les rôles d'administrateur général ou d'administrateur utilisateur sont requis pour les opérations de mot de passe en masse.

Vérification : Confirmez votre connexion et vos autorisations :

Get-MgContext | Select-Object Account, Scopes

La sortie devrait montrer votre compte authentifié et le scope User.ReadWrite.All dans la liste des autorisations.

03

Forcer le changement de mot de passe pour un seul utilisateur

Avant d'exécuter des opérations en masse, testez le processus sur un seul compte utilisateur. Cela aide à vérifier vos autorisations et à comprendre le flux du processus.

$UserPrincipalName = "testuser@yourdomain.com"
Update-MgUser -UserId $UserPrincipalName -PasswordProfile @{
    ForceChangePasswordNextSignIn = $true
}

Remplacez 'testuser@yourdomain.com' par l'adresse e-mail réelle de l'utilisateur. Cette commande définit le drapeau ForceChangePasswordNextSignIn sur true, obligeant l'utilisateur à changer son mot de passe lors de la prochaine connexion.

Vérification : Vérifiez si l'exigence de changement de mot de passe a été appliquée :

Get-MgUser -UserId $UserPrincipalName -Property "UserPrincipalName,PasswordProfile" |
Select-Object UserPrincipalName, @{Name="MustChangePassword";Expression={$_.PasswordProfile.ForceChangePasswordNextSignIn}}

La sortie devrait afficher 'True' dans la colonne MustChangePassword, confirmant que le paramètre a été appliqué avec succès.

04

Récupérer tous les utilisateurs et préparer pour les opérations en masse

Avant de forcer le changement de mot de passe pour tous les utilisateurs, récupérez la liste complète des utilisateurs et préparez votre environnement pour un traitement en masse. Cette étape vous aide à comprendre l'ampleur de l'opération.

$AllUsers = Get-MgUser -All -Property "UserPrincipalName,DisplayName,AccountEnabled"
$TotalUsers = $AllUsers.Count
Write-Host "Total users found: $TotalUsers" -ForegroundColor Cyan

Cette commande récupère tous les utilisateurs avec les propriétés essentielles. Le paramètre -All garantit que vous obtenez chaque utilisateur, pas seulement les 100 premiers (limite par défaut).

Astuce pro : Filtrez les comptes désactivés et les comptes de service avant de procéder pour éviter des opérations inutiles sur les utilisateurs inactifs.

Filtrer uniquement les utilisateurs actifs :

$ActiveUsers = $AllUsers | Where-Object {$_.AccountEnabled -eq $true}
Write-Host "Active users: $($ActiveUsers.Count)" -ForegroundColor Green

Vérification : Affichez un échantillon d'utilisateurs pour révision :

$ActiveUsers | Select-Object UserPrincipalName, DisplayName | Select-Object -First 5
05

Créer une liste d'exclusion de compte administratif

Étape critique : Créez une liste d'exclusion pour les comptes administratifs afin d'éviter de vous verrouiller hors du système. Ceci est essentiel pour maintenir l'accès pendant et après l'opération de changement de mot de passe.

# Définir les comptes administratifs à exclure
$AdminAccounts = @(
    "admin@yourdomain.com",
    "globaladmin@yourdomain.com",
    "serviceaccount@yourdomain.com"
)

# Filtrer les comptes administratifs
$UsersToUpdate = $ActiveUsers | Where-Object {
    $_.UserPrincipalName -notin $AdminAccounts
}

Write-Host "Utilisateurs à mettre à jour après exclusions : $($UsersToUpdate.Count)" -ForegroundColor Yellow
Write-Host "Comptes admin exclus : $($AdminAccounts.Count)" -ForegroundColor Red

Personnalisez le tableau $AdminAccounts avec les adresses email des comptes administratifs de votre organisation. Cela empêche de forcer accidentellement des changements de mot de passe sur des comptes de service critiques.

Avertissement : Ne sautez jamais cette étape. Forcer des changements de mot de passe sur des comptes administratifs peut entraîner des interruptions de service et une perte d'accès aux systèmes critiques.

Vérification : Vérifiez la liste d'exclusion :

Write-Host "Comptes exclus :" -ForegroundColor Red
$AdminAccounts | ForEach-Object { Write-Host "  - $_" -ForegroundColor Red }
06

Exécuter le changement de mot de passe en masse avec suivi de progression

Exécutez maintenant l'opération de changement de mot de passe en masse avec une gestion complète des erreurs et un suivi des progrès. Ce script traite chaque utilisateur individuellement et fournit un retour d'information détaillé.

# Initialiser les compteurs
$SuccessCount = 0
$ErrorCount = 0
$ProcessedCount = 0
$TotalToProcess = $UsersToUpdate.Count

# Traiter chaque utilisateur avec gestion des erreurs
ForEach ($User in $UsersToUpdate) {
    try {
        Update-MgUser -UserId $User.UserPrincipalName -PasswordProfile @{
            ForceChangePasswordNextSignIn = $true
        }
        $SuccessCount++
        Write-Host "✓ Mis à jour avec succès : $($User.UserPrincipalName)" -ForegroundColor Green
    }
    catch {
        $ErrorCount++
        Write-Host "✗ Échec de la mise à jour $($User.UserPrincipalName) : $($_.Exception.Message)" -ForegroundColor Red
    }
    
    $ProcessedCount++
    $PercentComplete = [math]::Round(($ProcessedCount / $TotalToProcess) * 100, 2)
    Write-Progress -Activity "Forcing Password Changes" -Status "Processing $($User.UserPrincipalName)" -PercentComplete $PercentComplete
    
    # Ajouter un petit délai pour éviter le throttling
    Start-Sleep -Milliseconds 500
}

Write-Host "`nOpération terminée :" -ForegroundColor Cyan
Write-Host "  Succès : $SuccessCount" -ForegroundColor Green
Write-Host "  Erreurs : $ErrorCount" -ForegroundColor Red
Write-Host "  Total traité : $ProcessedCount" -ForegroundColor Cyan

Vérification : Vérifiez un échantillon aléatoire d'utilisateurs mis à jour :

$SampleUsers = $UsersToUpdate | Get-Random -Count 3
$SampleUsers | ForEach-Object {
    $User = Get-MgUser -UserId $_.UserPrincipalName -Property "UserPrincipalName,PasswordProfile"
    [PSCustomObject]@{
        UserPrincipalName = $User.UserPrincipalName
        MustChangePassword = $User.PasswordProfile.ForceChangePasswordNextSignIn
    }
}
07

Forcer les changements de mot de passe avec l'attribution de mot de passe temporaire

Pour une sécurité renforcée, vous pouvez forcer les changements de mot de passe tout en attribuant simultanément des mots de passe temporaires. Cela garantit que les utilisateurs obtiennent de nouvelles informations d'identification immédiatement et doivent les changer lors de la prochaine connexion.

# Fonction pour générer des mots de passe temporaires sécurisés
function New-TempPassword {
    param([int]$Length = 12)
    $Characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*'
    $Password = -join ((1..$Length) | ForEach {$Characters[(Get-Random -Maximum $Characters.Length)]})
    return $Password
}

# Tableau pour stocker les résultats
$PasswordResults = @()

# Traiter les utilisateurs avec l'attribution de mot de passe temporaire
ForEach ($User in $UsersToUpdate) {
    try {
        $TempPassword = New-TempPassword
        Update-MgUser -UserId $User.UserPrincipalName -PasswordProfile @{
            Password = $TempPassword
            ForceChangePasswordNextSignIn = $true
        }
        
        $PasswordResults += [PSCustomObject]@{
            UserPrincipalName = $User.UserPrincipalName
            DisplayName = $User.DisplayName
            TempPassword = $TempPassword
            Status = "Success"
            Timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
        }
        
        Write-Host "✓ Mot de passe mis à jour pour : $($User.UserPrincipalName)" -ForegroundColor Green
    }
    catch {
        $PasswordResults += [PSCustomObject]@{
            UserPrincipalName = $User.UserPrincipalName
            DisplayName = $User.DisplayName
            TempPassword = "N/A"
            Status = "Failed: $($_.Exception.Message)"
            Timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
        }
        Write-Host "✗ Échec de la mise à jour du mot de passe pour $($User.UserPrincipalName)" -ForegroundColor Red
    }
    
    Start-Sleep -Milliseconds 500
}

Exporter les résultats en CSV :

$ExportPath = "C:\Temp\PasswordReset-$(Get-Date -Format 'yyyyMMdd-HHmmss').csv"
$PasswordResults | Export-Csv -Path $ExportPath -NoTypeInformation
Write-Host "Résultats exportés vers : $ExportPath" -ForegroundColor Cyan
Avertissement : Stockez le fichier CSV contenant les mots de passe temporaires dans un endroit sécurisé et supprimez-le après avoir distribué les mots de passe aux utilisateurs. Ne jamais envoyer de mots de passe en texte clair par email.
08

Traiter les utilisateurs à partir d'un fichier CSV pour des opérations ciblées

Pour des changements de mot de passe ciblés, vous pouvez traiter des utilisateurs spécifiques à partir d'un fichier CSV. Cette approche est utile lorsque vous devez forcer des changements de mot de passe pour des départements, groupes ou incidents de sécurité spécifiques.

Tout d'abord, créez un fichier CSV avec la structure suivante :

UserPrincipalName,DisplayName,Department
user1@yourdomain.com,John Doe,IT
user2@yourdomain.com,Jane Smith,HR
user3@yourdomain.com,Bob Johnson,Finance

Enregistrez ceci sous le nom 'users.csv' dans le répertoire C:\Temp\. Ensuite, traitez les utilisateurs :

# Importer les utilisateurs depuis le CSV
$CSVPath = "C:\Temp\users.csv"
if (Test-Path $CSVPath) {
    $UsersFromCSV = Import-Csv $CSVPath
    Write-Host "Importé $($UsersFromCSV.Count) utilisateurs depuis le CSV" -ForegroundColor Cyan
    
    # Traiter chaque utilisateur depuis le CSV
    $CSVResults = @()
    $UsersFromCSV | ForEach-Object {
        try {
            Update-MgUser -UserId $_.UserPrincipalName -PasswordProfile @{
                ForceChangePasswordNextSignIn = $true
            }
            
            $CSVResults += [PSCustomObject]@{
                UserPrincipalName = $_.UserPrincipalName
                DisplayName = $_.DisplayName
                Department = $_.Department
                Status = "Succès"
                ProcessedTime = Get-Date
            }
            
            Write-Host "✓ Mis à jour : $($_.UserPrincipalName)" -ForegroundColor Green
        }
        catch {
            $CSVResults += [PSCustomObject]@{
                UserPrincipalName = $_.UserPrincipalName
                DisplayName = $_.DisplayName
                Department = $_.Department
                Status = "Échec : $($_.Exception.Message)"
                ProcessedTime = Get-Date
            }
            Write-Host "✗ Échec : $($_.UserPrincipalName)" -ForegroundColor Red
        }
        
        Start-Sleep -Milliseconds 300
    }
    
    # Afficher le résumé
    $SuccessfulCSV = ($CSVResults | Where-Object {$_.Status -eq "Succès"}).Count
    $FailedCSV = ($CSVResults | Where-Object {$_.Status -ne "Succès"}).Count
    
    Write-Host "`nRésumé du traitement CSV :" -ForegroundColor Cyan
    Write-Host "  Réussi : $SuccessfulCSV" -ForegroundColor Green
    Write-Host "  Échoué : $FailedCSV" -ForegroundColor Red
}
else {
    Write-Host "Fichier CSV non trouvé à $CSVPath" -ForegroundColor Red
}
Conseil pro : Utilisez le traitement CSV pour les scénarios de réponse aux incidents où vous devez rapidement forcer des changements de mot de passe pour des comptes compromis ou des groupes d'utilisateurs spécifiques.

Vérification : Exporter les résultats CSV pour la documentation :

$CSVResults | Export-Csv -Path "C:\Temp\CSV-PasswordReset-Results-$(Get-Date -Format 'yyyyMMdd-HHmmss').csv" -NoTypeInformation
09

Vérifier les exigences de changement de mot de passe et générer des rapports

Après avoir terminé les opérations de changement de mot de passe, vérifiez les résultats et générez des rapports complets à des fins de documentation et de conformité.

# Vérifier les exigences de changement de mot de passe pour tous les utilisateurs traités
$VerificationResults = @()

Write-Host "Vérification des exigences de changement de mot de passe..." -ForegroundColor Cyan

$UsersToUpdate | ForEach-Object {
    try {
        $UserDetails = Get-MgUser -UserId $_.UserPrincipalName -Property "UserPrincipalName,DisplayName,PasswordProfile,LastPasswordChangeDateTime"
        
        $VerificationResults += [PSCustomObject]@{
            UserPrincipalName = $UserDetails.UserPrincipalName
            DisplayName = $UserDetails.DisplayName
            MustChangePassword = $UserDetails.PasswordProfile.ForceChangePasswordNextSignIn
            LastPasswordChange = $UserDetails.LastPasswordChangeDateTime
            VerificationTime = Get-Date
            Status = if ($UserDetails.PasswordProfile.ForceChangePasswordNextSignIn) { "Verified" } else { "Not Set" }
        }
    }
    catch {
        $VerificationResults += [PSCustomObject]@{
            UserPrincipalName = $_.UserPrincipalName
            DisplayName = "Unknown"
            MustChangePassword = "Error"
            LastPasswordChange = "Unknown"
            VerificationTime = Get-Date
            Status = "Verification Failed: $($_.Exception.Message)"
        }
    }
}

# Générer des statistiques de synthèse
$TotalVerified = $VerificationResults.Count
$RequireChange = ($VerificationResults | Where-Object {$_.MustChangePassword -eq $true}).Count
$NotSet = ($VerificationResults | Where-Object {$_.MustChangePassword -eq $false}).Count
$Errors = ($VerificationResults | Where-Object {$_.Status -like "*Failed*"}).Count

Write-Host "`nRésumé de la vérification :" -ForegroundColor Cyan
Write-Host "  Nombre total d'utilisateurs vérifiés : $TotalVerified" -ForegroundColor White
Write-Host "  Nécessitent un changement de mot de passe : $RequireChange" -ForegroundColor Green
Write-Host "  Non défini : $NotSet" -ForegroundColor Yellow
Write-Host "  Erreurs de vérification : $Errors" -ForegroundColor Red

Générer un rapport complet :

# Exporter le rapport de vérification détaillé
$ReportPath = "C:\Temp\PasswordChange-VerificationReport-$(Get-Date -Format 'yyyyMMdd-HHmmss').csv"
$VerificationResults | Export-Csv -Path $ReportPath -NoTypeInformation

Write-Host "`nRapport détaillé exporté vers : $ReportPath" -ForegroundColor Cyan

# Afficher les utilisateurs qui ne nécessitent toujours pas de changement de mot de passe (problèmes potentiels)
$ProblematicUsers = $VerificationResults | Where-Object {$_.MustChangePassword -eq $false}
if ($ProblematicUsers.Count -gt 0) {
    Write-Host "`nUtilisateurs ne nécessitant pas de changement de mot de passe (révision nécessaire) :" -ForegroundColor Yellow
    $ProblematicUsers | Select-Object UserPrincipalName, Status | Format-Table -AutoSize
}

Commande de vérification finale :

# Vérification rapide d'un échantillon aléatoire
Get-MgUser -All -Property "UserPrincipalName,PasswordProfile" | 
Where-Object {$_.PasswordProfile.ForceChangePasswordNextSignIn -eq $true} | 
Select-Object UserPrincipalName, @{Name="RequiresPasswordChange";Expression={$_.PasswordProfile.ForceChangePasswordNextSignIn}} | 
Select-Object -First 10

Questions Fréquentes

Puis-je forcer le changement de mot de passe pour tous les utilisateurs de Microsoft 365 sans affecter les comptes administratifs ?+
Oui, vous pouvez exclure les comptes administratifs en créant une liste d'exclusion avant d'exécuter des opérations en masse. Définissez un tableau d'adresses e-mail de comptes administratifs et filtrez-les à l'aide du cmdlet Where-Object de PowerShell. Cela empêche de verrouiller accidentellement des comptes de service critiques et maintient l'accès au système lors des opérations de changement de mot de passe.
Quelle est la différence entre Microsoft Graph PowerShell et le module MSOnline pour la gestion des mots de passe ?+
Le SDK Microsoft Graph PowerShell est l'approche moderne recommandée qui utilise les cmdlets Update-MgUser, tandis que le module MSOnline utilise les cmdlets Set-MsolUser obsolètes. Graph PowerShell offre une meilleure gestion des erreurs, des autorisations plus granulaires et est activement maintenu par Microsoft. Le module MSOnline est en cours de suppression et ne doit pas être utilisé pour de nouvelles implémentations.
Comment puis-je vérifier que les exigences de changement de mot de passe ont été appliquées avec succès aux utilisateurs ?+
Utilisez le cmdlet Get-MgUser avec la propriété PasswordProfile pour vérifier le paramètre ForceChangePasswordNextSignIn. Vous pouvez vérifier des utilisateurs individuels ou créer des scripts de vérification qui traitent tous les utilisateurs mis à jour et génèrent des rapports montrant quels comptes nécessitent des changements de mot de passe et quelles opérations ont échoué.
Est-il possible d'attribuer des mots de passe temporaires tout en forçant les changements de mot de passe dans Microsoft 365 ?+
Oui, vous pouvez utiliser le cmdlet Update-MgUser avec les paramètres Password et ForceChangePasswordNextSignIn dans l'objet PasswordProfile. Créez une fonction de génération de mot de passe sécurisé et attribuez des mots de passe temporaires tout en définissant le drapeau de changement forcé. Exportez toujours les résultats en CSV pour une distribution sécurisée et supprimez le fichier après utilisation.
Quelles autorisations sont nécessaires pour forcer les changements de mot de passe pour les utilisateurs de Microsoft 365 en utilisant PowerShell ?+
Vous avez besoin de l'étendue User.ReadWrite.All dans Microsoft Graph PowerShell, ce qui nécessite les rôles d'administrateur général ou d'administrateur d'utilisateur dans Microsoft 365. Connectez-vous en utilisant Connect-MgGraph avec les étendues appropriées, et assurez-vous que votre compte dispose de privilèges suffisants pour modifier les politiques de mot de passe des utilisateurs dans l'ensemble de l'organisation.
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...