Teams + Outlook : supprimer automatiquement les invités du chat de réunion (Power Automate & Microsoft Graph)

Vous retirez des invités d’une réunion Outlook mais ils continuent à voir le chat Teams ? Voici des méthodes concrètes : procédure manuelle, automatisation avec Power Automate/Logic Apps, script PowerShell/Graph et recommandations de gouvernance pour éviter toute fuite d’information.

Sommaire

Contexte et enjeu

Dans Microsoft Teams, chaque réunion crée (ou rattache) un chat de réunion. Lorsque vous retirez un invité d’une série de réunions via Outlook, il cesse bien de recevoir les nouvelles invitations, mais il reste membre du chat associé et continue donc à voir les messages qui y sont postés. Cela pose un risque d’exposition d’informations à des personnes qui ne devraient plus y avoir accès (prestataires en fin de mission, partenaires sortants, etc.).

Objectif : synchroniser automatiquement la suppression d’un invité dans Outlook et son retrait du chat Teams correspondant, sans devoir parcourir manuellement chaque chat et chaque participant.

État de l’art (à la date de rédaction)

Pas de liaison native Outlook ⇄ Chat Teams

  • Aucune fonction native ne synchronise la liste des invités d’une invitation Outlook avec les membres du chat de la réunion.
  • Méthode supportée aujourd’hui : retirer manuellement l’invité du chat (survoler le nom → « … » → Supprimer du chat).
  • Une suggestion officielle a été déposée sur le portail Feedback : Automatic Removal of Guest Users from Microsoft Teams.

Procédure manuelle (rapide)

  1. Ouvrez le chat de la réunion dans Teams.
  2. Affichez la liste des participants (panneau « Participants » ou entête du chat).
  3. Survolez la personne à retirer, cliquez sur puis Supprimer du chat.

Avantage : immédiat, simple. Inconvénient : fastidieux et propice à l’erreur dès qu’il y a volume, récurrences et mouvements d’invités.

Stratégies d’évitement utiles

  • Désactiver le chat dans les options de la réunion (par l’organisateur) quand cela est acceptable : plus de messages après la réunion, donc pas d’accès résiduel pour les anciens invités.
  • Privilégier des réunions non récurrentes lorsque la liste d’invités change souvent, pour éviter la dérive entre « série » et « chat ».
  • Désigner un co‑organisateur explicitement chargé de « nettoyer » le chat après chaque session.

Comparatif des approches

ApprochePrincipeIntérêtLimites
Désactiver le chat de réunionOption de réunion Outlook/Teams : Désactiver le chat ou Chat uniquement pendant la réunion.Empêche tout message après la réunion ; supprime le problème à la source.Plus de fil de discussion pour ceux qui doivent rester ; perd l’utilité du chat.
Power Automate / Logic AppsDéclencher sur modification d’événement, comparer participants, appeler l’API Graph Remove Chat Member.Semi‑automatisation, maintenance faible, exploitable par les équipes M365.Licences premium possibles ; mise en place d’une identité applicative et des autorisations Graph.
PowerShell + Microsoft GraphScript planifié : lister réunions, comparer invités Outlook vs. membres du chat, supprimer les écarts.Contrôle fin, scénarios batch, audit/trace par logs.Nécessite des compétences PowerShell/Graph et un enregistrement d’application (Microsoft Entra).
Cycle de vie des invités (Azure AD/Entra)Règles pour désactiver/supprimer automatiquement les comptes invités inactifs.Réduit les comptes obsolètes dans l’annuaire.N’enlève pas instantanément un invité d’un chat actif.

Automatiser avec Power Automate ou Logic Apps

Le principe : capter les changements d’une réunion Outlook (ajout/suppression d’invités), retrouver le chat Teams de cette réunion, puis retirer du chat les invités qui ne sont plus dans l’invitation.

Architecture logique

[Outlook - Événement modifié (V3)]
            │
            ▼
 [Récupérer les invités actuels de la réunion]
            │
            ▼
 [Lire l’état précédent des invités (cache)] ──► [Comparer] ──► [Δ Invités supprimés]
            │                                            │
            └──────────────────────────────(mettre à jour cache)   ▼
                                                              [Résoudre l’ID du chat de réunion]
                                                              │
                                                              ▼
                                                     [Lister les membres du chat]
                                                              │
                                                              ▼
                                                     [Supprimer les membres présents dans Δ]

