Anavem
Languageen
Comment supprimer des groupes orphelins dans Azure AD à l'aide de Microsoft Graph PowerShell

Comment supprimer des groupes orphelins dans Azure AD à l'aide de Microsoft Graph PowerShell

Apprenez à identifier et supprimer les groupes Azure AD orphelins en utilisant le SDK moderne Microsoft Graph PowerShell, en remplaçant les modules Azure AD PowerShell obsolètes par les méthodes actuelles de 2026.

Evan MaelEvan Mael
27 mars 2026 15 min
mediumazure-ad 7 étapes 15 min

Pourquoi supprimer les groupes orphelins dans Azure AD ?

Les groupes orphelins dans Azure Active Directory sont des vestiges de processus de synchronisation interrompus, généralement laissés après la suppression d'Azure AD Connect ou d'autres outils de synchronisation de répertoires. Ces groupes consomment des licences, créent des risques de sécurité et encombrent votre annuaire avec des objets obsolètes qui ne peuvent pas être gérés via l'interface graphique du portail Azure.

Qu'est-ce qui a changé en 2026 pour la gestion des groupes Azure AD ?

Le module PowerShell Azure AD traditionnel a été déprécié le 30 mars 2024 et a cessé de fonctionner entièrement le 30 mars 2025. Tout tutoriel utilisant les commandes Connect-AzureAD ou Remove-AzureADGroup est désormais obsolète. Le SDK Microsoft Graph PowerShell est la norme actuelle, offrant une sécurité renforcée, de meilleures performances et un accès API unifié à tous les services Microsoft 365.

En quoi les commandes Microsoft Graph diffèrent-elles de l'ancien PowerShell Azure AD ?

La migration de PowerShell Azure AD vers Microsoft Graph PowerShell apporte des changements significatifs en termes de syntaxe et d'authentification. Là où vous utilisiez auparavant Connect-AzureAD, vous utilisez maintenant Connect-MgGraph avec des portées spécifiques. Les commandes de gestion de groupe comme Get-AzureADGroup deviennent Get-MgGroup, offrant des permissions plus granulaires et une meilleure intégration avec les protocoles d'authentification modernes. Ce tutoriel démontre l'approche actuelle de 2026 en utilisant le SDK Microsoft Graph PowerShell, garantissant que vos scripts restent fonctionnels et sécurisés.

Guide de mise en oeuvre

Procédure complète

01

Installer le SDK Microsoft Graph PowerShell

Tout d'abord, nous devons installer le SDK Microsoft Graph PowerShell, qui a remplacé le module Azure AD PowerShell obsolète en 2024. Ouvrez PowerShell en tant qu'administrateur et installez les modules requis.

# Vérifier la version de PowerShell (doit être 7.2 ou supérieure)
$PSVersionTable.PSVersion

# Installer le SDK Microsoft Graph PowerShell
Install-Module Microsoft.Graph -Scope CurrentUser -Force

# Installer des modules spécifiques pour la gestion des groupes
Install-Module Microsoft.Graph.Groups -Scope CurrentUser -Force
Install-Module Microsoft.Graph.DirectoryObjects -Scope CurrentUser -Force

L'installation peut prendre plusieurs minutes car elle télécharge plusieurs sous-modules. Vous verrez des indicateurs de progression pour chaque composant en cours d'installation.

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

Vérifiez l'installation en vérifiant la version du module :

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

Connectez-vous à Microsoft Graph avec les autorisations requises

Connectez-vous à Microsoft Graph en utilisant les autorisations appropriées pour la gestion des groupes. Cela remplace la commande Connect-AzureAD de l'ancien module.

# Connectez-vous à Microsoft Graph avec des autorisations de gestion des groupes
Connect-MgGraph -Scopes "Group.ReadWrite.All", "Directory.ReadWrite.All", "GroupMember.ReadWrite.All"

# Vérifiez la connexion et consultez le contexte actuel
Get-MgContext | Select-Object Account, Scopes, TenantId

Une fenêtre de navigateur s'ouvrira pour l'authentification. Connectez-vous avec votre compte d'administrateur global ou d'administrateur de groupes. Après une authentification réussie, vous verrez une confirmation dans la console PowerShell.

Avertissement : Le scope Directory.ReadWrite.All fournit des autorisations étendues. Utilisez uniquement des comptes avec les droits administratifs appropriés.

Confirmez que vous êtes connecté au bon locataire :

# Affichez les informations du locataire
Get-MgOrganization | Select-Object DisplayName, Id, VerifiedDomains
03

Identifier les groupes orphelins dans votre locataire

Nous allons maintenant identifier les groupes orphelins qui restent généralement après la suppression d'Azure AD Connect ou d'autres outils de synchronisation. Ces groupes ont souvent des caractéristiques spécifiques qui les rendent identifiables.

