В этой статье мы рассмотрим, как получить доступ к содержимому чата Microsoft Teams и экспортировать сообщения из него с помощью PowerShell.
Чаты Teams хранятся в скрытой папке Conversation historyTeam Chat в общем почтовом ящике , который создается автоматически при создании новой группы Microsoft 365 (при этом сращу создается группа Teams, сайта, сайт и библиотека в SharePoint Online, группа Yammer и т.д.
Однако вы не сможете получить доступ к этой защищенной папке с историей чата Teams через Outlook или другое приложения. Вы можете экспортировать содержимое почтового ящика Exchange Online в PST файл с помощью Content Search в Security and Compliance Center, и потом подключить PST файл в Outlook. Но это не очень удобно. Гораздо проще получить список сообщений в чате Teams через PowerShell.
Для подключения к тенанту Microsoft 365 мы будем использовать Microsoft Graph API.
Application (client) ID: your_app_ID
Directory (tenant) ID: your_tenant_ID
Invoked API requires Protected API access in application-only context when not using Resource Specific Consent
. Value: your_secret
Теперь можно подключиться к Azure AD из PowerShell и получить токен доступа.
$clientId = "your_app_ID"_x000D_$tenantName = "yourtenant.onmicrosoft.com"_x000D_$clientSecret = "your_secret"_x000D_$resource = "https://graph.microsoft.com/"_x000D_$Username = "[email protected]"_x000D_$Password = "yourpassword"_x000D_$ReqTokenBody = @{_x000D_ Grant_Type = "Password"_x000D_ client_Id = $clientID_x000D_ Client_Secret = $clientSecret_x000D_ Username = $Username_x000D_ Password = $Password_x000D_ Scope = "https://graph.microsoft.com/.default"_x000D_ }_x000D_$TokenResponse = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$TenantName/oauth2/v2.0/token" -Method POST -Body $ReqTokenBody_x000D_
Теперь вы можете получить различные данные из Azure AD.
Выведем список Teams в вашем тенанте:
#Getting all Teams_x000D_$header= @{Authorization = "Bearer $($TokenResponse.access_token)"}_x000D_$BaseURI = "https://graph.microsoft.com/beta"_x000D_$AllMicrosoftTeams = (Invoke-RestMethod -Uri "$($BaseURI)/groups?`$filter=resourceProvisioningOptions/Any(x:x eq 'Team')" -Headers $header -Method Get -ContentType "application/json").value_x000D_$AllMicrosoftTeams| FT id, DisplayName,Description_x000D_
Теперь выведем список каналов в нужной вам группе Teams (укажите ее ID):
# List channels in Teams_x000D_$TeamsID="your_team_id"_x000D_$TeamsChannels = (Invoke-RestMethod -Uri "$($BaseURI)/teams/$($TeamsID)/channels" -Headers $Header -Method Get -ContentType "application/json").value_x000D_$TeamsChannels | FT id, DisplayName,Description_x000D_
Теперь вы можете получить список сообщений и ответов на них из чата указанного канала:
$ChannelID="your_chat_id "_x000D_$Header =@{Authorization = "Bearer $($Tokenresponse.access_token)"}_x000D_ $apiUrl = "https://graph.microsoft.com/beta/teams/$TeamsID/channels/$ChannelID/messages"_x000D_$Data = Invoke-RestMethod -Uri $apiUrl -Headers $header -Method Get_x000D_$Messages = ($Data | Select-Object Value).Value_x000D_class messageData_x000D_{_x000D_ [string]$dateTime_x000D_ [string]$from_x000D_ [string]$body _x000D_ [string]$re _x000D_ messageData()_x000D_ {_x000D_ $this.dateTime = ""_x000D_ $this.from = ""_x000D_ $this.body = ""_x000D_ $this.re = ""_x000D_ }_x000D_}_x000D_$messageSet = New-Object System.Collections.ArrayList;_x000D_foreach ($message in $Messages)_x000D_{_x000D_ $result = New-object messageData_x000D_ $result.DateTime=Get-Date -Date (($message).createdDateTime) -Format 'yyyy/MM/dd HH:mm'_x000D_ $result.from = $message.from.user.displayName_x000D_ $result.body = $message.body.content_x000D_ $messageSet.Add($result)_x000D_ #parsing replies_x000D_ $repliesURI = "https://graph.microsoft.com/beta/teams/" + $TeamsID + "/channels/" + $ChannelID + "/messages/" + $message.ID + "/replies?`$top100"_x000D_ $repliesResponse = Invoke-RestMethod -Method Get -Uri $repliesURI -Headers $header_x000D_ foreach ($reply in $repliesResponse.value)_x000D_ {_x000D_ $replyData = New-Object messageData_x000D_ $replyData.dateTime = Get-Date -Date (($reply).createdDateTime) -Format 'yyyy/MM/dd HH:mm'_x000D_ $replyData.from = $reply.from.user.displayName_x000D_ $replyData.body= $reply.body.content_x000D_ $replyData.re="RE"_x000D_ $messageSet.Add($replyData)_x000D_ } _x000D_}_x000D_$messageSet|ConvertTo-Html | Out-File c:psteams_chat_history.html -Encoding utf8_x000D_
Этот скрипт получает список обсуждений из указанного канала, для каждого обсуждения получает список ответов и формирует HTML файл с полным содержимым чата. Ответы на обсуждения в таблице содержат ключевое поле RE.
Полный код доступен в нашем репозитории на GitHub: https://github.com/winadm/posh/blob/master/teams/teams_chat_export_msgs.ps1
Как менялся логотип Apple на протяжении многих лет. Логотип Apple — это не просто символ,…
Security Boot Fail при загрузке Acer — решение проблемы При загрузке ноутбука Acer с флешки,…
Ноутбук не включается — варианты решения Если при попытке включить ноутбук вы обнаруживаете, что он…
The AC power adapter wattage and type cannot be determined — причины и решение При…
Свистит или звенит блок питания компьютера — причины и решения Некоторые владельцы ПК могут обратить…
Мигает Caps Lock на ноутбуке HP — почему и что делать? При включении ноутбука HP…