Supprimer une conversation externe de l’affichage d’un utilisateur dans Microsoft Teams (administrateur)

En tant qu’administrateur client, vous pouvez utiliser la nouvelle API Graph RemoveAllAccessForUser pour supprimer une conversation lancée en externe de l’affichage de votre utilisateur.

Les administrateurs Microsoft Teams peuvent avoir besoin de supprimer les conversations utilisateur créées par des personnes en dehors de votre organization. Par exemple, un de vos utilisateurs peut avoir reçu une demande de conversation d’une personne extérieure à votre entreprise. Cette conversation peut contenir du contenu inapproprié ou malveillant et, en tant qu’administrateur, vous pouvez supprimer cette conversation pour protéger votre utilisateur.

Pour utiliser l’API Graph RemoveAllAccessForUser, vous devez fournir trois paramètres : tenantId, userId et chatsId/threadId. TenantId est l’identificateur unique de votre locataire Teams. UserId est l’identificateur unique de votre utilisateur pour lequel vous souhaitez supprimer la conversation. ChatsId/threadId est l’identificateur unique du fil de conversation Teams dont vous souhaitez supprimer votre utilisateur.

Vous pouvez obtenir ces trois paramètres à partir des nouveaux événements du journal d’audit unifié (UAL) générés lorsqu’un utilisateur externe communique avec un utilisateur de votre locataire. Les événements UAL contiennent des informations sur l’expéditeur, le destinataire, le fil de conversation et le message. Vous pouvez utiliser les événements UAL pour identifier le thread de conversation à partir duquel vous souhaitez révoquer l’accès, puis extraire le tenantId, l’userId et le chatsId/threadId des détails de l’événement.

Procédure d’utilisation de l’API Graph RemoveAllAccessForUser

  • Étape 1 : recherchez les événements UAL qui correspondent à vos critères. Si vous souhaitez rechercher tous les événements où un utilisateur a été ajouté à une conversation, vous pouvez utiliser l’événement « MemberAdded » dans votre requête de recherche.
  • Étape 2 : Extraire le tenantId, l’userId et le chatId/threadId à partir des détails de l’événement UAL
  • Étape 3 : Appeler le API Graph RemoveAllAccessForUser avec les paramètres souhaités

Étape 1 : Rechercher les événements UAL qui correspondent à vos critères

Pour rechercher les événements UAL qui correspondent à vos critères, vous pouvez utiliser l’API de graphe Search-UnifiedAuditLog, ou vous pouvez utiliser la fonctionnalité de recherche dans les journaux d’audit dans le portail de conformité Microsoft Purview. Le reste de ce document suppose que vous utilisez la version interactive dans le portail de conformité Microsoft Purview. Procédez comme suit :

  1. Connectez-vous à https://compliance.microsoft.com en tant qu’administrateur général ou administrateur de journaux d’audit.

  2. Dans le volet de navigation de gauche, sélectionnez Auditer.

  3. Dans la page Recherche dans le journal d’audit, spécifiez les critères suivants :

    • Dans la page Audit, sélectionnez Rechercher.
    • Activités : sélectionnez MemberAdded (et éventuellement MessageReceived) dans le champ Activités – noms des opérations et choisissez MicrosoftTeams pour la charge de travail.
    • Plage de dates : sélectionnez une plage de dates qui couvre la période pendant laquelle l’utilisateur externe a communiqué avec l’utilisateur de votre locataire. (facultatif) Utilisateurs : entrez l’UPN de l’utilisateur de votre locataire qui vous intéresse.
  4. Sélectionner Rechercher. Cette opération met en file d’attente une recherche à exécuter en arrière-plan.

Une fois terminé, passez en revue les résultats de la recherche et identifiez les événements UAL qui impliquent la conversation et l’utilisateur qui vous intéressent (étape 3 ci-dessous).

Étape 2 : Extraire le tenantId, l’userId et le chatId/threadId à partir des détails de l’événement UAL

