So because this is a hidden folder using the new Graph API won't work (although you can actually get to the Items using the Graph API by searching) so using EWS is the best approach for now as it gives the most flexibility if you want to start playing around with this data programmatically.
Binding to the folder in EWS
You could use a few different ways to get the TeamChat folder the approach I've used is to make use of the Extended Property TeamChatFolderEntryId which is set on the Root Folder of a Mailbox. This contains the PR_EntryId of the Folder in question so once you convert this to an EWSId using the CovertId operation in EWS you can then bind directly to the folder. eg here's what the code looks like
$folderid= new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Root,$MailboxName) $TeamChatFolderEntryId = new-object Microsoft.Exchange.WebServices.Data.ExtendedPropertyDefinition([System.Guid]::Parse("{E49D64DA-9F3B-41AC-9684-C6E01F30CDFA}"), "TeamChatFolderEntryId", [Microsoft.Exchange.WebServices.Data.MapiPropertyType]::Binary); $psPropset= new-object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties) $psPropset.Add($TeamChatFolderEntryId) $RootFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$folderid,$psPropset) $FolderIdVal = $nullif ($RootFolder.TryGetProperty($TeamChatFolderEntryId,[ref]$FolderIdVal)) { $TeamChatFolderId= new-object Microsoft.Exchange.WebServices.Data.FolderId((ConvertId -HexId ([System.BitConverter]::ToString($FolderIdVal).Replace("-","")) -service $service)) $TeamChatFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$TeamChatFolderId); } }
I've put together a sample script module for accessing this folder using EWS that has a couple of different functions. The first Get-TeamChatStats accesses the folder and does some simple aggregation of folder and items properties including the ConversationId from the SkypeMessagePropertyBag to aggregated the number of conversations.
Get-TeamChatSkypeMessagePropertyBag enumerates all the Items in the TeamChat Folder and then outputs the SkypeMessagePropertyBag to the pipeline so you can then do any of you own aggregation or investigation etc eg
My current TeamChat data is pretty simple so there could be a few bugs in these scripts due to the limited data I had to run against. I've put the code up for these script on GitHub at https://github.com/gscales/Powershell-Scripts/blob/master/TeamChatStats.ps1 so fell free to log an issue you experience and I'll path the code.
4 comments:
Thanks Glen, this is really useful, your scripts worked great for me.
Do you know how to get the messages out of the actual team channels? Because of my industry/compliance rules we need an on-premises copy of all team chats. The only way I've been able to do so with EWS is through the EDiscovery API. It'd be cleaner to actually pull the items out of the mailboxes directly, but I can't figure out any way that's possible.
When I use the EDiscovery API it actually did work, but then one day multiple teams returned this error message from SearchMailboxes() and we can't figure out any way to fix this:
Preview search failed due to transient error 'MapiExceptionMultiMailboxSearchFailed: Multi Mailbox Search failed. (hr=0x80004005, ec=2802)
Ever seen that before in Office365? It's pretty vague and seems quite rare. Thanks for your blog!
I've not seen that error before, maybe a combination of the Graph API and EWS might be the best way of exporting the messages I've not really looked into that through.
After a lot of hunting it down it looks like it was a problem on the Microsoft side. I'm not sure what they did but it is working now.
Can confirm that the best (only?) way to export messages is to use Graph API to get a list of the teams and EWS to get the actual messages. It's clunky, much like Teams itself.
Office365 Mailbox using EWS blog post is very useful. thanks
Post a Comment