# Obtenez tous les groupes et filtrez pour les groupes potentiellement orphelins
$allGroups = Get-MgGroup -All -Property Id, DisplayName, Description, GroupTypes, SecurityEnabled, MailEnabled, OnPremisesSyncEnabled, CreatedDateTime

# Filtrez pour les groupes qui sont probablement orphelins (synchronisés sur site mais plus actifs)
$orphanedGroups = $allGroups | Where-Object {
    $_.OnPremisesSyncEnabled -eq $true -and
    $_.Description -like "*orphaned*" -or
    $_.DisplayName -like "*_*" -or
    $_.DisplayName -match "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
}

# Affichez les groupes potentiellement orphelins
$orphanedGroups | Select-Object DisplayName, Id, Description, CreatedDateTime | Format-Table -AutoSize

Cette commande identifie les groupes avec des caractéristiques communes aux orphelins : synchronisation sur site activée, noms de type GUID ou descriptions contenant "orphaned".

Pour une recherche plus complète, vérifiez les groupes sans membres :

# Vérifiez les groupes vides qui pourraient être orphelins
$emptyGroups = @()
foreach ($group in $allGroups) {
    $memberCount = (Get-MgGroupMember -GroupId $group.Id -All).Count
    if ($memberCount -eq 0) {
        $emptyGroups += $group
    }
}

$emptyGroups | Select-Object DisplayName, Id, CreatedDateTime | Format-Table -AutoSize
Astuce pro : Passez toujours en revue la liste manuellement avant de supprimer. Certains groupes vides pourraient être intentionnellement créés pour une utilisation future.
04

Exporter les informations du groupe pour sauvegarde

Avant de supprimer des groupes, créez une sauvegarde complète de leurs informations. Cela est crucial pour la récupération si vous supprimez accidentellement les mauvais groupes.

# Créer un répertoire de sauvegarde
$backupPath = "C:\AzureAD_GroupBackup_$(Get-Date -Format 'yyyyMMdd_HHmmss')"
New-Item -ItemType Directory -Path $backupPath -Force

# Exporter toutes les informations de groupe vers un fichier CSV
$allGroups | Export-Csv -Path "$backupPath\AllGroups_Backup.csv" -NoTypeInformation

# Exporter des informations détaillées pour chaque groupe orphelin
foreach ($group in $orphanedGroups) {
    $groupDetails = @{
        'GroupId' = $group.Id
        'DisplayName' = $group.DisplayName
        'Description' = $group.Description
        'GroupTypes' = $group.GroupTypes -join ','
        'SecurityEnabled' = $group.SecurityEnabled
        'MailEnabled' = $group.MailEnabled
        'CreatedDateTime' = $group.CreatedDateTime
        'OnPremisesSyncEnabled' = $group.OnPremisesSyncEnabled
    }
    
    # Obtenir les membres du groupe
    $members = Get-MgGroupMember -GroupId $group.Id -All
    $groupDetails['MemberCount'] = $members.Count
    $groupDetails['Members'] = ($members | ForEach-Object { $_.AdditionalProperties.displayName }) -join ';'
    
    # Exporter vers un fichier JSON individuel
    $groupDetails | ConvertTo-Json | Out-File -FilePath "$backupPath\Group_$($group.DisplayName -replace '[^a-zA-Z0-9]', '_').json"
}

Write-Host "Sauvegarde terminée à : $backupPath" -ForegroundColor Green

Cela crée un répertoire de sauvegarde horodaté avec des informations complètes sur les groupes, y compris les membres, les propriétés et les métadonnées.

Avertissement : Stockez les sauvegardes dans un endroit sécurisé. Les informations de groupe peuvent contenir des données organisationnelles sensibles.

Vérifiez que la sauvegarde a été créée avec succès :

Get-ChildItem $backupPath | Select-Object Name, Length, LastWriteTime
05

Valider les groupes avant la suppression

Effectuez une validation finale pour vous assurer que vous ne supprimez que des groupes véritablement orphelins. Cette étape empêche la suppression accidentelle de groupes actifs.

# Créer un rapport de validation
$validationReport = @()

foreach ($group in $orphanedGroups) {
    $validation = @{
        'GroupName' = $group.DisplayName
        'GroupId' = $group.Id
        'MemberCount' = (Get-MgGroupMember -GroupId $group.Id -All).Count
        'HasOwners' = (Get-MgGroupOwner -GroupId $group.Id -All).Count -gt 0
        'LastActivity' = 'Unknown' # Microsoft Graph ne fournit pas directement la dernière activité
        'IsMailEnabled' = $group.MailEnabled
        'IsSecurityGroup' = $group.SecurityEnabled
        'OnPremisesSync' = $group.OnPremisesSyncEnabled
        'RecommendDelete' = $false
    }
    
    # Déterminer si le groupe doit être supprimé en fonction des critères
    if ($validation.MemberCount -eq 0 -and 
        -not $validation.HasOwners -and 
        $validation.OnPremisesSync -eq $true) {
        $validation.RecommendDelete = $true
    }
    
    $validationReport += New-Object PSObject -Property $validation
}

