Unable to Export All Channels Conversations from a Team using Graph-PowerShell

%3CLINGO-SUB%20id%3D%22lingo-sub-3393675%22%20slang%3D%22en-US%22%3EUnable%20to%20Export%20All%20Channels%20Conversations%20from%20a%20Team%20using%20Graph-PowerShell%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-3393675%22%20slang%3D%22en-US%22%3E%3CP%3E%3CSPAN%3EI'm%20using%20the%20below%20script%20to%20export%20channel%20conversations.%20It%20works%20fine%20per%20channel.%20But%20I%20want%20to%20be%20able%20to%20export%20all%20channel%20conversations%20in%20a%20Team.%20I%20tried%20using%20ForEach%20(%24Channel%20in%20%24Channels)%20but%20it's%20not%20working.%20Can%20someone%20help%20please.%20Credit%20to%20PSGuy%20for%20the%20original%20script%3A%26nbsp%3B%3C%2FSPAN%3E%3CA%20href%3D%22https%3A%2F%2Fwww.psguy.eu%2Fhow-to-export-ms-teams-chat-to-html-file-for-backup%2F%22%20rel%3D%22nofollow%20noreferrer%20noopener%22%20target%3D%22_blank%22%3Ehttps%3A%2F%2Fwww.psguy.eu%2Fhow-to-export-ms-teams-chat-to-html-file-for-backup%2F%3C%2FA%3E%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-applescript%22%3E%3CCODE%3E%5BCmdletBinding(DefaultParameterSetName%3D'default')%5D%0A%20%20%20%20param%0A%20%20%20%20(%0A%20%20%20%20%20%20%20%20%5BParameter(ParameterSetName%3D'Channel')%5D%0A%20%20%20%20%20%20%20%20%24Team%2C%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%5BParameter(Mandatory%3D%24false%2CParameterSetName%3D'default')%5D%0A%20%20%20%20%20%20%20%20%5BParameter(Mandatory%3D%24true%2CParameterSetName%3D'Channel')%5D%0A%20%20%20%20%20%20%20%20%24Channel%0A%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20)%0AWrite-Host%20%22Exporting%20Team%20Chats%20Homie%22%0A%0A%24scriptpath%20%3D%20%24MyInvocation.MyCommand.Path%0A%24dir%20%3D%20Split-Path%20%24scriptpath%0A%0A%24Date%20%3D%20Get-Date%20-Format%20%22MM-dd-yyyy-HHmm%22%0A%24clientId%20%3D%20%22YourClientID%22%0A%24tenantName%20%3D%20%22YourTenantName%22%0A%24clientSecret%20%3D%20%22YourClientSecret%22%0A%24resource%20%3D%20%22https%3A%2F%2Fgraph.microsoft.com%2F%22%0A%0A%24ReqTokenBody%20%3D%20%40%7B%0A%20%20%20%20Grant_Type%20%20%20%20%3D%20%22Password%22%0A%20%20%20%20client_Id%20%20%20%20%20%3D%20%24clientID%0A%20%20%20%20Client_Secret%20%3D%20%24clientSecret%0A%20%20%20%20Username%20%20%20%20%20%20%3D%20'YourTeamsAdmUserName'%0A%20%20%20%20Password%20%20%20%20%20%20%3D%20'YourTeamsAdmPassword'%0A%20%20%20%20Scope%20%20%20%20%20%20%20%20%20%3D%20%22https%3A%2F%2Fgraph.microsoft.com%2F.default%22%0A%7D%20%0A%24TokenResponse%20%3D%20Invoke-RestMethod%20-Uri%20%22https%3A%2F%2Flogin.microsoftonline.com%2F%24TenantName%2Foauth2%2Fv2.0%2Ftoken%22%20-Method%20POST%20-Body%20%24ReqTokenBody%0A%0A%23Getting%20all%20Groups%0A%24apiUrl%20%3D%20%22https%3A%2F%2Fgraph.microsoft.com%2Fbeta%2Fgroups%22%0A%0A%24Data%20%3D%20Invoke-RestMethod%20-Headers%20%40%7BAuthorization%20%3D%20%22Bearer%20%24(%24TokenResponse.access_token)%22%7D%20-Uri%20%24apiUrl%20-Method%20Get%20-ErrorVariable%20RespErr%0A%24Groups%20%3D%20(%24Data%20%7C%20Select-Object%20Value).Value%0A%0Aif%20(%24Team%20-eq%20%24NULL)%7B%0AWrite-Host%20%22You%20have%22%20-NoNewline%20%0AWrite-Host%20%22%20%24(%24Groups.Count)%22%20-ForegroundColor%20Yellow%20-NoNewline%0AWrite-Host%20%22%20teams.%22%0AWrite-Host%20%22%22%0AWrite-Host%20%22Messages%20from%20which%20Team%20do%20you%20want%20to%20export%20to%20the%20HTML%20format%3F%22%20-ForegroundColor%20Yellow%0A%24Groups%20%7C%20FT%20DisplayName%2CDescription%0A%24Team%20%3D%20Read-Host%20%22Type%20one%20of%20the%20Team%20(DisplayName)%22%0A%7D%0A%0A%24TeamID%20%3D%20(%24Groups%20%7C%20Where-Object%20%7B%24_.displayname%20-eq%20%22%24(%24Team)%22%7D).id%0A%0A%0A%24apiUrl%20%3D%20%22https%3A%2F%2Fgraph.microsoft.com%2Fv1.0%2Fteams%2F%24TeamID%2FChannels%22%0A%24Data%20%3D%20Invoke-RestMethod%20-Headers%20%40%7BAuthorization%20%3D%20%22Bearer%20%24(%24TokenResponse.access_token)%22%7D%20-Uri%20%24apiUrl%20-Method%20Get%0Aif%20(%24Channel%20-eq%20%24NULL)%7B%0AWrite-Host%20%22You%20choose%22%20-NoNewline%0AWrite-Host%20%22%20%24(%24Team)%22%20-ForegroundColor%20Yellow%20-NoNewline%0AWrite-Host%20%22%20Team.%22%0AWrite-Host%20%22%22%0A%0A%24Channels%20%3D%20(%24Data%20%7C%20Select-Object%20Value).Value%0AWrite-Host%20%22Messages%20from%20which%20Channel%20do%20you%20want%20to%20export%20to%20the%20HTML%20format%3F%22%20-ForegroundColor%20Yellow%0A%24Channels%20%7C%20FT%20DisplayName%2CDescription%0A%24Channel%20%3D%20Read-Host%20%22Type%20one%20of%20the%20Channel(DisplayName)%22%0A%7D%0A%0A%24ChannelID%20%3D%20((%24Data%20%7C%20Select-Object%20Value).Value%20%7C%20Where-Object%20%7B%24_.displayName%20-eq%20%22%24(%24Channel)%22%7D).ID%0A%0A%24apiUrl%20%3D%20%22https%3A%2F%2Fgraph.microsoft.com%2Fbeta%2Fgroups%2F%24TeamID%2Fmembers%22%0A%24Data%20%3D%20Invoke-RestMethod%20-Headers%20%40%7BAuthorization%20%3D%20%22Bearer%20%24(%24TokenResponse.access_token)%22%7D%20-Uri%20%24apiUrl%20-Method%20Get%0A%0Aclass%20messageData%0A%7B%0A%20%20%20%20%5Bstring%5D%24dateTime%0A%20%20%20%20%5Bstring%5D%24from%0A%20%20%20%20%5Bstring%5D%24body%0A%20%20%20%20%0A%20%20%20%20messageData()%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%24this.dateTime%20%3D%20%22%22%0A%20%20%20%20%20%20%20%20%24this.from%20%3D%20%22%22%0A%20%20%20%20%20%20%20%20%24this.body%20%3D%20%22%22%0A%20%20%20%20%7D%0A%20%20%20%20%0A%7D%0A%0Afunction%20parseMessage(%24Data)%20%23returns%20resultset%20%0A%7B%0A%20%20%20%20%24messages%20%3D%20(%24Data%20%7C%20Select-Object%20Value).Value%0A%20%20%20%20%0A%20%20%20%20foreach%20(%24message%20in%20%24Messages)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%24messageID%20%3D%20%24message.id%0A%20%20%20%20%20%20%20%20%24messageSet%20%3D%20New-Object%20System.Collections.ArrayList%3B%0A%20%20%20%20%20%20%20%20%24result%20%3D%20New-object%20messageData%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%23parse%20message%0A%20%20%20%20%20%20%20%20if%20(%24NULL%20-eq%20%24message.from.user.displayName)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24result.dateTime%20%3D%20%24message.createdDateTime%0A%20%20%20%20%20%20%20%20%20%20%20%20%24result.from%20%3D%20%24message.from.application.displayName%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24result.dateTime%20%3D%20%24message.createdDateTime%0A%20%20%20%20%20%20%20%20%20%20%20%20%24result.from%20%3D%20%24message.from.user.displayName%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%24bodyOut%20%3D%20%22%22%0A%20%20%20%20%20%20%20%20if%20(%24NULL%20-eq%20%24message.summary)%20%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20foreach%20(%24attachment%20in%20%24message.attachments)%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24output%20%3D%20%24attachment.content%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24output%20%3D%20%24output.substring(14)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24output%20%3D%20%24output.substring(0%2C%24output.length-4)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24bodyOut%20%3D%20%24bodyOut%20%2B%20%24output%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24bodyOut%20%3D%20%24message.summary%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%24bodyOut%20%3D%20%24bodyOut%20%2B%20%24message.body.content%0A%20%20%20%20%20%20%20%20%24result.body%20%3D%20%24bodyOut%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%24messageSet.Add(%24result)%0A%20%20%20%20%0A%20%20%20%20%20%20%20%20%23parse%20replies%0A%20%20%20%20%20%20%20%20%24repliesURI%20%3D%20%22https%3A%2F%2Fgraph.microsoft.com%2Fbeta%2Fteams%2F%22%20%2B%20%24TeamID%20%2B%20%22%2Fchannels%2F%22%20%2B%20%24ChannelID%20%2B%20%22%2Fmessages%2F%22%20%2B%20%24messageID%20%2B%20%22%2Freplies%3F%60%24top100%22%0A%20%20%20%20%0A%20%20%20%20%20%20%20%20%24repliesResponse%20%3D%20Invoke-RestMethod%20-Method%20Get%20-Uri%20%24repliesURI%20%20-Headers%20%40%7BAuthorization%20%3D%20%22Bearer%20%24(%24TokenResponse.access_token)%22%7D%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20foreach%20(%24reply%20in%20%24repliesResponse.value%20)%20%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24replyData%20%3D%20New-Object%20messageData%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(%24NULL%20-eq%20%24reply.from.user.displayName)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24replyData.dateTime%20%3D%20%24reply.createdDateTime%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24replyData.from%20%3D%20%24reply.from.application.displayName%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24replyData.dateTime%20%3D%20%24reply.createdDateTime%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24replyData.from%20%3D%20%24reply.from.user.displayName%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%24bodyOut%20%3D%20%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(%24NULL%20-eq%20%24message.summary)%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20foreach%20(%24attachment%20in%20%24reply.attachments)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24output%20%3D%20%24attachment.content%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24output%20%3D%20%24output.substring(14)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24output%20%3D%20%24output.substring(0%2C%24output.length-4)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24bodyOut%20%3D%20%24bodyOut%20%2B%20%24output%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24bodyOut%20%3D%20%24message.summary%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%24replyData.body%20%3D%20%24bodyOut%20%2B%20%24reply.body.content%0A%20%20%20%20%20%20%20%20%20%20%20%20%24messageSet.Add(%24replyData)%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%24resultList.Add(%24messageSet)%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%0A%7D%0A%0A%24TokenResponse%20%3D%20Invoke-RestMethod%20-Uri%20%22https%3A%2F%2Flogin.microsoftonline.com%2F%24TenantName%2Foauth2%2Fv2.0%2Ftoken%22%20-Method%20POST%20-Body%20%24ReqTokenBody%0A%0A%24resultList%20%3D%20New-Object%20System.Collections.ArrayList%3B%0A%0A%24apiUrl%20%3D%20%22https%3A%2F%2Fgraph.microsoft.com%2Fbeta%2Fteams%2F%24TeamID%2Fchannels%2F%24ChannelID%2Fmessages%3F%60%24top%3D100%22%0A%24sourceData%20%3D%20Invoke-RestMethod%20-Headers%20%40%7BAuthorization%20%3D%20%22Bearer%20%24(%24TokenResponse.access_token)%22%7D%20-Uri%20%24apiUrl%20-Method%20Get%0AparseMessage(%24sourceData)%0A%24nextLink%20%3D%20%24sourceData.'%40Odata.NextLink'%0Awhile%20(%24NULL%20-ne%20%24nextLink)%0A%7B%0A%20%20%20%20%24nextURL%20%3D%20%24nextLink%3B%0A%20%20%20%20%24sourceData%20%3D%20Invoke-RestMethod%20-Headers%20%40%7BAuthorization%20%3D%20%22Bearer%20%24(%24TokenResponse.access_token)%22%7D%20-Uri%20%24nextURL%20-Method%20Get%0A%20%20%20%20parseMessage(%24sourceData)%0A%20%20%20%20%24nextLink%20%3D%20%24sourceData.'%40Odata.NextLink'%0A%7D%0A%0A%24resultFieldSet%20%3D%20New-Object%20System.Collections.ArrayList%0Aforeach(%24resultData%20in%20%24resultList)%20%7B%0A%20%20%20%20%24resultFields%20%3D%20%24resultData%20%7C%20Select-Object%20%40%7BName%20%3D%20'DateTime'%3B%20Expression%20%3D%20%7BGet-Date%20-Date%20((%24_).dateTime)%20-Format%20'MM%2Fdd%2Fyyyy%20hh%3Amm%3Ass.fff%20tt'%7D%7D%2C%20%40%7BName%20%3D%20'From'%3B%20Expression%20%3D%20%7B(((%24_).from))%7D%7D%2C%20%40%7BName%20%3D%20'Message'%3B%20Expression%20%3D%20%7B((%24_).body)%20-replace%20'%26lt%3B.*%3F%26gt%3B'%2C''%7D%7D%7C%20Sort-Object%20DateTime%0A%20%20%20%20%24resultFieldSet.Add(%24resultFields)%0A%7D%0A%0A%24Header%20%3D%20%40%22%0A%3CSTYLE%3E%0Ah1%2C%20h5%2C%20th%20%7B%20text-align%3A%20center%3B%20%7D%20%0Atable%20%7B%20margin%3A%20auto%3B%20font-family%3A%20Segoe%20UI%3B%20box-shadow%3A%2010px%2010px%205px%20%23888%3B%20border%3A%20thin%20ridge%20grey%3B%20%7D%20%0Ath%20%7B%20background%3A%20%230046c3%3B%20color%3A%20%23fff%3B%20max-width%3A%20400px%3B%20padding%3A%205px%2010px%3B%20%7D%20%0Atd%20%7B%20font-size%3A%2011px%3B%20padding%3A%205px%2020px%3B%20color%3A%20%23000%3B%20%7D%20%0Atr%20%7B%20background%3A%20%23b8d1f3%3B%20%7D%20%0Atr%3Anth-child(even)%20%7B%20background%3A%20%23dae5f4%3B%20%7D%20%0Atr%3Anth-child(odd)%20%7B%20background%3A%20%23b8d1f3%3B%20%7D%0A%3C%2FSTYLE%3E%0A%22%40%0A%0A%24count%20%3D%200%0Aforeach%20(%24resultCount%20in%20%24resultList)%7B%0A%20%20%20%20%24count%20%3D%20%24count%20%2B%20%24resultCount.Count%0A%7D%0A%0A%24body%20%3D%20%22%3CB%3EGenerated%3A%3C%2FB%3E%20%24(Get-Date%20-Format%20'MM%2Fdd%2Fyyyy%20hh%3Amm%20tt')%20%3CBR%20%2F%3E%3CBR%20%2F%3E%20%3CB%3ETeam%20Name%3A%3C%2FB%3E%20%24(%24Team)%20%3CBR%20%2F%3E%20%3CB%3EChannel%20Name%3A%3C%2FB%3E%20%24(%24Channel)%20%3CBR%20%2F%3E%3CBR%20%2F%3E%22%20%2B%20%22%3CB%3Enumber%20of%20messages%3A%3C%2FB%3E%20%22%20%2B%20%24count%20%2B%20%22%20%3CBR%20%2F%3E%3CBR%20%2F%3E%22%0A%24body%20%3D%20%24body%20%2B%20%22%22%0A%0A%0A%24resultHtml%20%3D%20%22%22%0Aforeach%20(%24resultFields%20in%20%24resultFieldSet)%7B%0A%20%20%20%20%24tempHtml%20%3D%20%24resultFields%20%7C%20ConvertTo-Html%20-Head%20%24header%0A%20%20%20%20%24resultHtml%20%3D%20%24tempHtml%20%2B%20%22%3CBR%20%2F%3E%22%20%2B%20%24resultHtml%0A%7D%0A%24resultHtml%20%3D%20%24body%20%2B%20%22%3CBR%20%2F%3E%22%20%2B%20%24resultHtml%0A%0A%24Export%20%3D%20%22%24dir%5CTeamsHistory%5C%24Team-%24Channel%22%0ANew-Item%20-ItemType%20Directory%20-Path%20%24Export%20-ErrorAction%20Ignore%0A%24resultHtml%20%7C%20Out-File%20%24Export%5C%24Team-%24Channel-%24Date.html%0A%0AWrite-Host%20%22%0A%0A%22%0AWrite-Host%20%22Messages%20from%20the%22%20-NoNewline%0AWrite-Host%20%22%20%24(%24Team)%22%20-NoNewline%20-ForegroundColor%20Yellow%0AWrite-Host%20%22%20team%20and%22%20-NoNewline%0AWrite-Host%20%22%20%24(%24Channel)%22%20-NoNewline%20-ForegroundColor%20Yellow%0AWrite-Host%20%22%20channel%20were%20generated%20and%20saved%20to%20the%22%20-NoNewline%0AWrite-Host%20%22%20%24(%24Export)%22%20-NoNewline%20-ForegroundColor%20Yellow%0AWrite-Host%20%22%20as%20a%22%20-NoNewline%0AWrite-Host%20%22%20%24(%24Team)-%24(%24Channel)-%24(%24Date).html%22%20-NoNewline%20-ForegroundColor%20Yellow%0AWrite-Host%20%22%20file.%22%0AWrite-Host%20%22%0A%0A%22%3C%2FCODE%3E%3C%2FPRE%3E%3C%2FLINGO-BODY%3E%3CLINGO-LABS%20id%3D%22lingo-labs-3393675%22%20slang%3D%22en-US%22%3E%3CLINGO-LABEL%3EGraph%20API%3C%2FLINGO-LABEL%3E%3CLINGO-LABEL%3EPowerShell%3C%2FLINGO-LABEL%3E%3CLINGO-LABEL%3ETeams%3C%2FLINGO-LABEL%3E%3C%2FLINGO-LABS%3E%3CLINGO-SUB%20id%3D%22lingo-sub-3402538%22%20slang%3D%22en-US%22%3ERe%3A%20Unable%20to%20Export%20All%20Channels%20Conversations%20from%20a%20Team%20using%20Graph-PowerShell%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-3402538%22%20slang%3D%22en-US%22%3E%3CP%3E%3CA%20href%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F138430%22%20target%3D%22_blank%22%3E%40AshMSport%3C%2FA%3E%26nbsp%3BTo%20export%20messages%20from%20all%20Channels%20within%20a%20team%2C%20you%20need%20to%20loop%20through%20the%20Channels.%20Here%20is%20a%20slightly%20modified%20script%20(All%20credit%20to%20original%20author%20you%20mentioned%20in%20your%20post).%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EEnsure%20your%20app%20has%26nbsp%3B%20the%20required%20permissions.%26nbsp%3B%20For%20my%20test%2C%26nbsp%3B%20I%20gave%20the%20following%20permissions.%26nbsp%3B%20It%20may%20be%20more%20permissions%20than%20what%20is%20really%20needed.%20You%20can%20remove%20permissions%20one%20by%20one%20and%20test%20to%20determine%20the%20minimal%20permissions%20required.%3C%2FP%3E%3CP%3E%3CSPAN%20class%3D%22lia-inline-image-display-wrapper%20lia-image-align-inline%22%20image-alt%3D%22VinayBhatia_0-1652991501795.png%22%20style%3D%22width%3A%201293px%3B%22%3E%3CIMG%20src%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fimage%2Fserverpage%2Fimage-id%2F373352i0868F227E98696BF%2Fimage-size%2Fmedium%3Fv%3Dv2%26amp%3Bpx%3D400%22%20role%3D%22button%22%20title%3D%22VinayBhatia_0-1652991501795.png%22%20alt%3D%22VinayBhatia_0-1652991501795.png%22%20%2F%3E%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-powershell%22%3E%3CCODE%3E%5BCmdletBinding(DefaultParameterSetName%3D'default')%5D%0A%20%20%20%20param%0A%20%20%20%20(%0A%20%20%20%20%20%20%20%20%5BParameter(ParameterSetName%3D'Channel')%5D%0A%20%20%20%20%20%20%20%20%24Team%2C%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%5BParameter(Mandatory%3D%24false%2CParameterSetName%3D'default')%5D%0A%20%20%20%20%20%20%20%20%5BParameter(Mandatory%3D%24true%2CParameterSetName%3D'Channel')%5D%0A%20%20%20%20%20%20%20%20%24Channel%0A%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20)%0AWrite-Host%20%22Exporting%20Team%20Chats%20Homie%22%0A%0A%24scriptpath%20%3D%20%24MyInvocation.MyCommand.Path%0A%24dir%20%3D%20Split-Path%20%24scriptpath%0A%0A%24Date%20%3D%20Get-Date%20-Format%20%22MM-dd-yyyy-HHmm%22%0A%0A%23TODO%3A%20Update%20for%20your%20tenant%20%0A%24clientId%20%3D%20%22XXXXXXX%22%0A%24tenantName%20%3D%20%22YYYYYY%22%0A%24clientSecret%20%3D%20%22ZZZZZZZ%22%0A%24resource%20%3D%20%22https%3A%2F%2Fgraph.microsoft.com%2F%22%0A%0Aclass%20messageData%0A%7B%0A%20%20%20%20%5Bstring%5D%24dateTime%0A%20%20%20%20%5Bstring%5D%24from%0A%20%20%20%20%5Bstring%5D%24body%0A%20%20%20%20%0A%20%20%20%20messageData()%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%24this.dateTime%20%3D%20%22%22%0A%20%20%20%20%20%20%20%20%24this.from%20%3D%20%22%22%0A%20%20%20%20%20%20%20%20%24this.body%20%3D%20%22%22%0A%20%20%20%20%7D%0A%20%20%20%20%0A%7D%0A%0Afunction%20parseMessage(%24Data)%20%23returns%20resultset%20%0A%7B%0A%20%20%20%20%24messages%20%3D%20(%24Data%20%7C%20Select-Object%20Value).Value%0A%20%20%20%20%0A%20%20%20%20foreach%20(%24message%20in%20%24Messages)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%24messageID%20%3D%20%24message.id%0A%20%20%20%20%20%20%20%20%24messageSet%20%3D%20New-Object%20System.Collections.ArrayList%3B%0A%20%20%20%20%20%20%20%20%24result%20%3D%20New-object%20messageData%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%23parse%20message%0A%20%20%20%20%20%20%20%20if%20(%24NULL%20-eq%20%24message.from.user.displayName)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24result.dateTime%20%3D%20%24message.createdDateTime%0A%20%20%20%20%20%20%20%20%20%20%20%20%24result.from%20%3D%20%24message.from.application.displayName%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24result.dateTime%20%3D%20%24message.createdDateTime%0A%20%20%20%20%20%20%20%20%20%20%20%20%24result.from%20%3D%20%24message.from.user.displayName%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%24bodyOut%20%3D%20%22%22%0A%20%20%20%20%20%20%20%20if%20(%24NULL%20-eq%20%24message.summary)%20%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20foreach%20(%24attachment%20in%20%24message.attachments)%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24output%20%3D%20%24attachment.content%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(%24output)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24output%20%3D%20%24output.substring(14)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24output%20%3D%20%24output.substring(0%2C%24output.length-4)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24bodyOut%20%3D%20%24bodyOut%20%2B%20%24output%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24bodyOut%20%3D%20%24message.summary%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%24bodyOut%20%3D%20%24bodyOut%20%2B%20%24message.body.content%0A%20%20%20%20%20%20%20%20%24result.body%20%3D%20%24bodyOut%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%24messageSet.Add(%24result)%0A%20%20%20%20%0A%20%20%20%20%20%20%20%20%23parse%20replies%0A%20%20%20%20%20%20%20%20%24repliesURI%20%3D%20%22https%3A%2F%2Fgraph.microsoft.com%2Fbeta%2Fteams%2F%22%20%2B%20%24TeamID%20%2B%20%22%2Fchannels%2F%22%20%2B%20%24ChannelID%20%2B%20%22%2Fmessages%2F%22%20%2B%20%24messageID%20%2B%20%22%2Freplies%3F%60%24top100%22%0A%20%20%20%20%0A%20%20%20%20%20%20%20%20%24repliesResponse%20%3D%20Invoke-RestMethod%20-Method%20Get%20-Uri%20%24repliesURI%20%20-Headers%20%40%7BAuthorization%20%3D%20%22Bearer%20%24(%24TokenResponse.access_token)%22%7D%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20foreach%20(%24reply%20in%20%24repliesResponse.value%20)%20%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24replyData%20%3D%20New-Object%20messageData%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(%24NULL%20-eq%20%24reply.from.user.displayName)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24replyData.dateTime%20%3D%20%24reply.createdDateTime%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24replyData.from%20%3D%20%24reply.from.application.displayName%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24replyData.dateTime%20%3D%20%24reply.createdDateTime%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24replyData.from%20%3D%20%24reply.from.user.displayName%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%24bodyOut%20%3D%20%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(%24NULL%20-eq%20%24message.summary)%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20foreach%20(%24attachment%20in%20%24reply.attachments)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24output%20%3D%20%24attachment.content%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(%24output)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24output%20%3D%20%24output.substring(14)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24output%20%3D%20%24output.substring(0%2C%24output.length-4)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24bodyOut%20%3D%20%24bodyOut%20%2B%20%24output%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24bodyOut%20%3D%20%24message.summary%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%24replyData.body%20%3D%20%24bodyOut%20%2B%20%24reply.body.content%0A%20%20%20%20%20%20%20%20%20%20%20%20%24messageSet.Add(%24replyData)%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%24resultList.Add(%24messageSet)%0A%20%20%20%20%7D%0A%0A%20%20%20%20return%0A%7D%0A%0A%24ReqTokenBody%20%3D%20%40%7B%0A%20%20%20%20Grant_Type%20%20%20%20%3D%20%22Password%22%0A%20%20%20%20client_Id%20%20%20%20%20%3D%20%24clientID%0A%20%20%20%20Client_Secret%20%3D%20%24clientSecret%0A%0A%20%20%20%20%23TODO%3A%20Update%20for%20your%20tenant%20%0A%20%20%20%20Username%20%20%20%20%20%20%3D%20'admin%40XXXXXXXX.onmicrosoft.com'%0A%20%20%20%20Password%20%20%20%20%20%20%3D%20'YYYYYYYYYY'%0A%20%20%20%20Scope%20%20%20%20%20%20%20%20%20%3D%20%22https%3A%2F%2Fgraph.microsoft.com%2F.default%22%0A%7D%20%0A%24TokenResponse%20%3D%20Invoke-RestMethod%20-Uri%20%22https%3A%2F%2Flogin.microsoftonline.com%2F%24TenantName%2Foauth2%2Fv2.0%2Ftoken%22%20-Method%20POST%20-Body%20%24ReqTokenBody%0A%0A%23Getting%20all%20Groups%0A%24apiUrl%20%3D%20%22https%3A%2F%2Fgraph.microsoft.com%2Fbeta%2Fgroups%22%0A%0A%24Data%20%3D%20Invoke-RestMethod%20-Headers%20%40%7BAuthorization%20%3D%20%22Bearer%20%24(%24TokenResponse.access_token)%22%7D%20-Uri%20%24apiUrl%20-Method%20Get%20-ErrorVariable%20RespErr%0A%24Groups%20%3D%20(%24Data%20%7C%20Select-Object%20Value).Value%0A%0Aif%20(%24Team%20-eq%20%24NULL)%7B%0AWrite-Host%20%22You%20have%22%20-NoNewline%20%0AWrite-Host%20%22%20%24(%24Groups.Count)%22%20-ForegroundColor%20Yellow%20-NoNewline%0AWrite-Host%20%22%20teams.%22%0AWrite-Host%20%22%22%0AWrite-Host%20%22Messages%20from%20which%20Team%20do%20you%20want%20to%20export%20to%20the%20HTML%20format%3F%22%20-ForegroundColor%20Yellow%0A%24Groups%20%7C%20FT%20DisplayName%2CDescription%0A%24Team%20%3D%20Read-Host%20%22Type%20one%20of%20the%20Team%20(DisplayName)%22%0A%7D%0A%0A%24TeamID%20%3D%20(%24Groups%20%7C%20Where-Object%20%7B%24_.displayname%20-eq%20%22%24(%24Team)%22%7D).id%0A%0A%0A%24apiUrl%20%3D%20%22https%3A%2F%2Fgraph.microsoft.com%2Fv1.0%2Fteams%2F%24TeamID%2FChannels%22%0A%24Data%20%3D%20Invoke-RestMethod%20-Headers%20%40%7BAuthorization%20%3D%20%22Bearer%20%24(%24TokenResponse.access_token)%22%7D%20-Uri%20%24apiUrl%20-Method%20Get%0Aif%20(%24Channel%20-eq%20%24NULL)%7B%0AWrite-Host%20%22You%20choose%22%20-NoNewline%0AWrite-Host%20%22%20%24(%24Team)%22%20-ForegroundColor%20Yellow%20-NoNewline%0AWrite-Host%20%22%20Team.%22%0AWrite-Host%20%22%22%0A%0A%24Channels%20%3D%20(%24Data%20%7C%20Select-Object%20Value).Value%0A%23Write-Host%20%22Messages%20from%20which%20Channel%20do%20you%20want%20to%20export%20to%20the%20HTML%20format%3F%22%20-ForegroundColor%20Yellow%0A%23%24Channels%20%7C%20FT%20DisplayName%2CDescription%0A%23%24Channel%20%3D%20Read-Host%20%22Type%20one%20of%20the%20Channel(DisplayName)%22%0A%7D%0A%0Aforeach%20(%24Channel%20in%20%24Channels)%0A%7B%0A%0A%20%20%20%20%23%24ChannelID%20%3D%20((%24Data%20%7C%20Select-Object%20Value).Value%20%7C%20Where-Object%20%7B%24_.displayName%20-eq%20%22%24(%24Channel)%22%7D).ID%0A%20%20%20%20%24ChannelID%20%3D%20%24Channel.id%0A%20%20%20%20Write-Host%20%22Channel%20ID%3A%20%22%20%2B%20%24ChannelID%0A%0A%20%20%20%20%23%24apiUrl%20%3D%20%22https%3A%2F%2Fgraph.microsoft.com%2Fbeta%2Fgroups%2F%24TeamID%2Fmembers%22%0A%20%20%20%20%24apiUrl%20%3D%20%22https%3A%2F%2Fgraph.microsoft.com%2Fv1.0%2Fgroups%2F%24TeamID%2Fmembers%22%0A%20%20%20%20%24Data%20%3D%20Invoke-RestMethod%20-Headers%20%40%7BAuthorization%20%3D%20%22Bearer%20%24(%24TokenResponse.access_token)%22%7D%20-Uri%20%24apiUrl%20-Method%20Get%0A%0A%20%20%20%20%24TokenResponse%20%3D%20Invoke-RestMethod%20-Uri%20%22https%3A%2F%2Flogin.microsoftonline.com%2F%24TenantName%2Foauth2%2Fv2.0%2Ftoken%22%20-Method%20POST%20-Body%20%24ReqTokenBody%0A%20%20%20%20%24resultList%20%3D%20New-Object%20System.Collections.ArrayList%3B%0A%0A%20%20%20%20%23Correct%20URL%20with%20escape%0A%20%20%20%20%24apiUrl%20%3D%20%22https%3A%2F%2Fgraph.microsoft.com%2Fbeta%2Fteams%2F%24TeamID%2Fchannels%2F%24ChannelID%2Fmessages%3F%60%24top%3D100%22%0A%20%20%20%20Write-Host%20%24apiUrl%0A%20%20%20%20%24sourceData%20%3D%20Invoke-RestMethod%20-Headers%20%40%7BAuthorization%20%3D%20%22Bearer%20%24(%24TokenResponse.access_token)%22%7D%20-Uri%20%24apiUrl%20-Method%20Get%0A%20%20%20%20parseMessage(%24sourceData)%0A%20%20%20%20%24nextLink%20%3D%20%24sourceData.'%40Odata.NextLink'%0A%20%20%20%20while%20(%24NULL%20-ne%20%24nextLink)%0A%20%20%20%20%7B%0A%20%20%20%20%24nextURL%20%3D%20%24nextLink%3B%0A%20%20%20%20%24sourceData%20%3D%20Invoke-RestMethod%20-Headers%20%40%7BAuthorization%20%3D%20%22Bearer%20%24(%24TokenResponse.access_token)%22%7D%20-Uri%20%24nextURL%20-Method%20Get%0A%20%20%20%20parseMessage(%24sourceData)%0A%20%20%20%20%24nextLink%20%3D%20%24sourceData.'%40Odata.NextLink'%0A%7D%0A%0A%0A%0A%24resultFieldSet%20%3D%20New-Object%20System.Collections.ArrayList%0Aforeach(%24resultData%20in%20%24resultList)%20%7B%0A%20%20%20%20%24resultFields%20%3D%20%24resultData%20%7C%20Select-Object%20%40%7BName%20%3D%20'DateTime'%3B%20Expression%20%3D%20%7BGet-Date%20-Date%20((%24_).dateTime)%20-Format%20'MM%2Fdd%2Fyyyy%20hh%3Amm%3Ass.fff%20tt'%7D%7D%2C%20%40%7BName%20%3D%20'From'%3B%20Expression%20%3D%20%7B(((%24_).from))%7D%7D%2C%20%40%7BName%20%3D%20'Message'%3B%20Expression%20%3D%20%7B((%24_).body)%20-replace%20'%26lt%3B.*%3F%26gt%3B'%2C''%7D%7D%7C%20Sort-Object%20DateTime%0A%20%20%20%20%24resultFieldSet.Add(%24resultFields)%0A%7D%0A%0A%24Header%20%3D%20%40%22%0A%3CSTYLE%3E%0Ah1%2C%20h5%2C%20th%20%7B%20text-align%3A%20center%3B%20%7D%20%0Atable%20%7B%20margin%3A%20auto%3B%20font-family%3A%20Segoe%20UI%3B%20box-shadow%3A%2010px%2010px%205px%20%23888%3B%20border%3A%20thin%20ridge%20grey%3B%20%7D%20%0Ath%20%7B%20background%3A%20%230046c3%3B%20color%3A%20%23fff%3B%20max-width%3A%20400px%3B%20padding%3A%205px%2010px%3B%20%7D%20%0Atd%20%7B%20font-size%3A%2011px%3B%20padding%3A%205px%2020px%3B%20color%3A%20%23000%3B%20%7D%20%0Atr%20%7B%20background%3A%20%23b8d1f3%3B%20%7D%20%0Atr%3Anth-child(even)%20%7B%20background%3A%20%23dae5f4%3B%20%7D%20%0Atr%3Anth-child(odd)%20%7B%20background%3A%20%23b8d1f3%3B%20%7D%0A%3C%2FSTYLE%3E%0A%22%40%0A%0A%24count%20%3D%200%0Aforeach%20(%24resultCount%20in%20%24resultList)%7B%0A%20%20%20%20%24count%20%3D%20%24count%20%2B%20%24resultCount.Count%0A%7D%0A%0A%24body%20%3D%20%22%3CB%3EGenerated%3A%3C%2FB%3E%20%24(Get-Date%20-Format%20'MM%2Fdd%2Fyyyy%20hh%3Amm%20tt')%20%3CBR%20%2F%3E%3CBR%20%2F%3E%20%3CB%3ETeam%20Name%3A%3C%2FB%3E%20%24(%24Team)%20%3CBR%20%2F%3E%20%3CB%3EChannel%20Name%3A%3C%2FB%3E%20%24(%24Channel)%20%3CBR%20%2F%3E%3CBR%20%2F%3E%22%20%2B%20%22%3CB%3Enumber%20of%20messages%3A%3C%2FB%3E%20%22%20%2B%20%24count%20%2B%20%22%20%3CBR%20%2F%3E%3CBR%20%2F%3E%22%0A%24body%20%3D%20%24body%20%2B%20%22%22%0A%0A%0A%24resultHtml%20%3D%20%22%22%0Aforeach%20(%24resultFields%20in%20%24resultFieldSet)%7B%0A%20%20%20%20%24tempHtml%20%3D%20%24resultFields%20%7C%20ConvertTo-Html%20-Head%20%24header%0A%20%20%20%20%24resultHtml%20%3D%20%24tempHtml%20%2B%20%22%3CBR%20%2F%3E%22%20%2B%20%24resultHtml%0A%7D%0A%24resultHtml%20%3D%20%24body%20%2B%20%22%3CBR%20%2F%3E%22%20%2B%20%24resultHtml%0A%0A%24channelDisplayName%20%3D%20%24Channel.displayName%0A%24Export%20%3D%20%22%24dir%5CTeamsHistory%5C%24Team-%24channelDisplayName%22%0A%0ANew-Item%20-ItemType%20Directory%20-Path%20%24Export%20-ErrorAction%20Ignore%0A%24resultHtml%20%7C%20Out-File%20%24Export%5C%24Team-%24channelDisplayName-%24Date.html%0A%0AWrite-Host%20%22%0A%0A%22%0AWrite-Host%20%22Messages%20from%20the%22%20-NoNewline%0AWrite-Host%20%22%20%24(%24Team)%22%20-NoNewline%20-ForegroundColor%20Yellow%0AWrite-Host%20%22%20team%20and%22%20-NoNewline%0AWrite-Host%20%22%20%24(%24channelDisplayName)%22%20-NoNewline%20-ForegroundColor%20Yellow%0AWrite-Host%20%22%20channel%20were%20generated%20and%20saved%20to%20the%22%20-NoNewline%0AWrite-Host%20%22%20%24(%24Export)%22%20-NoNewline%20-ForegroundColor%20Yellow%0AWrite-Host%20%22%20as%20a%22%20-NoNewline%0AWrite-Host%20%22%20%24(%24Team)-%24(%24channelDisplayName)-%24(%24Date).html%22%20-NoNewline%20-ForegroundColor%20Yellow%0AWrite-Host%20%22%20file.%22%0AWrite-Host%20%22%22%0A%0A%0A%7D%23end%20foreach%20(%24Channel%20in%20%24Channels)%3C%2FCODE%3E%3C%2FPRE%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-3406320%22%20slang%3D%22en-US%22%3ERe%3A%20Unable%20to%20Export%20All%20Channels%20Conversations%20from%20a%20Team%20using%20Graph-PowerShell%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-3406320%22%20slang%3D%22en-US%22%3EIt%20worked%20like%20a%20charm.%20Thank%20you%20so%20much.%3C%2FLINGO-BODY%3E
Occasional Contributor

