PowerShell を使って Microsoft Teams のチャット履歴にアクセスし、エクスポートする方法
Teamsのチャット履歴を取得するのは、必ずしも簡単ではありません。特に、プロセスを自動化したい場合や、Outlookや通常のエクスポートツールで使えるものが見つからない場合はなおさらです。Teamsのチャットは、グループに関連付けられた共有メールボックス内の隠しフォルダ(「会話履歴\Team Chat」 )に保存されます。正しい手順さえ知っていればアクセスは簡単ですが、ボタンをクリックするほど簡単ではありません。PowerShellとMicrosoft Graph APIを使用するのが、チャットメッセージを取得する最も簡単な方法です。特に、PSTファイルを操作せずにスクリプトを作成したり、チャットデータを分析したりしたい場合は便利です。Azure ADアプリをセットアップし、適切な権限を取得し、コマンドをいくつか作成する必要があるため、最初は少し戸惑うかもしれません。しかし、一度使い方に慣れると、非常に柔軟性が高く、クエリをカスタマイズして必要な情報を取得できます。つまり、GUIで可能な範囲を超えてTeamsのチャット履歴を詳しく調べたいのであれば、試してみる価値は十分にあります。—
PowerShell で Teams のチャット履歴にアクセスする方法
方法1: Azureアプリ登録を設定する
Azure AD にアプリ登録を追加することが最初のステップです。これにより、PowerShell スクリプトはユーザーのログインに依存せずに安全に認証できます。このセットアップにより、スクリプトで Graph API を介して Teams メッセージを照会できるようになります。- Azure Portal > Azure Active Directory > アプリの登録 > 新しい登録 に移動します。- アプリに名前を付けて (例: 「TeamsChatExport」) 登録します。- 登録したら、アプリの概要から アプリケーション (クライアント) ID と ディレクトリ (テナント) ID を取得します。- API のアクセス許可 > アクセス許可の追加 に移動します。- Microsoft Graph > アプリケーションのアクセス許可 を選択します。- `Channel. Basic. ReadAll` と `ChannelMessage. Read` を追加します。これらは、チャネル内のメッセージを一覧表示するための最小限のアクセス許可です。- より広範なアクセスが必要な場合は、`Group. Read. All` と `Directory. AccessAsUser. All` も追加します。- 追加したら、管理者の同意を付与 をクリックして、アクセス許可がすぐに有効になるようにします。 – 証明書とシークレット > 新しいクライアントシークレット に移動し、シークレットを作成して値をコピーします。これはスクリプトのパスワードのようなものなので、大切に保管してください。補足:設定によっては、管理者ポリシーで制限されている場合、「管理者の同意を与える」が失敗することがあります。その場合は、IT管理者のサポートが必要になる場合があります。
方法 2: Microsoft Graph API を使用して PowerShell を認証する
アプリのセットアップが完了したら、PowerShell で認証を行います。スクリプトで OAuth トークンを処理する必要があるため、多くの場合、この処理に戸惑うことになりますが、問題なく実行できます。トークンを取得する方法の簡単な例を次に示します。 powershell $clientId = “your_app_ID” $tenantName = “yourtenant.onmicrosoft.com” $clientSecret = “your_secret” $resource = “https://graph.microsoft.com/” $Username = “[email protected]” $Password = “yourpassword” # セキュリティには最適ではありませんが、テストには機能します $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 これにより、API 呼び出しで使用するアクセス トークンが提供されます。ご参考までに、本番スクリプトの場合は、デバイス コードや証明書などの OAuth フローの方が脆弱性が少なく、より安全なので適しています。 —
Teamsのチャットメッセージを抽出して保存する方法
認証が完了すると、PowerShell を使用して Teams チャネル内のメッセージを照会できます。基本的な動作は以下のとおりです。 – すべてのチーム(resourceProvisioningOptions に ‘Team’ を含むグループ)を一覧表示 – ID でチームを選択 – そのチーム内のチャネルを一覧表示 – ID でチャネルを選択 – そのチャネルからメッセージを要求 – メッセージと返信をループ処理して完全なチャット履歴を作成 以下は、コンテンツを取得して HTML レポートを作成するスニペットです。 powershell $header = @{Authorization = “Bearer $($tokenResponse.access_token)”} $BaseURI = “https://graph.microsoft.com/beta” # すべてのチームを一覧表示 $teams = (Invoke-RestMethod -Uri “$($BaseURI)/groups?`$filter=resourceProvisioningOptions/Any(x:x eq ‘Team’)” -Headers $header).value $teams | ForEach-Object { $_.id, $_.displayName } # 例: 特定のチームのチャネルを一覧表示します $TeamsID = “your_team_id” $channels = (Invoke-RestMethod -Uri “$($BaseURI)/teams/$TeamsID/channels” -Headers $header).value $channels | ForEach-Object { $_.id, $_.displayName } # 例: 特定のチャネルからメッセージを取得します $ChannelID = “your_chat_id” $messagesData = Invoke-RestMethod -Uri “$($BaseURI)/teams/$TeamsID/channels/$ChannelID/messages” -Headers $header $messages = $messagesData.value # メッセージをループして返信を取得します 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(‘yyyy/MM/dd HH:mm’) From = $message.from.user.displayName Body = $message.body.content Re = “” } $messageSet. Add($result) # このメッセージへの返信を取得します $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(‘yyyy/MM/dd HH:mm’) From = $reply.from.user.displayName Body = $reply.body.content Re = “RE” } $messageSet. Add($replyResult) } } # チャット全体をHTMLファイル $messageSet | ConvertTo-Html | Out-File “C:\ps\teams_chat.html” -Encoding utf8 このスクリプトは少々粗雑ですが、メッセージの一覧表示、返信の取得、そして全てを読み取り可能なHTMLファイルにエクスポートする機能を備えています。特にチームIDやチャンネルIDが不明な場合は、完璧とは言えません。APIレスポンスからIDを探す準備をしておきましょう。—
まとめ
PowerShellとGraph APIを使ってTeamsからチャット履歴を取得するのは簡単ではありませんが、初期設定さえ済めば可能です。鍵となるのはAzureアプリの登録です。最初は面倒ですが、スクリプトの柔軟性が大幅に向上します。その後、Graph APIにメッセージや返信をクエリし、HTMLを出力するのは理論上は非常に簡単ですが、権限が適切でなかったりIDが間違っていたりすると、動作がおかしくなる可能性があります。最初の試みでうまくいかない場合は、権限やOAuthトークンを再確認する必要があるかもしれません。テナント制限やAPIの制限により、Teamsデータへのアクセスが難しい場合もあります。それでも、根気強く取り組めば、手動でコピーしたり、従来のエクスポート作業を行うことなく、チャット情報を取得できる強力な手段となります。 —
まとめ
- 適切な API アクセス許可を持つ Azure AD アプリ登録を作成します。
- OAuth トークンを使用して PowerShell で認証します。
- Graph API エンドポイントを使用して、チーム、チャネル、メッセージを一覧表示します。
- チャットと返信をループして完全な履歴を生成します。
- 簡単に表示できるように HTML にエクスポートします。
まとめ
この方法が、Teamsのチャット履歴をより効率的に掘り出すのに役立つことを願っています。少し複雑なプロセスですが、詳細な記録が必要な場合や、作業を自動化したい場合は、試してみる価値があります。ただし、権限とIDが全てであることを忘れないでください。うまくいかない場合は、これらを再確認してください。