# Afficher le rapport de validation
$validationReport | Format-Table GroupName, MemberCount, HasOwners, IsMailEnabled, RecommendDelete -AutoSize

# Afficher uniquement les groupes recommandés pour la suppression
$groupsToDelete = $validationReport | Where-Object { $_.RecommendDelete -eq $true }
Write-Host "Groupes recommandés pour la suppression : $($groupsToDelete.Count)" -ForegroundColor Yellow

Examinez attentivement le rapport de validation. Les groupes marqués avec RecommendDelete = $true répondent aux critères pour une suppression sécurisée.

Astuce pro : Si vous avez des doutes sur un groupe, vérifiez avec les propriétaires d'origine du groupe ou l'équipe informatique de votre organisation avant la suppression.

Vérifiez manuellement des groupes spécifiques :

# Inspecter manuellement un groupe spécifique
$groupId = "your-group-id-here"
Get-MgGroup -GroupId $groupId | Select-Object DisplayName, Description, CreatedDateTime, OnPremisesSyncEnabled
Get-MgGroupMember -GroupId $groupId -All | Select-Object AdditionalProperties
06

Supprimer les groupes orphelins à l'aide de Microsoft Graph

Nous allons maintenant supprimer les groupes orphelins validés en utilisant le SDK Microsoft Graph PowerShell. Cela remplace le cmdlet Remove-AzureADGroup obsolète.

# Supprimer les groupes orphelins avec confirmation
$deletionLog = @()

foreach ($group in $groupsToDelete) {
    try {
        Write-Host "Tentative de suppression du groupe : $($group.GroupName)" -ForegroundColor Yellow
        
        # Supprimer le groupe
        Remove-MgGroup -GroupId $group.GroupId -Confirm:$false
        
        $logEntry = @{
            'GroupName' = $group.GroupName
            'GroupId' = $group.GroupId
            'DeletionTime' = Get-Date
            'Status' = 'Success'
            'Error' = $null
        }
        
        Write-Host "Supprimé avec succès : $($group.GroupName)" -ForegroundColor Green
        
    } catch {
        $logEntry = @{
            'GroupName' = $group.GroupName
            'GroupId' = $group.GroupId
            'DeletionTime' = Get-Date
            'Status' = 'Failed'
            'Error' = $_.Exception.Message
        }
        
        Write-Host "Échec de la suppression de $($group.GroupName) : $($_.Exception.Message)" -ForegroundColor Red
    }
    
    $deletionLog += New-Object PSObject -Property $logEntry
    Start-Sleep -Seconds 2  # Éviter la limitation de l'API
}

# Exporter le journal de suppression
$deletionLog | Export-Csv -Path "$backupPath\DeletionLog.csv" -NoTypeInformation

# Afficher le résumé
$successCount = ($deletionLog | Where-Object { $_.Status -eq 'Success' }).Count
$failedCount = ($deletionLog | Where-Object { $_.Status -eq 'Failed' }).Count

Write-Host "\nRésumé de la suppression :" -ForegroundColor Cyan
Write-Host "Supprimé avec succès : $successCount groupes" -ForegroundColor Green
Write-Host "Échecs de suppression : $failedCount groupes" -ForegroundColor Red
Avertissement : La suppression de groupe est permanente et ne peut pas être annulée via PowerShell. Assurez-vous d'avoir des sauvegardes appropriées avant de continuer.

Pour une suppression plus sûre avec confirmation individuelle :

# Alternative : Supprimer avec confirmation individuelle
foreach ($group in $groupsToDelete) {
    $confirmation = Read-Host "Supprimer le groupe '$($group.GroupName)' ? (y/N)"
    if ($confirmation -eq 'y' -or $confirmation -eq 'Y') {
        Remove-MgGroup -GroupId $group.GroupId
        Write-Host "Supprimé : $($group.GroupName)" -ForegroundColor Green
    }
}
07

Vérifier la suppression et le nettoyage

Vérifiez que les groupes orphelins ont été supprimés avec succès et effectuez les tâches de nettoyage.

# Vérifier que les groupes sont supprimés
Write-Host "Vérification des suppressions de groupes..." -ForegroundColor Cyan

$verificationResults = @()
foreach ($deletedGroup in ($deletionLog | Where-Object { $_.Status -eq 'Success' })) {
    try {
        $group = Get-MgGroup -GroupId $deletedGroup.GroupId -ErrorAction Stop
        $verificationResults += @{
            'GroupName' = $deletedGroup.GroupName
            'Status' = 'Still Exists'
            'Note' = 'Le groupe n'a pas été supprimé avec succès'
        }
    } catch {
        $verificationResults += @{
            'GroupName' = $deletedGroup.GroupName
            'Status' = 'Deleted Successfully'
            'Note' = 'Le groupe n'existe plus dans Azure AD'
        }
    }
}