I'm using the below script to export channel conversations. It works fine per channel. But I want to be able to export all channel conversations in a Team. I tried using ForEach ($Channel in $Channels) but it's not working. Can someone help please. Credit to PSGuy for the original script: https://www.psguy.eu/how-to-export-ms-teams-chat-to-html-file-for-backup/

[CmdletBinding(DefaultParameterSetName='default')]
    param
    (
        [Parameter(ParameterSetName='Channel')]
        $Team,
        
        [Parameter(Mandatory=$false,ParameterSetName='default')]
        [Parameter(Mandatory=$true,ParameterSetName='Channel')]
        $Channel

        
    )
Write-Host "Exporting Team Chats Homie"

$scriptpath = $MyInvocation.MyCommand.Path
$dir = Split-Path $scriptpath

$Date = Get-Date -Format "MM-dd-yyyy-HHmm"
$clientId = "YourClientID"
$tenantName = "YourTenantName"
$clientSecret = "YourClientSecret"
$resource = "https://graph.microsoft.com/"

$ReqTokenBody = @{
    Grant_Type    = "Password"
    client_Id     = $clientID
    Client_Secret = $clientSecret
    Username      = 'YourTeamsAdmUserName'
    Password      = 'YourTeamsAdmPassword'
    Scope         = "https://graph.microsoft.com/.default"
} 
$TokenResponse = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$TenantName/oauth2/v2.0/token" -Method POST -Body $ReqTokenBody

