IAMinerva
AccueilBlogA propos
m3Nouveautes M365coMicrosoft CopilotteMicrosoft TeamsshSharePoint & OneDriveinIntune & SecuriteexExchange & OutlookpoPower PlatformazAzure & Entra IDtuTutoriels & GuidesevEvenements & ConferencesseSecuritewiWindows
IAMinerva

Blog professionnel dedie a l'ecosysteme Microsoft 365.

Liens rapides

AccueilBlogA proposNewsletter

Restez informe

Recevez les dernieres actualites Microsoft 365 directement dans votre boite mail.

© 2026 IAMinerva. Tous droits reserves.

Construit avecNext.js&Tailwind
Detecter les canaux inactifs Teams avec PowerShell
BlogMicrosoft TeamsDetecter les canaux inactifs Teams avec PowerShell
Microsoft Teams#Teams#PowerShell#Microsoft Graph

Detecter les canaux inactifs Teams avec PowerShell

Détectez les canaux Teams inactifs avec Microsoft Graph PowerShell SDK. Scripts, archivage automatisé et intégration Azure Automation pour la gouvernance des données.

Houssem MAKHLOUF
25 juin 2026
9 min de lecture

TL;DR par Minerva

généré par IA

Détectez les canaux Teams inactifs avec Microsoft Graph PowerShell SDK. Scripts, archivage automatisé et intégration Azure Automation pour la gouvernance des données.

Introduction

Les environnements Microsoft Teams accumulent progressivement des canaux obsolètes au fil du temps. Ces canaux, créés pour des besoins temporaires ou des projets achevés, restent souvent orphelins sans intervention administrative. Cette situation génère une dégradation de l'expérience utilisateur, pollue les résultats de recherche et, dans le contexte de Microsoft 365 Copilot, risque de contaminer les réponses générées par l'IA avec des informations obsolètes extraites de conversations archivées. Cet article aborde une stratégie systématique pour détecter ces canaux inactifs et mettre en place un processus de gestion récurrent.

Limites des outils d'administration native Teams

Absence de rapports d'inactivité dans l'admin center

Microsoft ne fournit pas de rapport natif permettant d'identifier précisément les canaux inactifs dans l'interface d'administration Teams. Le rapport d'utilisation Teams standard inclut une colonne "canaux actifs" peu utile, car elle ne révèle pas quels canaux spécifiques présentent une inactivité prolongée. Les tentatives d'utilisation de Copilot pour Microsoft 365 dans le contexte de gestion administrative Teams retournent des orientations vers des features de "collaboration inactive" qui ne répondent pas au besoin réel d'identification granulaire des canaux dormants.

Limitation des métriques disponibles

Le tableau de bord collaboratif standard de l'admin center Teams ne fournit que des agrégats globaux, sans détail par canal. Cette lacune impose une approche programmatique utilisant les APIs Microsoft Graph pour extraire et analyser les données d'activité détaillées.

Architecture solution : Microsoft Graph PowerShell SDK

Prérequis techniques et permissions

L'implémentation requiert une session app-only avec le Microsoft Graph PowerShell SDK configurée avec les permissions suivantes :

  • Team.ReadBasic.All : énumération des équipes Teams
  • Channel.ReadBasic.All : lecture des métadonnées des canaux
  • ChannelMessage.Read.All : accès à l'historique des messages
  • ChannelMember.Read.All : récupération de l'appartenance aux canaux
!

Important : Mode App-Only requis

Une session déléguée ne fonctionnera pas, car elle nécessiterait que le compte authentifié soit membre de tous les canaux (partagés, privés et standard) du locataire. Cette situation est pratiquement impossible à réaliser en production. Vous devez obligatoirement utiliser une application enregistrée dans Microsoft Entra ID avec consentement administrateur appliqué aux permissions app-only.

Logique de détection d'inactivité

L'algorithme de détection fonctionne selon les étapes suivantes :

  1. Énumération des équipes via Get-MgTeam
  2. Itération sur les canaux de chaque équipe avec Get-MgTeamChannel
  3. Extraction du dernier message du canal via Get-MgTeamChannelMessage
  4. Filtrage des messages système : exclusion des notifications automatiques (ajout de membres, modifications de configuration, etc.)
  5. Comparaison temporelle : si le dernier message humain est antérieur à un seuil défini (180 jours par défaut), le canal est marqué inactif
✦

Astuce : Différenciation messages humains vs système

