Compartir vía


Quitar un chat externo de la vista de un usuario en Microsoft Teams (administrador)

Como administrador de inquilinos, puede usar la nueva Graph API RemoveAllAccessForUser para quitar un chat iniciado externamente desde la vista del usuario.

Es posible que los administradores de Microsoft Teams necesiten quitar chats de usuario creados por personas de fuera de su organización. Por ejemplo, uno de los usuarios podría haber recibido una solicitud de chat de alguien de fuera de su empresa. Ese chat podría contener contenido inapropiado o malintencionado y, como administrador, puede quitar ese chat para ayudar a proteger a su usuario.

Para usar la Graph API RemoveAllAccessForUser, debe proporcionar tres parámetros: tenantId, userId y chatsId/threadId. El id. de inquilino es el identificador único de su inquilino de Teams. El userId es el identificador único del usuario del que desea quitar el chat. El chatsId/threadId es el identificador único del hilo de chat de Teams del que desea quitar al usuario.

Puede obtener estos tres parámetros de los nuevos eventos del registro de auditoría unificado (UAL) que se generan cuando un usuario externo se comunica con un usuario de su inquilino. Los eventos UAL contienen información sobre el remitente, el destinatario, el hilo de chat y el mensaje. Puede usar los eventos UAL para identificar el subproceso de chat del que desea revocar el acceso y, a continuación, extraer el tenantId, el userId y el chatsId/threadId de los detalles del evento.

Pasos para usar la Graph API RemoveAllAccessForUser

  • Paso 1: Busque los eventos UAL que coincidan con los criterios. Si desea buscar todos los eventos en los que se agregó un usuario a un chat, puede usar el evento "MemberAdded" en la consulta de búsqueda.
  • Paso 2: Extraiga el id. de inquilino, el userId y el chatsId/threadId de los detalles del evento UAL
  • Paso 3: Llamar al Graph API RemoveAllAccessForUser con los parámetros deseados

Paso 1: Buscar los eventos UAL que coincidan con los criterios

Para buscar los eventos UAL que coincidan con los criterios, puede usar la API de graph Search-UnifiedAuditLog o puede usar la característica de búsqueda de registros de auditoría en la portal de cumplimiento Microsoft Purview. El resto de este documento asume que está usando la versión interactiva en la portal de cumplimiento Microsoft Purview. Siga estos pasos:

  1. Inicie sesión como https://compliance.microsoft.com administrador global o administrador de registros de auditoría.

  2. En el panel de navegación izquierdo, seleccione Auditoría.

  3. En la página Búsqueda de registros de auditoría, especifique los siguientes criterios:

    • En la página Auditoría, seleccione Buscar.
    • Actividades: Seleccione MemberAdded (y, opcionalmente, MessageReceived) en el campo Activities – operation names y elija MicrosoftTeams para la carga de trabajo.
    • Intervalo de fechas: seleccione un intervalo de fechas que cubra el período de tiempo en el que el usuario externo se comunicó con el usuario de su espacio empresarial. (opcional) Usuarios: introduzca el UPN del usuario en su inquilino que le interesa.
  4. Selecciona Buscar. Esto pone en cola una búsqueda para que se ejecute en segundo plano.

Una vez completado, revise los resultados de la búsqueda e identifique los eventos UAL que implican el chat y el usuario en el que está interesado (paso 3 a continuación).

Paso 2: Extraiga el id. de inquilino, el userId y el chatsId/threadId de los detalles del evento UAL

Para extraer el tenantId, el userId y el chatsId/threadId de los detalles del evento UAL, puede usar los campos OrganizationId, UserKey y ChatThreadId del evento. Si ha buscado el evento MemberAdded , es posible que vea eventos en los que los usuarios se agregaron a un chat externo y también en los que los usuarios agregaron un usuario externo a un chat. Querrá encontrar los eventos en los que el usuario de su inquilino se encuentra en la sección Detalles de miembros (esto indica que se trata del usuario que se agregó; consulte la figura 2 a continuación). Para ello, siga estos pasos:

  1. Seleccione uno de los eventos UAL que implican al usuario externo del que desea revocar el acceso.

  2. En el panel Detalles del evento:

    • Copie el valor del campo OrganizationId . Este es el inquilinoId de su inquilino de Teams.
    • Copie el valor del campo UserKey . Este es el userId del usuario del inquilino que se agregó al chat.
    • Copie el valor del campo ChatThreatId . Este es el chatId/threadId de la conversación de Teams a la que pertenece el mensaje.

Vea la siguiente captura de pantalla que muestra un ejemplo de un detalle de resultado de búsqueda de Purview:

Detalles de búsqueda de Microsoft Purview
Figura 1 (detalles del evento UAL MemberAdded)

Detalles de los miembros de Microsoft Purview
Figura 2 (detalle miembros del evento MemberAdded UAL)

Paso 3: Llamar al Graph API RemoveAllAccessForUser con los parámetros deseados

Para llamar a la Graph API RemoveAllAccessForUser con los parámetros, debe usar una solicitud HTTP POST a la API de graph:

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

Reemplaza {chatsId} por el Id. del chat sobre el que quieres actuar. El cuerpo de la solicitud debe contener un objeto de usuario JSON con las siguientes propiedades:

  • tenantId: el id. de inquilino de su inquilino de Teams.
  • Id.: el id. de usuario del usuario del espacio empresarial desde el que quiere mover el chat.

Por ejemplo, una solicitud podría tener el siguiente aspecto:

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 la solicitud, debe proporcionar un token de acceso válido en el encabezado Autorización. El token de acceso debe tener los permisos Chat.ReadWrite.All. Para obtener el token de acceso, puede usar el punto de conexión de Azure AD OAuth 2.0. Para obtener más información, vea Microsoft Graph: obtener acceso en nombre de un usuario.

Si la solicitud se realiza correctamente, la respuesta tiene un código de estado de "204 Sin contenido" y un cuerpo vacío. Si se produce un error en la solicitud, la respuesta tiene un código de error y un mensaje que explica el motivo del error.

Hay muchas maneras de llamar a un Graph API de Microsoft: si no estás familiarizado con cómo hacerlo, es posible que quieras empezar con una herramienta interactiva como El Explorador de Graph. Algunos administradores también crean una aplicación o usan PowerShell para interactuar con las API de Graph.

Código de ejemplo

El siguiente código de PowerShell se puede usar como punto de partida. Este código muestra cómo adquirir el token de usuario, crear una aplicación cliente que tenga los permisos necesarios y cómo usar esa aplicación cliente para llamar a la Graph API para quitar el mensaje.

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