#Getting all Groups
$apiUrl = "https://graph.microsoft.com/beta/groups"

$Data = Invoke-RestMethod -Headers @{Authorization = "Bearer $($TokenResponse.access_token)"} -Uri $apiUrl -Method Get -ErrorVariable RespErr
$Groups = ($Data | Select-Object Value).Value

if ($Team -eq $NULL){
Write-Host "You have" -NoNewline 
Write-Host " $($Groups.Count)" -ForegroundColor Yellow -NoNewline
Write-Host " teams."
Write-Host ""
Write-Host "Messages from which Team do you want to export to the HTML format?" -ForegroundColor Yellow
$Groups | FT DisplayName,Description
$Team = Read-Host "Type one of the Team (DisplayName)"
}

$TeamID = ($Groups | Where-Object {$_.displayname -eq "$($Team)"}).id


$apiUrl = "https://graph.microsoft.com/v1.0/teams/$TeamID/Channels"
$Data = Invoke-RestMethod -Headers @{Authorization = "Bearer $($TokenResponse.access_token)"} -Uri $apiUrl -Method Get
if ($Channel -eq $NULL){
Write-Host "You choose" -NoNewline
Write-Host " $($Team)" -ForegroundColor Yellow -NoNewline
Write-Host " Team."
Write-Host ""

$Channels = ($Data | Select-Object Value).Value
Write-Host "Messages from which Channel do you want to export to the HTML format?" -ForegroundColor Yellow
$Channels | FT DisplayName,Description
$Channel = Read-Host "Type one of the Channel(DisplayName)"
}