Les messages système postés automatiquement par Teams (notifications d'adhésion, modification de configuration, etc.) ne reflètent pas l'activité réelle. Un filtrage basé sur la propriété messageType du message est essentiel pour identifier correctement le dernier engagement utilisateur véritable.

Implémentation du script de détection

Initialisation et configuration

⚡PowerShell
1# Configuration des paramètres d'inactivité
2$InactivityThresholdDays = 180
3$CutoffDate = (Get-Date).AddDays(-$InactivityThresholdDays)
4
5# Authentification app-only
6Connect-MgGraph -ClientId "<APP_ID>" -TenantId "<TENANT_ID>" -CertificateThumbprint "<THUMBPRINT>"
7
8# Variables d'accumulateurs pour le rapport
9$InactiveChannels = @()

Boucle d'énumération et détection

⚡PowerShell
1# Récupération de toutes les équipes
2$Teams = Get-MgTeam -All
3
4foreach ($Team in $Teams) {
5 Write-Host "Traitement de l'équipe : $($Team.DisplayName)" -ForegroundColor Cyan
6
7 # Énumération des canaux (standard, partagés et privés)
8 $Channels = Get-MgTeamChannel -TeamId $Team.Id -All
9
10 foreach ($Channel in $Channels) {
11 # Récupération des messages du canal (limité à 1 pour performance)
12 $Messages = Get-MgTeamChannelMessage -TeamId $Team.Id -ChannelId $Channel.Id `
13 -PageSize 1 -All | Where-Object { $_.MessageType -ne 'systemEventMessage' }
14
15 if ($null -eq $Messages -or $Messages.Count -eq 0) {
16 $LastMessageDate = $null
17 $LastMessageAuthor = "Aucun message"
18 }
19 else {
20 $LastMessage = $Messages[0]
21 $LastMessageDate = $LastMessage.CreatedDateTime
22 $LastMessageAuthor = $LastMessage.From.User.DisplayName
23 }
24
25 # Détection d'inactivité
26 if ($null -eq $LastMessageDate -or $LastMessageDate -lt $CutoffDate) {
27 $InactiveChannels += [PSCustomObject]@{
28 TeamName = $Team.DisplayName
29 TeamId = $Team.Id
30 ChannelName = $Channel.DisplayName
31 ChannelId = $Channel.Id
32 LastMessageDate = $LastMessageDate
33 LastMessageAuthor = $LastMessageAuthor
34 ChannelType = $Channel.DisplayName -match '^General$' ? 'Standard' : 'Partagé/Privé'
35 DaysInactive = if ($null -ne $LastMessageDate) {
36 ((Get-Date) - $LastMessageDate).Days
37 } else {
38 'N/A'
39 }
40 TeamOwners = @(Get-MgTeamOwner -TeamId $Team.Id).User.UserPrincipalName -join '; '
41 }
42 }
43 }
44}
45
46# Export et rapport
47$InactiveChannels | Export-Csv -Path "InactiveChannels.csv" -NoTypeInformation -Encoding UTF8
48Write-Host "$($InactiveChannels.Count) canaux inactifs détectés" -ForegroundColor Yellow

Génération de rapports d'audit

Export vers Excel avec formatage

⚡PowerShell
1# Installation du module pour Excel
2Install-Module ImportExcel -Force
3
4# Création d'un classeur Excel avec mise en forme
5$ExcelParams = @{
6 Path = "TeamsInactiveChannelsReport.xlsx"
7 WorksheetName = "Canaux Inactifs"
8 AutoSize = $true
9 TableStyle = "Medium3"
10 FreezeTopRow = $true
11}
12
13$InactiveChannels | Select-Object TeamName, ChannelName, LastMessageDate, `
14 DaysInactive, LastMessageAuthor, TeamOwners | `
15 Export-Excel @ExcelParams
16
17Write-Host "Rapport généré : TeamsInactiveChannelsReport.xlsx"

Distribution par email du rapport

⚡PowerShell
1# Configuration de l'envoi de rapport
2$EmailParams = @{
3 To = "teams-admins@contoso.com"
4 From = "automation@contoso.com"
5 Subject = "Rapport d'activité Teams - Canaux inactifs $(Get-Date -Format 'yyyy-MM-dd')"
6 Body = @"
7Rapport d'analyse des canaux inactifs Microsoft Teams.
8
9Nombre de canaux inactifs (>180 jours) : $($InactiveChannels.Count)
10Date du rapport : $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')
11
12Voir pièce jointe pour la liste détaillée.
13"@
14 Attachments = @("TeamsInactiveChannelsReport.xlsx")
15 SmtpServer = "smtp.office365.com"
16 Port = 587
17 UseSsl = $true
18 Credential = (Get-Credential)
19}
20
21Send-MailMessage @EmailParams

Gestion des canaux inactifs détectés

Archivage sécurisé des canaux

L'archivage est l'approche recommandée car elle préserve l'historique et les conversations pour conformité et audit :

⚡PowerShell
1foreach ($InactiveChannel in $InactiveChannels) {
2 try {
3 # Archivage du canal via Microsoft Graph
4 Invoke-MgArchiveTeamChannel -TeamId $InactiveChannel.TeamId `
5 -ChannelId $InactiveChannel.ChannelId
6
7 Write-Host "✓ Archivé : $($InactiveChannel.ChannelName) dans $($InactiveChannel.TeamName)" `
8 -ForegroundColor Green
9 }
10 catch {
11 Write-Error "✗ Erreur archivage $($InactiveChannel.ChannelName) : $_"
12 }
13}

Suppression des canaux (approche destructrice)

La suppression est irréversible et ne doit être utilisée que pour des canaux de test ou temporaires :

⚡PowerShell
1# Suppression sélective avec confirmation
2$ChannelsToDelete = $InactiveChannels | Where-Object { $_.DaysInactive -gt 365 }
3
4foreach ($Channel in $ChannelsToDelete) {
5 $Confirmation = Read-Host "Supprimer le canal '$($Channel.ChannelName)' ? (O/N)"
6
7 if ($Confirmation -eq 'O') {
8 Remove-MgTeamChannel -TeamId $Channel.TeamId -ChannelId $Channel.ChannelId
9 Write-Host "✓ Supprimé : $($Channel.ChannelName)" -ForegroundColor Green
10 }
11}
×

Attention : Suppression irréversible

La cmdlet Remove-MgTeamChannel supprime définitivement le canal et toutes ses conversations. Aucune corbeille ou point de récupération n'existe pour Teams. Effectuez une sauvegarde du contenu via l'export avant suppression.

Automatisation récurrente avec Azure Automation

Configuration du runbook

Pour exécuter cette détection sur une base régulière (hebdomadaire ou mensuelle), implémentez un runbook Azure Automation :

1

Créer le compte Automation

Dans le portail Azure, créez un compte Azure Automation avec une identité gérée ayant les permissions Graph appropriées consentes via Entra ID.

2

Importer le module Graph

Dans le compte Automation, importez le module Microsoft.Graph.Teams via le catalogue de modules Azure.

3

Créer le runbook PowerShell

Créez un runbook type PowerShell Workflow ou Python 3.8+ contenant le script de détection. Configurez l'authentification avec l'identité gérée :

⚡PowerShell
1$connectionName = "AzureRunAsConnection"
2try {
3 $servicePrincipalConnection = Get-AutomationConnection -Name $connectionName
4
5 Connect-MgGraph -ClientId $servicePrincipalConnection.ApplicationId `
6 -TenantId $servicePrincipalConnection.TenantId `
7 -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint
8}
9catch {
10 throw "Impossible de se connecter à Azure Automation : $_"
11}
4

Configurer la planification

Créez une planification (Schedule) pour exécuter le runbook chaque lundi à 02:00 UTC et associez-la au runbook via une liaison d'horaire.

5

Configurer les notifications

Ajoutez une action Action Group Azure Monitor pour envoyer les rapports par email après chaque exécution, en utilisant les outputs du runbook.

Variables de configuration managées

⚡PowerShell
1# Définissez ces variables dans le compte Automation pour flexibilité
2$InactivityThreshold = Get-AutomationVariable -Name "TeamsInactivityDays"
3$ReportRecipient = Get-AutomationVariable -Name "ReportEmailAddress"
4$StorageAccountName = Get-AutomationVariable -Name "AuditStorageAccount"

Considérations sur l'indexation et Copilot

Impact sur la recherche et la IA générative

Les conversations dans les canaux inactifs continuent d'être indexées par les services de recherche de Microsoft 365. Lorsque Microsoft 365 Copilot génère des réponses basées sur le contexte organisationnel :

  • Les données obsolètes de canaux anciens peuvent être incluses dans les résultats
  • Les statuts d'équipe/projet datés introduisent de l'imprécision
  • Les conversations contextes au projet achevé créent du bruit

L'archivage régulier des canaux inactifs atténue cette contamination de données, assurant que Copilot s'appuie sur des informations pertinentes et actuelles.

i

Bon à savoir

L'archivage ne supprime pas l'indexation existante. Les conversations restent recherchables mais sont marquées comme archivées. Pour une isolation complète des données obsolètes de Copilot, la suppression demeure le seul recours, avec les risques associés.

Stratégie de gouvernance recommandée

Processus de validation avant action

  1. Exécution mensuelle du script de détection
  2. Révision manuelle du rapport par les propriétaires d'équipe (notification via email)
  3. Période de réclamation de 15 jours : les propriétaires peuvent demander le maintien de canaux
  4. Archivage automatisé des canaux non réclamés via le runbook
  5. Conservation de logs d'audit de toutes les actions pour conformité

Contrôles audit dans le journal activité Microsoft 365

⚡PowerShell
1# Recherche des archivages de canaux Teams dans les logs d'audit
2Search-UnifiedAuditLog -RecordType TeamsAdmin -Operations ArchiveTeamChannel `
3 -StartDate (Get-Date).AddDays(-30) -EndDate (Get-Date) |
4 Select-Object UserIds, CreationDate, ObjectId |
5 Export-Csv -Path "TeamsArchiveAudit.csv"

Résolution de problèmes courants

Erreur : "Insufficient privileges to complete the operation"

Vérifiez que :

  • L'application Entra ID a le consentement administrateur appliqué
  • Les permissions Graph sont consentes au niveau locataire (pas seulement utilisateur)
  • L'identité gérée d'Azure Automation a les rôles nécessaires

Performance : Script lent sur grands locataires

Pour optimiser sur 10 000+ équipes :

⚡PowerShell
1# Utiliser le pagination et parallélisation
2$Teams = Get-MgTeam -All -PageSize 999
3
4# Traitement parallèle avec runspace pools
5$RunspacePool = [runspacefactory]::CreateRunspacePool(1, 4)
6$RunspacePool.Open()

Les messages "system" ne sont pas correctement filtrés

Vérifiez le schéma exact du type de message :

⚡PowerShell
1# Diagnostic : examiner tous les types de message
2$Messages = Get-MgTeamChannelMessage -TeamId $TeamId -ChannelId $ChannelId -All
3$Messages | Group-Object -Property MessageType | Select-Object Name, Count

Conclusion et prochaines étapes

L'identification systématique des canaux inactifs dans Microsoft Teams est un élément essentiel de la gouvernance des données. En implémentant un processus automatisé via Microsoft Graph PowerShell SDK et Azure Automation, vous maintenez un environnement collaboratif propre et performant, tout en préservant l'intégrité des données pour conformité et Copilot.

Le script complet est disponible sur le GitHub Office365itpros pour téléchargement et réutilisation. Adaptez les seuils d'inactivité, les permissions et les workflows de notification selon vos politiques organisationnelles spécifiques.

Partager:
HM

Houssem MAKHLOUF

Microsoft 365 enthusiast & IT professional.

Article précédent

Identifier les utilisateurs inactifs Active Directory avec PowerShell

25 juin 2026
Article suivant

Ajouter des agendas et notes de réunion à Teams avec Loop

25 juin 2026

Articles similaires

Exécution de scripts PowerShell pour auditer des applications AI et gérer leurs enregistrements.copilot

Auditer et Gérer les Applications AI avec PowerShell

Auditez les applications AI non autorisées dans Entra ID avec PowerShell et Microsoft Graph pour renforcer contrôle et sécurité.

28 juin 20265 min
Graphiques abstraits et géométriques avec des couches de couleurs translucides.exchange

Convertir les IDs Exchange pour l'API Graph Microsoft 365

Convertissez les identifiants Exchange (storeId, entryId, RestId) pour l'API Graph et l'eDiscovery ciblée. Guide technique avec scripts PowerShell complets.

28 juin 20268 min
Arbre stylisé en doré sur fond noir avec des éléments circulaires.azure

Choisir le bon type d’extension dans Microsoft Entra

Découvrez les types d'extensions Microsoft Entra et choisissez la configuration optimale pour vos objets directory en tenant compte de leur usage.

27 juin 20265 min