Remover um chat externo da exibição de um usuário no Microsoft Teams (administrador)

Como administrador de locatário, você pode usar o novo API do Graph RemoveAllAccessForUser para remover um chat iniciado externamente da exibição do usuário.

Os administradores do Microsoft Teams podem precisar remover chats de usuário criados por pessoas fora da sua organização. Por exemplo, um de seus usuários pode ter recebido uma solicitação de chat de alguém fora da sua empresa. Esse chat pode conter conteúdo inadequado ou mal-intencionado e, como administrador, você pode remover esse chat para ajudar a proteger seu usuário.

Para usar o API do Graph RemoveAllAccessForUser, você precisa fornecer três parâmetros: tenantId, userId e chatsId/threadId. O tenantId é o identificador exclusivo do locatário do Teams. O userId é o identificador exclusivo do seu usuário para o qual você deseja remover o chat. O chatsId/threadId é o identificador exclusivo do thread de chat do Teams do qual você deseja remover o usuário.

Você pode obter esses três parâmetros dos novos eventos do UAL (Unified Audit Log) gerados quando um usuário externo se comunica com um usuário em seu locatário. Os eventos UAL contêm informações sobre o remetente, o destinatário, o thread de chat e a mensagem. Você pode usar os eventos UAL para identificar o thread de chat do qual deseja revogar o acesso e extrair o tenantId, o userId e o chatsId/threadId dos detalhes do evento.

Etapas para usar o API do Graph RemoveAllAccessForUser

  • Etapa 1: pesquise os eventos UAL que correspondam aos seus critérios. Se você quiser encontrar todos os eventos em que um usuário foi adicionado a um chat, poderá usar o evento "Membro Adicionado" na consulta de pesquisa.
  • Etapa 2: extrair o tenantId, o userId e o chatsId/threadId dos detalhes do evento UAL
  • Etapa 3: chamar o API do Graph RemoveAllAccessForUser com os parâmetros desejados

Etapa 1: pesquisar os eventos UAL que correspondem aos seus critérios

Para pesquisar os eventos UAL que correspondem aos seus critérios, você pode usar a API do grafo Search-UnifiedAuditLog ou usar o recurso de pesquisa de log de auditoria no portal de conformidade do Microsoft Purview. O restante deste documento pressupõe que você esteja usando a versão interativa no portal de conformidade do Microsoft Purview. Use as seguintes etapas:

  1. https://compliance.microsoft.com Entre como administrador global ou administrador de log de auditoria.

  2. Na navegação à esquerda, selecione Auditoria.

  3. Na página De pesquisa de log de auditoria, especifique os seguintes critérios:

    • Na página Auditoria, selecione Pesquisar.
    • Atividades: selecione Membro Adicionado (e opcionalmente MessageReceived) no campo Atividades – nomes de operação e escolha MicrosoftTeams para a Carga de Trabalho.
    • Intervalo de datas: selecione um intervalo de datas que abrange o período em que o usuário externo se comunicava com o usuário em seu locatário. (opcional) Usuários: insira o UPN do usuário em seu locatário no qual você está interessado.
  4. Selecione Pesquisar. Isso enfileira uma pesquisa para ser executada em segundo plano.

Depois de concluir, examine os resultados da pesquisa e identifique os eventos UAL que envolvem o chat e o usuário em que você está interessado (Etapa 3 abaixo).

Etapa 2: extrair o tenantId, o userId e o chatsId/threadId dos detalhes do evento UAL

Para extrair o tenantId, o userId e os chatsId/threadId dos detalhes do evento UAL, você pode usar os campos OrganizationId, UserKey e ChatThreadId do evento. Se você pesquisou o evento MemberAdded , poderá ver eventos em que seus usuários foram adicionados a um chat externo e também onde seus usuários adicionaram um usuário externo a um chat. Você vai querer encontrar os eventos em que seu usuário em seu locatário está na seção detalhes membros (isso indica que este é o usuário que foi adicionado — confira a figura 2 abaixo). Para fazer isso, execute estas etapas:

  1. Selecione um dos eventos UAL que envolvem o usuário externo do qual você deseja revogar o acesso.

  2. No painel Detalhes do evento:

    • Copie o valor do campo OrganizationId . Este é o locatárioId de seu locatário do Teams.
    • Copie o valor do campo UserKey . Este é o userId do usuário em seu locatário que foi adicionado ao chat.
    • Copie o valor do campo ChatThreatId . Este é o chatsId/threadId do thread de chat do Teams ao qual a mensagem pertence.

Confira a captura de tela a seguir mostrando um exemplo de um detalhe do resultado da pesquisa do Purview:

Detalhes da pesquisa do Microsoft Purview
Figura 1 (detalhes do evento UAL MemberAdded)

Detalhes do membro do Microsoft Purview
Figura 2 (detalhes dos membros do evento UAL adicionado por membro)

Etapa 3: chamar o API do Graph RemoveAllAccessForUser com os parâmetros desejados

Para chamar o API do Graph RemoveAllAccessForUser com os parâmetros, você precisa usar uma solicitação HTTP POST para a API do grafo:

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

Substitua {chatsId} pela Id do chat em que você deseja atuar. O corpo da solicitação deve conter um objeto de usuário JSON com as seguintes propriedades:

  • tenantId: o tenantID do locatário do Teams.
  • Id: o userID do usuário em seu locatário do qual você deseja mover o chat.

Por exemplo, uma solicitação pode ser semelhante a esta:

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" 
  } 
} 

Para autenticar a solicitação, você precisa fornecer um token de acesso válido no cabeçalho autorização. O token de acesso deve ter as permissões Chat.ReadWrite.All. Para obter o token de acesso, você pode usar o ponto de extremidade Azure AD OAuth 2.0. Para obter mais informações, consulte Microsoft Graph – Obter acesso em nome de um usuário.

Se a solicitação for bem-sucedida, a resposta terá um código status de "204 Sem Conteúdo" e um corpo vazio. Se a solicitação falhar, a resposta terá um código de erro e uma mensagem que explica o motivo da falha.

Há muitas maneiras de chamar um microsoft API do Graph – se você não estiver familiarizado com como fazer isso, talvez queira começar com uma ferramenta interativa, como o Graph Explorer. Alguns administradores criam um aplicativo ou usam o PowerShell para interagir com APIs do Graph também.

Código de exemplo

O código do PowerShell a seguir pode ser usado como ponto de partida. Este código mostra como adquirir o token user, criar um aplicativo cliente que tenha as permissões necessárias e como usar esse aplicativo cliente para chamar o API do Graph para remover a mensagem.

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