$ChannelID = (($Data | Select-Object Value).Value | Where-Object {$_.displayName -eq "$($Channel)"}).ID

$apiUrl = "https://graph.microsoft.com/beta/groups/$TeamID/members"
$Data = Invoke-RestMethod -Headers @{Authorization = "Bearer $($TokenResponse.access_token)"} -Uri $apiUrl -Method Get

class messageData
{
    [string]$dateTime
    [string]$from
    [string]$body
    
    messageData()
    {
        $this.dateTime = ""
        $this.from = ""
        $this.body = ""
    }
    
}

function parseMessage($Data) #returns resultset 
{
    $messages = ($Data | Select-Object Value).Value
    
    foreach ($message in $Messages)
    {
        $messageID = $message.id
        $messageSet = New-Object System.Collections.ArrayList;
        $result = New-object messageData
        
        #parse message
        if ($NULL -eq $message.from.user.displayName) {
            $result.dateTime = $message.createdDateTime
            $result.from = $message.from.application.displayName
        }
        else {
            $result.dateTime = $message.createdDateTime
            $result.from = $message.from.user.displayName
        }
        $bodyOut = ""
        if ($NULL -eq $message.summary) 
        {
            
            foreach ($attachment in $message.attachments)
            {
                
                $output = $attachment.content
                $output = $output.substring(14)
                $output = $output.substring(0,$output.length-4)
                
                $bodyOut = $bodyOut + $output
            }
        }
        else {
            $bodyOut = $message.summary;
        }
        
        $bodyOut = $bodyOut + $message.body.content
        $result.body = $bodyOut;
        
        $messageSet.Add($result)
    
        #parse replies
        $repliesURI = "https://graph.microsoft.com/beta/teams/" + $TeamID + "/channels/" + $ChannelID + "/messages/" + $messageID + "/replies?`$top100"
    
        $repliesResponse = Invoke-RestMethod -Method Get -Uri $repliesURI  -Headers @{Authorization = "Bearer $($TokenResponse.access_token)"}
        
        foreach ($reply in $repliesResponse.value ) 
        {
            $replyData = New-Object messageData
            
            if ($NULL -eq $reply.from.user.displayName) {
                $replyData.dateTime = $reply.createdDateTime
                $replyData.from = $reply.from.application.displayName
            }
            else {
                $replyData.dateTime = $reply.createdDateTime
                $replyData.from = $reply.from.user.displayName
            }
            $bodyOut = ""
            if ($NULL -eq $message.summary) 
            {
                foreach ($attachment in $reply.attachments)
                {
                    $output = $attachment.content
                    $output = $output.substring(14)
                    $output = $output.substring(0,$output.length-4)
                    
                    $bodyOut = $bodyOut + $output
                }
            }
            else {
                $bodyOut = $message.summary
            }
            
            $replyData.body = $bodyOut + $reply.body.content
            $messageSet.Add($replyData)
        }
        $resultList.Add($messageSet)
    }

    return
}