# Afficher les résultats de la vérification
$verificationResults | ForEach-Object { New-Object PSObject -Property $_ } | Format-Table -AutoSize

# Vérifier s'il reste des groupes orphelins
Write-Host "\nVérification des groupes orphelins restants..." -ForegroundColor Cyan
$remainingGroups = Get-MgGroup -All -Property Id, DisplayName, OnPremisesSyncEnabled | Where-Object {
    $_.OnPremisesSyncEnabled -eq $true -and
    $_.DisplayName -like "*_*"
}

if ($remainingGroups.Count -gt 0) {
    Write-Host "Trouvé $($remainingGroups.Count) groupes potentiellement orphelins restants :" -ForegroundColor Yellow
    $remainingGroups | Select-Object DisplayName, Id | Format-Table -AutoSize
} else {
    Write-Host "Aucun groupe orphelin supplémentaire trouvé." -ForegroundColor Green
}

# Générer le rapport final
$finalReport = @{
    'TotalGroupsProcessed' = $orphanedGroups.Count
    'SuccessfulDeletions' = $successCount
    'FailedDeletions' = $failedCount
    'BackupLocation' = $backupPath
    'ProcessingDate' = Get-Date
}

$finalReport | ConvertTo-Json | Out-File -FilePath "$backupPath\FinalReport.json"

Write-Host "\nNettoyage terminé. Rapport final enregistré à : $backupPath\FinalReport.json" -ForegroundColor Green
Conseil pro : Conservez le répertoire de sauvegarde pendant au moins 30 jours au cas où vous auriez besoin de consulter les informations sur les groupes supprimés.

Déconnectez-vous de Microsoft Graph une fois terminé :

# Déconnecter de Microsoft Graph
Disconnect-MgGraph
Write-Host "Déconnecté de Microsoft Graph" -ForegroundColor Green

Questions Fréquentes

Pourquoi ne puis-je pas utiliser les commandes Connect-AzureAD en 2026 pour la gestion des groupes Azure AD ?+
Le module Azure AD PowerShell a été déprécié le 30 mars 2024 et a cessé de fonctionner entièrement le 30 mars 2025. Microsoft l'a remplacé par le Microsoft Graph PowerShell SDK, qui utilise Connect-MgGraph et offre une meilleure sécurité, performance et un accès API unifié. Tous les scripts utilisant l'ancien module AzureAD échoueront en 2026.
Quelles autorisations sont nécessaires pour supprimer des groupes orphelins à l'aide de Microsoft Graph PowerShell ?+
Vous avez besoin du rôle d'administrateur général ou d'administrateur de groupes dans Azure AD, ainsi que des autorisations Microsoft Graph suivantes : Group.ReadWrite.All pour la gestion des groupes, Directory.ReadWrite.All pour l'accès à l'annuaire, et GroupMember.ReadWrite.All pour la gestion des membres. Ces autorisations sont spécifiées lors de la connexion avec Connect-MgGraph.
Comment puis-je identifier quels groupes sont réellement orphelins dans Azure AD ?+
Les groupes orphelins ont généralement OnPremisesSyncEnabled défini sur true mais aucune source de synchronisation active, ont souvent des noms ressemblant à des GUID ou contenant des underscores, n'ont aucun membre ni propriétaire, et peuvent avoir des descriptions mentionnant 'orphelin'. Utilisez Get-MgGroup avec filtrage pour identifier ces caractéristiques avant suppression.
Puis-je récupérer des groupes Azure AD après les avoir supprimés avec Microsoft Graph PowerShell ?+
Les groupes supprimés via PowerShell sont définitivement supprimés et ne peuvent pas être récupérés par des commandes PowerShell. Cependant, Azure AD conserve les groupes supprimés dans une corbeille pendant 30 jours, accessible via le portail Azure sous 'Groupes supprimés'. Créez toujours des sauvegardes complètes avant la suppression comme indiqué dans ce tutoriel.
Quelle est la différence entre les commandes Remove-AzureADGroup et Remove-MgGroup ?+
Remove-AzureADGroup faisait partie du module Azure AD PowerShell obsolète et ne fonctionnera plus en 2026. Remove-MgGroup est la commande actuelle du SDK Microsoft Graph PowerShell qui offre la même fonctionnalité avec une meilleure gestion des erreurs, une authentification via des protocoles modernes et une intégration avec le modèle de permissions de l'API Microsoft Graph.
Evan Mael
Écrit par

Evan Mael

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

Connectez-vous pour participer