Étapes détaillées (exemple Power Automate)

  1. Déclencheur : Lorsque l’événement est ajouté, mis à jour ou supprimé (V3) sur la boîte calendrier de l’organisateur (ou une boîte partagée).
  2. Normaliser les invités : utilisez Select pour extraire chaque item()?['emailAddress']['address'] et toLower() pour uniformiser.
  3. Conserver l’état : stockez, par clé de série (ex. iCalUId ou seriesMasterId), la liste des adresses des invités dans un stockage simple (SharePoint, Dataverse, table Azure, etc.).
  4. Calcul du delta : « Invités supprimés » = Invités_ancienInvités_actuel. Avec « Filtrer un tableau », gardez les adresses présentes dans l’ancien mais absentes du nouveau.
  5. Résoudre le chat de la réunion : à partir de joinUrl (champ de l’événement), appelez Microsoft Graph pour récupérer l’onlineMeeting correspondant, puis son chatInfo.threadId (qui sert d’ID de chat au format 19:...@thread.v2).
  6. Lister les membres du chat : Graph GET /chats/{chatId}/members retourne des objets conversationMember (avec id, displayName, userId…).
  7. Supprimer : pour chaque invité supprimé, trouvez le member.id correspondant (matchez via userId ou l’adresse UPN) puis appelez DELETE /chats/{chatId}/members/{memberId}.
  8. Mettre à jour le cache avec la nouvelle liste d’invités.

Actions HTTP Graph (exemples)

Dans Power Automate/Logic Apps, utilisez l’action HTTP (avec une identité applicative Microsoft Entra correctement autorisée). Exemples :

# 1) Résoudre l’onlineMeeting à partir de la JoinWebUrl
GET https://graph.microsoft.com/v1.0/users/{organizerUPN}/onlineMeetings?$filter=JoinWebUrl eq '{JOIN_URL_ENCODEE}'

# Réponse (extrait)

{
"value":[
{
"id":"{meetingId}",
"chatInfo": { "threadId": "19:meeting_xxx@thread.v2" },
"subject":"Sprint Review"
}
]
}

# 2) Lister les membres du chat de réunion