Pour extraire le tenantId, l’userId et le chatId/threadId des détails de l’événement UAL, vous pouvez utiliser les champs OrganizationId, UserKey et ChatThreadId de l’événement. Si vous avez recherché l’événement MemberAdded , vous pouvez voir des événements où vos utilisateurs ont été ajoutés à une conversation externe et également où vos utilisateurs ont ajouté un utilisateur externe à une conversation. Vous souhaiterez trouver les événements où se trouve votre utilisateur dans votre locataire dans la section Détails membres (cela indique qu’il s’agit de l’utilisateur qui a été ajouté ( voir la figure 2 ci-dessous). Pour cela, merci de procéder comme suit :

  1. Sélectionnez l’un des événements UAL qui impliquent l’utilisateur externe dont vous souhaitez révoquer l’accès.

  2. Dans le volet Détails de l’événement :

    • Copiez la valeur du champ OrganizationId . Il s’agit du tenantId de votre locataire Teams.
    • Copiez la valeur du champ UserKey . Il s’agit de l’id utilisateur de l’utilisateur de votre locataire qui a été ajouté à la conversation.
    • Copiez la valeur du champ ChatThreatId . Il s’agit du chatId/threadId du fil de conversation Teams auquel appartient le message.

Consultez la capture d’écran suivante montrant un exemple de détail de résultat de recherche Purview :

Détails de la recherche Microsoft Purview
Figure 1 (détails de l’événement UAL MemberAdded)

Détails du membre Microsoft Purview
Figure 2 (Détails des membres de l’événement UAL MemberAdded)

Étape 3 : Appeler le API Graph RemoveAllAccessForUser avec les paramètres souhaités

Pour appeler l’API Graph RemoveAllAccessForUser avec les paramètres, vous devez utiliser une requête HTTP POST à l’API graph :

POST https://graph.microsoft.com/beta/chats/{chatsId}/removeAllAccessForUser 

Remplacez {chatsId} par l’ID de la conversation sur laquelle vous souhaitez agir. Le corps de la demande doit contenir un objet utilisateur JSON avec les propriétés suivantes :

  • tenantId : tenantID de votre locataire Teams.
  • ID : id utilisateur de l’utilisateur de votre locataire à partir duquel vous souhaitez déplacer la conversation.

Par exemple, une requête peut ressembler à ceci :

POST https://graph.microsoft.com/beta/chats/19:7d8980.........f94061cf8c2@unq.gbl.spaces/removeAllAccessForUser 
Content-Type: application/json 

{ 
  "user": { 
    "id" : "d864e79f-……..-0eeb4d61fdc2", 
    "tenantId": "2a690434-………-13600199a" 
  } 
} 

Pour authentifier la demande, vous devez fournir un jeton d’accès valide dans l’en-tête Authorization. Le jeton d’accès doit avoir les autorisations Chat.ReadWrite.All. Pour obtenir le jeton d’accès, vous pouvez utiliser le point de terminaison OAuth 2.0 Azure AD. Pour plus d’informations, consultez Microsoft Graph - Obtenir l’accès au nom d’un utilisateur.

Si la demande réussit, la réponse a un code status « 204 Aucun contenu » et un corps vide. Si la demande échoue, la réponse contient un code d’erreur et un message qui explique la raison de l’échec.

Il existe de nombreuses façons d’appeler un API Graph Microsoft : si vous n’êtes pas familiarisé avec la procédure à suivre, vous pouvez commencer par un outil interactif tel que Graph Explorer. Certains administrateurs créent une application ou utilisent PowerShell pour interagir avec les API Graph.

Exemple de code

Le code PowerShell suivant peut être utilisé comme point de départ. Ce code montre comment acquérir le jeton utilisateur, créer une application cliente disposant des autorisations nécessaires et comment utiliser cette application cliente pour appeler le API Graph pour supprimer le message.

param(
    # Tenant id for the user whom the chat access is going to be removed
    [Parameter(Mandatory=$true)]
    [String]
    $TenantId,
 
    # User id for the user whom the chat access is going to be removed
    [Parameter(Mandatory=$true)]
    [String]
    $UserId,
 
    # Id of the chat that from which access will be removed
    [Parameter(Mandatory=$true)]
    [String]
    $ThreadId
)
 
 
# These may not all be necessary in your environment
# Install Microsoft.Graph.Authentication module for all users (requires admin rights)
if (Get-Module -ListAvailable -Name Microsoft.Graph.Authentication) {
    Write-Host "Microsoft.Graph.Authentication module found." -ForegroundColor "Green"
} 
else {
    Write-Host "Microsoft.Graph.Authentication module not found. Installing"
    Install-Module Microsoft.Graph.Authentication -Scope AllUsers -Force 
}
 
# Install Microsoft.Graph.Applications module for all users (requires admin rights)
if (Get-Module -ListAvailable -Name Microsoft.Graph.Applications) {
    Write-Host "Microsoft.Graph.Applications module found." -ForegroundColor "Green"
} 
else {
    Write-Host "Microsoft.Graph.Application module not found. Installing"
    Install-Module Microsoft.Graph.Applications -Scope AllUsers -Force 
}
 
# Install MSAL.PS module for all users (requires admin rights)
if (Get-Module -ListAvailable -Name MSAL.PS) {
    Write-Host "MSAL module found."  -ForegroundColor "Green"
} 
else {
    Write-Host "MSAL module not found. Installing"
    Install-Module MSAL.PS -Scope AllUsers -Force 
}
 
 
# Connect to graph and verify that a client application exists for this purpose - if not, create one
Connect-MgGraph -Scopes "Application.ReadWrite.All", "DelegatedPermissionGrant.ReadWrite.All"
 
# Get client app info
$App = Get-MgApplication -Filter "DisplayName eq 'RemoveAllAccessForUserApp'"
$createAppParams = @{
    publicClient = @{
		redirectUris = "https://login.microsoftonline.com/common/oauth2/nativeclient"
	}
}
 
# If client app is not found. Create it
if ($null -eq $App)
{
    Write-Host "Client app not found. Creating new one." -ForegroundColor "Yellow"
    $App = New-MgApplication -DisplayName 'RemoveAllAccessForUserApp' @createAppParams
    Write-Host "Client app created. Waiting for 5 seconds before continuing." -ForegroundColor "Yellow"
    Start-Sleep -Seconds 5
}
else 
{
    $AppId = $App.AppId
    Write-Host "Client app with id '$AppId' found'" -ForegroundColor "Green"
}

$ClientId = $App.AppId
 
# Now that we have the ID for our client application, we can call the RemoveAccessForUser API...
# Msal parameters required to get access token.
$MsalParams = @{
    ClientId = $ClientId
    TenantId = $TenantId
    Scopes   = 'Chat.ReadWrite.All'
}
 
 
# Get access token, it will prompt for interactive login   
$MsalResponse = Get-MsalToken @MsalParams
$AccessToken  = $MsalResponse.AccessToken
 
 
# Request authorization header containing the access token
$AuthHeader = @{
    Authorization = "Bearer $AccessToken"
}
 
# Request url
$apiUrl = "https://graph.microsoft.com/beta/chats/$ThreadId/removeAllAccessForUser"
 
# Prepare request body
$Body = @{
	user = @{
		id = "$UserId"
		tenantId = "$TenantId"
	}
}
 
$Body = $Body | ConvertTo-Json
 
# Execute request
Write-Host "Executing RemoveAllAccessForUser request."
 
try {
    Invoke-RestMethod  -Headers $AuthHeader -Uri $apiUrl -Method POST -ContentType 'application/json' -Body $Body 
    Write-Host "Rquest to RemoveAllAccessForUser api succeeded." -ForegroundColor "Green"
} catch {
    Write-Host "Request to RemoveAllAccessForUser api failed." -ForegroundColor "Red"
    Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__ 
    Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription
    $receiveStream = $_.Exception.Response.GetResponseStream();
    Write-Host ([System.Text.Encoding]::ASCII).GetString($receiveStream.ToArray())
}
 
Write-Host "Disconnecting from Microsoft Graph!"
Disconnect-MgGraph