Cómo exportar el historial de chat de MS Teams con PowerShell

Cómo acceder y exportar el historial de chat de Microsoft Teams con PowerShell

A veces, acceder al historial de chat de Teams no es tan sencillo. Esto es especialmente cierto si quieres automatizar el proceso o simplemente no encuentras nada útil en Outlook o las herramientas de exportación habituales. El problema es que los chats de Teams se almacenan en una carpeta oculta dentro de un buzón compartido asociado al grupo, llamada Historial de conversaciones\Chat de Teams. Acceder a ella no es complicado si conoces los pasos correctos, pero tampoco es tan sencillo como hacer clic en un botón. Usar PowerShell con la API de Microsoft Graph suele ser la forma más sencilla de acceder a los mensajes de chat, especialmente si quieres crear scripts o analizar datos de chat sin tener que lidiar con archivos PST. Al principio es un poco confuso, ya que tienes que configurar una aplicación de Azure AD, obtener los permisos adecuados y luego crear algunos comandos. Pero una vez que le coges el truco, es bastante flexible y puedes personalizar tus consultas para obtener lo que necesitas. En resumen: vale la pena el esfuerzo si realmente quieres explorar el historial de chat de Teams más allá de lo que permite la interfaz gráfica.

Cómo solucionar el acceso al historial de chat de Teams con PowerShell

Método 1: Configurar un registro de aplicación de Azure

Agregar un registro de aplicación en Azure AD es el primer paso. Permite que sus scripts de PowerShell se autentiquen de forma segura sin depender del inicio de sesión de un usuario. Esta configuración garantiza que su script pueda consultar los mensajes de Teams a través de Graph API.- Diríjase a Azure Portal > Azure Active Directory > Registros de aplicaciones > Nuevo registro.- Nombre su aplicación (por ejemplo, «TeamsChatExport») y regístrela.- Una vez registrada, obtenga el ID de aplicación (cliente) y el ID de directorio (inquilino) de la descripción general de la aplicación.- Vaya a Permisos de API > Agregar un permiso.- Elija Microsoft Graph > Permisos de aplicación.- Agregue `Channel. Basic. ReadAll` y `ChannelMessage. Read`.Estos son los permisos mínimos para enumerar mensajes en canales.- También agregue `Group. Read. All` y `Directory. AccessAsUser. All` si desea un acceso más amplio.- Después de agregar, haga clic en Otorgar consentimiento del administrador para que los permisos surtan efecto inmediatamente.- Vaya a Certificados y secretos > Nuevo secreto de cliente, cree un secreto y copie el valor. Guárdelo en un lugar seguro; es como la contraseña de su script. Nota: A veces, en diferentes configuraciones, la opción «Otorgar consentimiento del administrador» puede fallar si sus políticas de administrador lo restringen. Es posible que necesite la ayuda de su administrador de TI para esta parte.

Método 2: Autenticar PowerShell mediante la API de Microsoft Graph

Una vez configurada la aplicación, se autenticará con PowerShell. Esto suele ser un problema, ya que el script debe gestionar tokens OAuth, pero es manejable. Aquí hay un ejemplo rápido de cómo obtener su token: powershell $clientId = «your_app_ID» $tenantName = «yourtenant.onmicrosoft.com» $clientSecret = «your_secret» $resource = «https://graph.microsoft.com/» $Username = «[email protected]» $Password = «yourpassword» # No es ideal para la seguridad, pero funciona para las pruebas $tokenBody = @{ Grant_Type = «Password» client_id = $clientId client_secret = $clientSecret scope = «https://graph.microsoft.com/.default» username = $Username password = $Password } $tokenResponse = Invoke-RestMethod -Uri «https://login.microsoftonline.com/$tenantName/oauth2/v2.0/token» -Method POST -Body $tokenBody Esto le proporciona un token de acceso, que que usarás en tus llamadas API. Para tu información, para scripts de producción, los flujos OAuth como el código del dispositivo o los certificados son una mejor opción: menos frágiles y más seguros.—

Cómo extraer mensajes de chat de Teams y guardarlos