$TokenResponse = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$TenantName/oauth2/v2.0/token" -Method POST -Body $ReqTokenBody

$resultList = New-Object System.Collections.ArrayList;

$apiUrl = "https://graph.microsoft.com/beta/teams/$TeamID/channels/$ChannelID/messages?`$top=100"
$sourceData = Invoke-RestMethod -Headers @{Authorization = "Bearer $($TokenResponse.access_token)"} -Uri $apiUrl -Method Get
parseMessage($sourceData)
$nextLink = $sourceData.'@Odata.NextLink'
while ($NULL -ne $nextLink)
{
    $nextURL = $nextLink;
    $sourceData = Invoke-RestMethod -Headers @{Authorization = "Bearer $($TokenResponse.access_token)"} -Uri $nextURL -Method Get
    parseMessage($sourceData)
    $nextLink = $sourceData.'@Odata.NextLink'
}

$resultFieldSet = New-Object System.Collections.ArrayList
foreach($resultData in $resultList) {
    $resultFields = $resultData | Select-Object @{Name = 'DateTime'; Expression = {Get-Date -Date (($_).dateTime) -Format 'MM/dd/yyyy hh:mm:ss.fff tt'}}, @{Name = 'From'; Expression = {((($_).from))}}, @{Name = 'Message'; Expression = {(($_).body) -replace '<.*?>',''}}| Sort-Object DateTime
    $resultFieldSet.Add($resultFields)
}