GET [https://graph.microsoft.com/v1.0/chats/19:meeting_xxx@thread.v2/members](https://graph.microsoft.com/v1.0/chats/19:meeting_xxx@thread.v2/members)

# 3) Supprimer un membre (utiliser member.id récupéré à l'étape 2)

DELETE [https://graph.microsoft.com/v1.0/chats/19:meeting_xxx@thread.v2/members/{memberId}](https://graph.microsoft.com/v1.0/chats/19:meeting_xxx@thread.v2/members/{memberId}) 

Autorisations et sécurité

  • Type d’app : application (client credentials) recommandée pour les traitements serveur.
  • Scopes/permissions Graph (selon le mode) :
    • OnlineMeetings.Read.All (lire les réunions en ligne pour résoudre le chatInfo),
    • Chat.ReadWrite (gérer les membres du chat),
    • Calendars.Read (lire les invités de l’événement),
    • User.Read.All ou Directory.Read.All (résolutions d’identités si nécessaire).
  • Gouvernance : restreignez l’étendue (consentement admin), journalisez les suppressions (Run History, Log Analytics), protégez les secrets (Key Vault).

Pièges fréquents et parades

  • Événements récurrents : utilisez un identifiant stable (ex. iCalUId) comme clé de cache, pas l’ID de l’occurrence seule.
  • Correspondance membre ↔ e‑mail : selon les locataires, le member peut ne pas exposer l’e‑mail directement ; privilégiez userId (GUID Entra) dérivé de l’adresse via GET /users/{mail} si besoin.
  • Timing : si le flux déclenche avant que le chat soit créé (réunions à venir), prévoyez une politique de retry (ex. attente exponentielle puis re‑tentatives).
  • Throttling (HTTP 429) : implémentez des pauses (Retry-After) et regroupez les appels par lots si possible.

Automatiser avec PowerShell + Microsoft Graph

Pour des traitements en lot (plusieurs séries, migration, nettoyage hebdomadaire), un script PowerShell offre un excellent levier de contrôle et de traçabilité.

Pré‑requis

  • Module Microsoft.Graph récent.
  • Application Entra avec les permissions applicatives adéquates et consentement admin.
  • Un fichier CSV ou une source (Graph/Outlook) pour obtenir la liste d’invités « de référence » par réunion/série.

Script d’exemple (simplifié)

# Paramètres
param(
  [Parameter(Mandatory=$true)] [string]$OrganizerUpn,
  [Parameter(Mandatory=$true)] [string]$JoinUrl,
  [Parameter(Mandatory=$true)] [string]$ReferenceAttendeesCsv, # CSV avec une colonne 'Email' : les invités ACTUELS attendus
  [switch]$WhatIf
)

# Connexion (delegated pour la démonstration ; en prod, privilégier client credentials)

Connect-MgGraph -Scopes "Chat.ReadWrite","OnlineMeetings.Read.All","Calendars.Read","User.Read.All" | Out-Null
Select-MgProfile -Name "v1.0"

# 1. Résoudre le chat de la réunion via la JoinUrl

$encodedJoinUrl = $JoinUrl.Replace("'","''")
$uriMeetings = "[https://graph.microsoft.com/v1.0/users/$OrganizerUpn/onlineMeetings?`$filter=JoinWebUrl](https://graph.microsoft.com/v1.0/users/$OrganizerUpn/onlineMeetings?`$filter=JoinWebUrl) eq '$encodedJoinUrl'"
$online = Invoke-MgGraphRequest -Method GET -Uri $uriMeetings
if(-not $online.value){ throw "Réunion introuvable via JoinWebUrl." }
$chatId = $online.value[0].chatInfo.threadId

# 2. Lister les membres actuels du chat

$members = @()
$uriMembers = "[https://graph.microsoft.com/v1.0/chats/$([uri]::EscapeDataString($chatId))/members](https://graph.microsoft.com/v1.0/chats/$%28[uri]::EscapeDataString%28$chatId%29%29/members)"
do {
$page = Invoke-MgGraphRequest -Method GET -Uri $uriMembers
$members += $page.value
$uriMembers = $page.'@odata.nextLink'
} while ($uriMembers)

# 3. Charger la liste de référence des invités (ceux qui DOIVENT rester)

$ref = Import-Csv -Path $ReferenceAttendeesCsv | ForEach-Object { $*.Email.Trim().ToLower() } | Where-Object { $* }

# 4. Construire une table email ↔ memberId (résolution user si nécessaire)

function Resolve-EmailForMember {
param($m)
if($m.email){ return $m.email.ToLower() }
if($m.userId){
try {
$u = Invoke-MgGraphRequest -Method GET -Uri "[https://graph.microsoft.com/v1.0/users/$($m.userId)?`$select=mail,userPrincipalName](https://graph.microsoft.com/v1.0/users/$%28$m.userId%29?`$select=mail,userPrincipalName)"
return ($u.mail ?? $u.userPrincipalName).ToLower()
} catch { return $null }
}
return $null
}

$map = @{}
foreach($m in $members){
$mail = Resolve-EmailForMember $m
if($mail){ $map[$mail] = $m.id }
}

# 5. Déterminer les membres à retirer = présents dans le chat mais absents de la liste de référence

$currentEmails = $map.Keys
$toRemove = $currentEmails | Where-Object { $ref -notcontains $_ }

Write-Host "ChatId: $chatId"
Write-Host "Membres actuels: $($currentEmails.Count) | Autorisés: $($ref.Count) | À retirer: $($toRemove.Count)"

# 6. Supprimer

foreach($email in $toRemove){
$memberId = $map[$email]
if(-not $memberId){ continue }
$uriDel = "[https://graph.microsoft.com/v1.0/chats/$([uri]::EscapeDataString($chatId))/members/$memberId](https://graph.microsoft.com/v1.0/chats/$%28[uri]::EscapeDataString%28$chatId%29%29/members/$memberId)"
if($WhatIf){ Write-Host "[WhatIf] DELETE $uriDel" -ForegroundColor Yellow }
else{
try{
Invoke-MgGraphRequest -Method DELETE -Uri $uriDel
Write-Host "Supprimé: $email ($memberId)"
} catch {
Write-Warning "Échec suppression $email : $($_.Exception.Message)"
}
}
} 

Variantes : remplacez l’entrée CSV par un appel Graph qui lit directement les invités de l’événement (via /users/{organizer}/events/{id}) ; ou orchestrez l’ensemble via une Runbook Automation/Logic Apps pour planifier le nettoyage quotidien.

Cycle de vie des invités (Azure AD / Microsoft Entra)

Les politiques de cycle de vie des invités (External Identities) permettent de désactiver/supprimer automatiquement les comptes B2B inactifs. Cela assainit l’annuaire et limite l’accès global, mais ne garantit pas la retraite instantanée d’un invité d’un chat de réunion précis. Utilisez‑les en complément pour la conformité et l’hygiène des accès.

Recommandations pratiques

  1. Cas ponctuels ou urgents : appliquez la procédure manuelle de suppression du chat.
  2. Volume important : mettez en place un flux Power Automate ou un script PowerShell/Graph, puis pilotez‑le sur un périmètre pilote avant généralisation.
  3. Gouvernance : tenez un registre des séries à risque (projets sensibles, prestataires) et imposez un « propriétaire de réunion » chargé du nettoyage.
  4. Suivi de la suggestion produit : votez et partagez la demande Automatic Removal of Guest Users from Microsoft Teams pour accroître sa priorité.
  5. Conception des réunions : si la liste d’invités évolue souvent, préférez des réunions éphémères (non récurrentes) ou désactivez le chat post‑réunion.

Bonnes pratiques de mise en œuvre

  • Journalisation/Audit : conservez un log des suppressions (adresse, chatId, horodatage, déclencheur) pour répondre aux audits internes.
  • Traçabilité utilisateur : publiez un message automatique dans le chat après nettoyage (par exemple : « Nettoyage des membres : invités sortants retirés »).
  • Gestion des erreurs : prévoyez une file « quarantaine » (liste ou table) pour les cas en échec à retraiter manuellement.
  • Protection des secrets : stockez ID client/secret en coffre (Key Vault) et appliquez des identités managées quand c’est possible.
  • Performances : regroupez par séries et appliquez un délai entre les suppressions pour respecter les quotas Graph.

FAQ rapide

Retirer un membre du chat supprime‑t‑il son historique ? La personne retirée n’a plus accès au chat ni aux nouveaux messages. Selon le cache du client, un aperçu local peut subsister temporairement, mais l’accès serveur est coupé. Que se passe‑t‑il si je ré‑invite plus tard la même personne ? Elle sera à nouveau ajoutée. L’accès à l’historique dépend des paramètres et du type de conversation ; considérez qu’elle verra au minimum les nouveaux messages à partir de sa ré‑admission. Peut‑on empêcher la création du chat de réunion ? Le chat est intrinsèquement lié aux réunions Teams. Vous pouvez toutefois désactiver le chat (avant/pendant/après) via les options de la réunion ou les stratégies Teams. Et pour les canaux Teams (posts d’équipe) ? Le modèle diffère (membres d’équipe/canal). Ici, on parle du chat de réunion (conversation de type meeting), pas des posts de canal. Que faire si l’invité n’a pas de compte B2B (accès externe anonyme) ? Le retrait du chat s’applique à tout participant identifié. Pour des invités anonymes ponctuels, désactivez le chat post‑réunion et limitez le partage de fichiers.

Modèle de communication interne

À envoyer aux organisateurs de réunions récurrentes :

Rappel sécurité – Chats de réunions Teams
Quand vous retirez un invité d’une série Outlook, pensez à le retirer aussi du chat de la réunion (Teams > chat de la réunion > participants > « … » > Supprimer du chat). Une automatisation est en cours de déploiement ; d’ici là, merci d’appliquer ce geste pour éviter la diffusion d’informations à des tiers.

Annexes – Requêtes Graph utiles (référence)

# Trouver l’onlineMeeting via l’URL de jonction
GET /v1.0/users/{organizerUPN}/onlineMeetings?$filter=JoinWebUrl eq '{JOIN_URL}'

# Récupérer l'ID de chat de la réunion

# Réponse → chatInfo.threadId = "19:meeting_xxx@thread.v2"

# Lister les membres

GET /v1.0/chats/{chatId}/members

# Retirer un membre (utiliser l’ID de l’objet conversationMember)

DELETE /v1.0/chats/{chatId}/members/{memberId}

# (Facultatif) Résoudre un GUID utilisateur à partir d’un mail

GET /v1.0/users/{userPrincipalName}?$select=id,mail,userPrincipalName 

Conclusion

En l’absence de synchronisation native entre Outlook et le chat de réunion Teams, deux voies se démarquent : procédure manuelle pour l’urgent et le ponctuel, et automatisation (Power Automate/Logic Apps ou PowerShell/Graph) pour le volume et la maîtrise des risques. Combinez‑les avec une gouvernance claire (rôles, journalisation, communication) et, si nécessaire, des politiques de cycle de vie des invités dans Microsoft Entra afin de réduire l’exposition. Votez pour la fonctionnalité demandée et, d’ici là, outillez‑vous : vous éviterez que d’anciens invités continuent à voir le contenu des conversations Teams.

Checklist de déploiement

  • Identité applicative Entra créée (secret/certificat), permissions consenties.
  • Stockage d’état (cache des invités) en place : schéma, rétention, sauvegarde.
  • Flux/scrips testés sur un échantillon de séries (environnement pilote).
  • Journalisation raccordée (Centre d’administration, Log Analytics, SIEM).
  • Communication utilisateur validée (FAQ, pas‑à‑pas, support L1/L2).
  • Plan de reprise (quarantaine, roll‑back, supervision des erreurs).
Sommaire