Una vez autenticado, puede usar PowerShell para consultar los mensajes en un canal de Teams. Funciona básicamente así: – Listar todos los equipos (grupos con resourceProvisioningOptions, incluido «Team») – Seleccionar su equipo por ID – Listar los canales de ese equipo – Seleccionar su canal (por ID) – Solicitar mensajes de ese canal – Recorrer los mensajes y las respuestas para crear un historial de chat completo. Aquí tiene un fragmento que le muestra el contenido y crea un informe HTML: powershell $header = @{Authorization = «Bearer $($tokenResponse.access_token)»} $BaseURI = «https://graph.microsoft.com/beta» # Listar todos los equipos $teams = (Invoke-RestMethod -Uri «$($BaseURI)/groups?`$filter=resourceProvisioningOptions/Any(x:x eq ‘Team’)» -Headers $header).value $teams | ForEach-Object { $_.id, $_.displayName } # Ejemplo: lista de canales de un equipo específico $TeamsID = «your_team_id» $channels = (Invoke-RestMethod -Uri «$($BaseURI)/teams/$TeamsID/channels» -Headers $header).value $channels | ForEach-Object { $_.id, $_.displayName } # Ejemplo: obtener mensajes de un canal específico $ChannelID = «your_chat_id» $messagesData = Invoke-RestMethod -Uri «$($BaseURI)/teams/$TeamsID/channels/$ChannelID/messages» -Headers $header $messages = $messagesData.value # Recorrer los mensajes y obtener las respuestas class messageData { [string]$dateTime [string]$from [string]$body [string]$re messageData() { $this.dateTime = «» $this.from = «» $this.body = «» $this.re = «» } } $messageSet = New-Object System. Collections. ArrayList foreach ($message in $messages) { $result = [PSCustomObject]@{ DateTime = (Get-Date -Date $message.createdDateTime).ToString(‘aaaa/MM/dd HH:mm’) From = $message.from.user.displayName Body = $message.body.content Re = «» } $messageSet. Add($result) # Obtener respuestas a este mensaje $repliesUri = «$($BaseURI)/teams/$TeamsID/channels/$ChannelID/messages/$($message.id)/replies» $repliesResponse = Invoke-RestMethod -Uri $repliesUri -Headers $header foreach ($reply in $repliesResponse.value) { $replyResult = [PSCustomObject]@{ DateTime = (Get-Date -Date $reply.createdDateTime).ToString(‘aaaa/MM/dd HH:mm’) From = $reply.from.user.displayName Body = $reply.body.content Re = «RE» } $messageSet. Add($replyResult) } } # Guardar el chat completo en un archivo HTML $messageSet | ConvertTo-Html | Out-File «C:\ps\teams_chat.html» -Encoding utf8 Este script es un poco rudimentario, pero funciona: lista los mensajes, recupera las respuestas y exporta todo a un archivo HTML legible. No es infalible, especialmente si no se conocen los ID del equipo o canal. Prepárese para buscar los ID en las respuestas de la API.—

Resumen

Obtener el historial de chat de Teams a través de PowerShell y Graph API no es tarea fácil, pero es factible una vez realizada la configuración inicial. La clave está en el registro de la aplicación de Azure; al principio puede ser un poco complicado, pero flexibiliza mucho los scripts. Consultar mensajes, respuestas y generar HTML en Graph API es bastante sencillo en teoría, pero puede resultar complicado si los permisos no son correctos o los ID no son correctos. Si no funciona la primera vez, probablemente deba volver a verificar los permisos o los tokens de OAuth. A veces, acceder a los datos de Teams puede ser complicado debido a restricciones de inquilinos o limitaciones de la API. Aun así, con paciencia, es una forma eficaz de obtener información del chat sin tener que copiar manualmente ni exportar a la antigua usanza.—

Resumen

  • Cree un registro de aplicación de Azure AD con los permisos de API adecuados.
  • Autenticar mediante PowerShell con tokens OAuth.
  • Utilice los puntos finales de Graph API para enumerar equipos, canales y mensajes.
  • Recorra los chats y las respuestas para generar un historial completo.
  • Exportar a HTML para una fácil visualización.

Resumen

Esperamos que este enfoque ayude a acceder al historial de chat de Teams de forma más eficiente. Es un proceso un tanto complejo, pero vale la pena si necesitas registros detallados o quieres automatizar tareas. Recuerda que los permisos y los ID son fundamentales; revísalos si algo no funciona.