$Header = @"
<style>
h1, h5, th { text-align: center; } 
table { margin: auto; font-family: Segoe UI; box-shadow: 10px 10px 5px #888; border: thin ridge grey; } 
th { background: #0046c3; color: #fff; max-width: 400px; padding: 5px 10px; } 
td { font-size: 11px; padding: 5px 20px; color: #000; } 
tr { background: #b8d1f3; } 
tr:nth-child(even) { background: #dae5f4; } 
tr:nth-child(odd) { background: #b8d1f3; }
</style>
"@

$count = 0
foreach ($resultCount in $resultList){
    $count = $count + $resultCount.Count
}

$body = "<body><b>Generated:</b> $(Get-Date -Format 'MM/dd/yyyy hh:mm tt') <br><br> <b>Team Name:</b> $($Team) <br> <b>Channel Name:</b> $($Channel) <br><br>" + "<b>number of messages:</b> " + $count + " <br><br>"
$body = $body + "</head>"


$resultHtml = ""
foreach ($resultFields in $resultFieldSet){
    $tempHtml = $resultFields | ConvertTo-Html -Head $header
    $resultHtml = $tempHtml + "<br>" + $resultHtml
}
$resultHtml = $body + "<br>" + $resultHtml

$Export = "$dir\TeamsHistory\$Team-$Channel"
New-Item -ItemType Directory -Path $Export -ErrorAction Ignore
$resultHtml | Out-File $Export\$Team-$Channel-$Date.html

Write-Host "

"
Write-Host "Messages from the" -NoNewline
Write-Host " $($Team)" -NoNewline -ForegroundColor Yellow
Write-Host " team and" -NoNewline
Write-Host " $($Channel)" -NoNewline -ForegroundColor Yellow
Write-Host " channel were generated and saved to the" -NoNewline
Write-Host " $($Export)" -NoNewline -ForegroundColor Yellow
Write-Host " as a" -NoNewline
Write-Host " $($Team)-$($Channel)-$($Date).html" -NoNewline -ForegroundColor Yellow
Write-Host " file."
Write-Host "

"
2 Replies

@AshMSport To export messages from all Channels within a team, you need to loop through the Channels. Here is a slightly modified script (All credit to original author you mentioned in your post). 

 

Ensure your app has  the required permissions.  For my test,  I gave the following permissions.  It may be more permissions than what is really needed. You can remove permissions one by one and test to determine the minimal permissions required.

VinayBhatia_0-1652991501795.png

 

 

 

 

 

[CmdletBinding(DefaultParameterSetName='default')]
    param
    (
        [Parameter(ParameterSetName='Channel')]
        $Team,
        
        [Parameter(Mandatory=$false,ParameterSetName='default')]
        [Parameter(Mandatory=$true,ParameterSetName='Channel')]
        $Channel

        
    )
Write-Host "Exporting Team Chats Homie"

$scriptpath = $MyInvocation.MyCommand.Path
$dir = Split-Path $scriptpath

$Date = Get-Date -Format "MM-dd-yyyy-HHmm"

#TODO: Update for your tenant 
$clientId = "XXXXXXX"
$tenantName = "YYYYYY"
$clientSecret = "ZZZZZZZ"
$resource = "https://graph.microsoft.com/"

class messageData
{
    [string]$dateTime
    [string]$from
    [string]$body
    
    messageData()
    {
        $this.dateTime = ""
        $this.from = ""
        $this.body = ""
    }
    
}

function parseMessage($Data) #returns resultset 
{
    $messages = ($Data | Select-Object Value).Value
    
    foreach ($message in $Messages)
    {
        $messageID = $message.id
        $messageSet = New-Object System.Collections.ArrayList;
        $result = New-object messageData
        
        #parse message
        if ($NULL -eq $message.from.user.displayName) {
            $result.dateTime = $message.createdDateTime
            $result.from = $message.from.application.displayName
        }
        else {
            $result.dateTime = $message.createdDateTime
            $result.from = $message.from.user.displayName
        }
        $bodyOut = ""
        if ($NULL -eq $message.summary) 
        {
            
            foreach ($attachment in $message.attachments)
            {
                
                $output = $attachment.content
                if ($output)
                {
                    $output = $output.substring(14)
                    $output = $output.substring(0,$output.length-4)
                }
                
                $bodyOut = $bodyOut + $output
            }
        }
        else {
            $bodyOut = $message.summary;
        }
        
        $bodyOut = $bodyOut + $message.body.content
        $result.body = $bodyOut;
        
        $messageSet.Add($result)
    
        #parse replies
        $repliesURI = "https://graph.microsoft.com/beta/teams/" + $TeamID + "/channels/" + $ChannelID + "/messages/" + $messageID + "/replies?`$top100"
    
        $repliesResponse = Invoke-RestMethod -Method Get -Uri $repliesURI  -Headers @{Authorization = "Bearer $($TokenResponse.access_token)"}
        
        foreach ($reply in $repliesResponse.value ) 
        {
            $replyData = New-Object messageData
            
            if ($NULL -eq $reply.from.user.displayName) {
                $replyData.dateTime = $reply.createdDateTime
                $replyData.from = $reply.from.application.displayName
            }
            else {
                $replyData.dateTime = $reply.createdDateTime
                $replyData.from = $reply.from.user.displayName
            }
            $bodyOut = ""
            if ($NULL -eq $message.summary) 
            {
                foreach ($attachment in $reply.attachments)
                {
                    $output = $attachment.content
                    if ($output)
                    {
                        $output = $output.substring(14)
                        $output = $output.substring(0,$output.length-4)
                    }
                    $bodyOut = $bodyOut + $output
                }
            }
            else {
                $bodyOut = $message.summary
            }
            
            $replyData.body = $bodyOut + $reply.body.content
            $messageSet.Add($replyData)
        }
        $resultList.Add($messageSet)
    }

    return
}

$ReqTokenBody = @{
    Grant_Type    = "Password"
    client_Id     = $clientID
    Client_Secret = $clientSecret

    #TODO: Update for your tenant 
    Username      = 'admin@XXXXXXXX.onmicrosoft.com'
    Password      = 'YYYYYYYYYY'
    Scope         = "https://graph.microsoft.com/.default"
} 
$TokenResponse = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$TenantName/oauth2/v2.0/token" -Method POST -Body $ReqTokenBody

#Getting all Groups
$apiUrl = "https://graph.microsoft.com/beta/groups"

$Data = Invoke-RestMethod -Headers @{Authorization = "Bearer $($TokenResponse.access_token)"} -Uri $apiUrl -Method Get -ErrorVariable RespErr
$Groups = ($Data | Select-Object Value).Value

if ($Team -eq $NULL){
Write-Host "You have" -NoNewline 
Write-Host " $($Groups.Count)" -ForegroundColor Yellow -NoNewline
Write-Host " teams."
Write-Host ""
Write-Host "Messages from which Team do you want to export to the HTML format?" -ForegroundColor Yellow
$Groups | FT DisplayName,Description
$Team = Read-Host "Type one of the Team (DisplayName)"
}

$TeamID = ($Groups | Where-Object {$_.displayname -eq "$($Team)"}).id


$apiUrl = "https://graph.microsoft.com/v1.0/teams/$TeamID/Channels"
$Data = Invoke-RestMethod -Headers @{Authorization = "Bearer $($TokenResponse.access_token)"} -Uri $apiUrl -Method Get
if ($Channel -eq $NULL){
Write-Host "You choose" -NoNewline
Write-Host " $($Team)" -ForegroundColor Yellow -NoNewline
Write-Host " Team."
Write-Host ""

$Channels = ($Data | Select-Object Value).Value
#Write-Host "Messages from which Channel do you want to export to the HTML format?" -ForegroundColor Yellow
#$Channels | FT DisplayName,Description
#$Channel = Read-Host "Type one of the Channel(DisplayName)"
}

foreach ($Channel in $Channels)
{

    #$ChannelID = (($Data | Select-Object Value).Value | Where-Object {$_.displayName -eq "$($Channel)"}).ID
    $ChannelID = $Channel.id
    Write-Host "Channel ID: " + $ChannelID

    #$apiUrl = "https://graph.microsoft.com/beta/groups/$TeamID/members"
    $apiUrl = "https://graph.microsoft.com/v1.0/groups/$TeamID/members"
    $Data = Invoke-RestMethod -Headers @{Authorization = "Bearer $($TokenResponse.access_token)"} -Uri $apiUrl -Method Get

    $TokenResponse = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$TenantName/oauth2/v2.0/token" -Method POST -Body $ReqTokenBody
    $resultList = New-Object System.Collections.ArrayList;

    #Correct URL with escape
    $apiUrl = "https://graph.microsoft.com/beta/teams/$TeamID/channels/$ChannelID/messages?`$top=100"
    Write-Host $apiUrl
    $sourceData = Invoke-RestMethod -Headers @{Authorization = "Bearer $($TokenResponse.access_token)"} -Uri $apiUrl -Method Get
    parseMessage($sourceData)
    $nextLink = $sourceData.'@Odata.NextLink'
    while ($NULL -ne $nextLink)
    {
    $nextURL = $nextLink;
    $sourceData = Invoke-RestMethod -Headers @{Authorization = "Bearer $($TokenResponse.access_token)"} -Uri $nextURL -Method Get
    parseMessage($sourceData)
    $nextLink = $sourceData.'@Odata.NextLink'
}



$resultFieldSet = New-Object System.Collections.ArrayList
foreach($resultData in $resultList) {
    $resultFields = $resultData | Select-Object @{Name = 'DateTime'; Expression = {Get-Date -Date (($_).dateTime) -Format 'MM/dd/yyyy hh:mm:ss.fff tt'}}, @{Name = 'From'; Expression = {((($_).from))}}, @{Name = 'Message'; Expression = {(($_).body) -replace '<.*?>',''}}| Sort-Object DateTime
    $resultFieldSet.Add($resultFields)
}

$Header = @"
<style>
h1, h5, th { text-align: center; } 
table { margin: auto; font-family: Segoe UI; box-shadow: 10px 10px 5px #888; border: thin ridge grey; } 
th { background: #0046c3; color: #fff; max-width: 400px; padding: 5px 10px; } 
td { font-size: 11px; padding: 5px 20px; color: #000; } 
tr { background: #b8d1f3; } 
tr:nth-child(even) { background: #dae5f4; } 
tr:nth-child(odd) { background: #b8d1f3; }
</style>
"@

$count = 0
foreach ($resultCount in $resultList){
    $count = $count + $resultCount.Count
}

$body = "<body><b>Generated:</b> $(Get-Date -Format 'MM/dd/yyyy hh:mm tt') <br><br> <b>Team Name:</b> $($Team) <br> <b>Channel Name:</b> $($Channel) <br><br>" + "<b>number of messages:</b> " + $count + " <br><br>"
$body = $body + "</head>"


$resultHtml = ""
foreach ($resultFields in $resultFieldSet){
    $tempHtml = $resultFields | ConvertTo-Html -Head $header
    $resultHtml = $tempHtml + "<br>" + $resultHtml
}
$resultHtml = $body + "<br>" + $resultHtml

$channelDisplayName = $Channel.displayName
$Export = "$dir\TeamsHistory\$Team-$channelDisplayName"

New-Item -ItemType Directory -Path $Export -ErrorAction Ignore
$resultHtml | Out-File $Export\$Team-$channelDisplayName-$Date.html

Write-Host "

"
Write-Host "Messages from the" -NoNewline
Write-Host " $($Team)" -NoNewline -ForegroundColor Yellow
Write-Host " team and" -NoNewline
Write-Host " $($channelDisplayName)" -NoNewline -ForegroundColor Yellow
Write-Host " channel were generated and saved to the" -NoNewline
Write-Host " $($Export)" -NoNewline -ForegroundColor Yellow
Write-Host " as a" -NoNewline
Write-Host " $($Team)-$($channelDisplayName)-$($Date).html" -NoNewline -ForegroundColor Yellow
Write-Host " file."
Write-Host ""


}#end foreach ($Channel in $Channels)

 

It worked like a charm. Thank you so much.