Compliance Records Now Hidden in Non-IPM Section of Mailboxes
First reported by Jason Sherry, a very experienced ex-Exchange MVP, in a post to the Facebook Office 365 Technical Discussions group, Microsoft has changed the mailbox location where Teams stores its compliance records captured for personal chat and channel conversation messages. The change makes sense from Microsoft’s perspective even if it might cause some issues for tenants.
Uses of Teams Compliance Records
Originally introduced in April 2017, Teams compliance records are captured by the Microsoft 365 substrate and used for:
Retention processing. Retention policies act against the compliance records to allow tenants dictate how long Teams messages are retained.
eDiscovery and content searches. Because the compliance records are indexed along with other mailbox data, they are searchable and discoverable when tenants need to find information for investigations.
Communication compliance policies. The compliance records are scanned by agents to find potential violations of company communication policies such as threatening or abusive behavior.
Changing Storage for Teams Compliance Records
The compliance records are mail items stored in:
User mailboxes for personal and group chats, and channel conversations in private channels.
Group mailboxes for standard channel conversations.
When Microsoft enabled compliance capture for Teams, they choose to store the records in the Team Chat sub-folder of the Conversation History folder. The folder name varies according to user language, but the folder type is always TeamChat, which makes the folder easy to find. The choice of location was logical at the time because Skype for Business Online stored its conversation transcripts in the Conversation History folder. However, unlike Conversation History, the Team Chat folder has never been accessible to clients like Outlook or OWA.
What’s changing is that Microsoft has relocated storage to a folder called TeamsMessagesData in the non-IPMRoot part of mailboxes. This is a more logical part of the mailbox to host the folder because it’s where system data is stored. Exchange Online and Microsoft 365 apps stash lots of information in mailboxes which email clients don’t see.
The Get-ExoMailboxFolderStatistics cmdlet reveals information about the folder:
# Report number of items in TeamsMessagesData folder
Get-ExoMailboxFolderStatistics -Identity Kim.Akers -IncludeOldestAndNewestItems -Folderscope nonipmroot| ? {$_.FolderType -eq "TeamsMessagesData" } | Format-List Name, ItemsInFolder, FolderType, NewestItemReceiveDate
Name : TeamsMessagesData
ItemsInFolder : 65
FolderType : TeamsMessagesData
NewestItemReceivedDate : 12/10/2020 21:32:20
Microsoft made the change to move creation of new Teams compliance records around 5 October 2020. For now, Teams compliance records exist in both the old and new locations. The plan of record is that a background process will move records from the Team Chat folder to TeamsMessagesData. No timeframe is available for when this might happen.
Update November 6: In my tenant the old compliance records have been moved to the new location.
Microsoft didn’t communicate that the move would happen. In one respect, they had no need to do so through a notification posted in the Microsoft 365 message center. Compliance processing is a background task that tenants cannot control, so why should anyone need to know that a change happened?
The problem is that people use the presence of the Teams compliance records to know if teams are active. Although Microsoft would prefer tenants and ISVs like to use the Graph API to interact with Teams data(the User statistics script is an example of how to access Teams usage data with the Graph), in this instance, it’s easier to run a quick check using the Get-ExoMailboxFolderStatistics PowerShell cmdlet. You can still use the cmdlet to check the TeamsMessagesData folder, but access is slower because the FolderScope parameter doesn’t support a filter like the one available for Conversation History. Coders must therefore grab details of all non-IPM folders and then filter for TeamsMessagesData. As an example, the activity report script for Microsoft 365 Groups and Teams needed to be updated (V4.7 is now available).
Another unanticipated change is that backup products which purport to cover Teams by copying the compliance records along with other Exchange mailbox data must change their processing. They might not have realized that this problem exists and are therefore not copying the records today. All of which shows that you shouldn’t build a backup strategy based on data which might change. Then again, the lack of a scalable streaming API for Teams makes people do odd things.
A change like this which comes without warning is a great advertisement for an eBook. We cover Teams compliance processing in Chapter 12 and have updated the text for the November update for the Office 365 for IT Pros eBook. Do yourself a favor by benefiting from our work by subscribing to Office 365 for IT Pros.
Awesome article. Do you know if each channel in a Team has its own folder in the TeamsMessageData folder? Reason why is we have a requirement from our Legal team to place a hold only on the chat for a particular channel, not every channel in the team. Thanks for any help with this!
Hola, estuve reHello I was trying to run the script but it tells me that it can not load the powershell online exchange connection module (I have it installed without problems on my computer) and still does nothing… what can it be?
{"id":null,"mode":"button","open_style":"in_modal","currency_code":"EUR","currency_symbol":"\u20ac","currency_type":"decimal","blank_flag_url":"https:\/\/office365itpros.com\/wp-content\/plugins\/tip-jar-wp\/\/assets\/images\/flags\/blank.gif","flag_sprite_url":"https:\/\/office365itpros.com\/wp-content\/plugins\/tip-jar-wp\/\/assets\/images\/flags\/flags.png","default_amount":100,"top_media_type":"featured_image","featured_image_url":"https:\/\/office365itpros.com\/wp-content\/uploads\/2022\/11\/cover-141x200.jpg","featured_embed":"","header_media":null,"file_download_attachment_data":null,"recurring_options_enabled":true,"recurring_options":{"never":{"selected":true,"after_output":"One time only"},"weekly":{"selected":false,"after_output":"Every week"},"monthly":{"selected":false,"after_output":"Every month"},"yearly":{"selected":false,"after_output":"Every year"}},"strings":{"current_user_email":"","current_user_name":"","link_text":"Virtual Tip Jar","complete_payment_button_error_text":"Check info and try again","payment_verb":"Pay","payment_request_label":"Office 365 for IT Pros","form_has_an_error":"Please check and fix the errors above","general_server_error":"Something isn't working right at the moment. Please try again.","form_title":"Office 365 for IT Pros","form_subtitle":null,"currency_search_text":"Country or Currency here","other_payment_option":"Other payment option","manage_payments_button_text":"Manage your payments","thank_you_message":"Thank you for supporting the work of Office 365 for IT Pros!","payment_confirmation_title":"Office 365 for IT Pros","receipt_title":"Your Receipt","print_receipt":"Print Receipt","email_receipt":"Email Receipt","email_receipt_sending":"Sending receipt...","email_receipt_success":"Email receipt successfully sent","email_receipt_failed":"Email receipt failed to send. Please try again.","receipt_payee":"Paid to","receipt_statement_descriptor":"This will show up on your statement as","receipt_date":"Date","receipt_transaction_id":"Transaction ID","receipt_transaction_amount":"Amount","refund_payer":"Refund from","login":"Log in to manage your payments","manage_payments":"Manage Payments","transactions_title":"Your Transactions","transaction_title":"Transaction Receipt","transaction_period":"Plan Period","arrangements_title":"Your Plans","arrangement_title":"Manage Plan","arrangement_details":"Plan Details","arrangement_id_title":"Plan ID","arrangement_payment_method_title":"Payment Method","arrangement_amount_title":"Plan Amount","arrangement_renewal_title":"Next renewal date","arrangement_action_cancel":"Cancel Plan","arrangement_action_cant_cancel":"Cancelling is currently not available.","arrangement_action_cancel_double":"Are you sure you'd like to cancel?","arrangement_cancelling":"Cancelling Plan...","arrangement_cancelled":"Plan Cancelled","arrangement_failed_to_cancel":"Failed to cancel plan","back_to_plans":"\u2190 Back to Plans","update_payment_method_verb":"Update","sca_auth_description":"Your have a pending renewal payment which requires authorization.","sca_auth_verb":"Authorize renewal payment","sca_authing_verb":"Authorizing payment","sca_authed_verb":"Payment successfully authorized!","sca_auth_failed":"Unable to authorize! Please try again.","login_button_text":"Log in","login_form_has_an_error":"Please check and fix the errors above","uppercase_search":"Search","lowercase_search":"search","uppercase_page":"Page","lowercase_page":"page","uppercase_items":"Items","lowercase_items":"items","uppercase_per":"Per","lowercase_per":"per","uppercase_of":"Of","lowercase_of":"of","back":"Back to plans","zip_code_placeholder":"Zip\/Postal Code","download_file_button_text":"Download File","input_field_instructions":{"tip_amount":{"placeholder_text":"How much would you like to tip?","initial":{"instruction_type":"normal","instruction_message":"How much would you like to tip? Choose any currency."},"empty":{"instruction_type":"error","instruction_message":"How much would you like to tip? Choose any currency."},"invalid_curency":{"instruction_type":"error","instruction_message":"Please choose a valid currency."}},"recurring":{"placeholder_text":"Recurring","initial":{"instruction_type":"normal","instruction_message":"How often would you like to give this?"},"success":{"instruction_type":"success","instruction_message":"How often would you like to give this?"},"empty":{"instruction_type":"error","instruction_message":"How often would you like to give this?"}},"name":{"placeholder_text":"Name on Credit Card","initial":{"instruction_type":"normal","instruction_message":"Enter the name on your card."},"success":{"instruction_type":"success","instruction_message":"Enter the name on your card."},"empty":{"instruction_type":"error","instruction_message":"Please enter the name on your card."}},"privacy_policy":{"terms_title":"Terms and conditions","terms_body":null,"terms_show_text":"View Terms","terms_hide_text":"Hide Terms","initial":{"instruction_type":"normal","instruction_message":"I agree to the terms."},"unchecked":{"instruction_type":"error","instruction_message":"Please agree to the terms."},"checked":{"instruction_type":"success","instruction_message":"I agree to the terms."}},"email":{"placeholder_text":"Your email address","initial":{"instruction_type":"normal","instruction_message":"Enter your email address"},"success":{"instruction_type":"success","instruction_message":"Enter your email address"},"blank":{"instruction_type":"error","instruction_message":"Enter your email address"},"not_an_email_address":{"instruction_type":"error","instruction_message":"Make sure you have entered a valid email address"}},"note_with_tip":{"placeholder_text":"Your note here...","initial":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"empty":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"not_empty_initial":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"saving":{"instruction_type":"normal","instruction_message":"Saving note..."},"success":{"instruction_type":"success","instruction_message":"Note successfully saved!"},"error":{"instruction_type":"error","instruction_message":"Unable to save note note at this time. Please try again."}},"email_for_login_code":{"placeholder_text":"Your email address","initial":{"instruction_type":"normal","instruction_message":"Enter your email to log in."},"success":{"instruction_type":"success","instruction_message":"Enter your email to log in."},"blank":{"instruction_type":"error","instruction_message":"Enter your email to log in."},"empty":{"instruction_type":"error","instruction_message":"Enter your email to log in."}},"login_code":{"initial":{"instruction_type":"normal","instruction_message":"Check your email and enter the login code."},"success":{"instruction_type":"success","instruction_message":"Check your email and enter the login code."},"blank":{"instruction_type":"error","instruction_message":"Check your email and enter the login code."},"empty":{"instruction_type":"error","instruction_message":"Check your email and enter the login code."}},"stripe_all_in_one":{"initial":{"instruction_type":"normal","instruction_message":"Enter your credit card details here."},"empty":{"instruction_type":"error","instruction_message":"Enter your credit card details here."},"success":{"instruction_type":"normal","instruction_message":"Enter your credit card details here."},"invalid_number":{"instruction_type":"error","instruction_message":"The card number is not a valid credit card number."},"invalid_expiry_month":{"instruction_type":"error","instruction_message":"The card's expiration month is invalid."},"invalid_expiry_year":{"instruction_type":"error","instruction_message":"The card's expiration year is invalid."},"invalid_cvc":{"instruction_type":"error","instruction_message":"The card's security code is invalid."},"incorrect_number":{"instruction_type":"error","instruction_message":"The card number is incorrect."},"incomplete_number":{"instruction_type":"error","instruction_message":"The card number is incomplete."},"incomplete_cvc":{"instruction_type":"error","instruction_message":"The card's security code is incomplete."},"incomplete_expiry":{"instruction_type":"error","instruction_message":"The card's expiration date is incomplete."},"incomplete_zip":{"instruction_type":"error","instruction_message":"The card's zip code is incomplete."},"expired_card":{"instruction_type":"error","instruction_message":"The card has expired."},"incorrect_cvc":{"instruction_type":"error","instruction_message":"The card's security code is incorrect."},"incorrect_zip":{"instruction_type":"error","instruction_message":"The card's zip code failed validation."},"invalid_expiry_year_past":{"instruction_type":"error","instruction_message":"The card's expiration year is in the past"},"card_declined":{"instruction_type":"error","instruction_message":"The card was declined."},"missing":{"instruction_type":"error","instruction_message":"There is no card on a customer that is being charged."},"processing_error":{"instruction_type":"error","instruction_message":"An error occurred while processing the card."},"invalid_request_error":{"instruction_type":"error","instruction_message":"Unable to process this payment, please try again or use alternative method."},"invalid_sofort_country":{"instruction_type":"error","instruction_message":"The billing country is not accepted by SOFORT. Please try another country."}}}},"fetched_oembed_html":false}
Awesome article. Do you know if each channel in a Team has its own folder in the TeamsMessageData folder? Reason why is we have a requirement from our Legal team to place a hold only on the chat for a particular channel, not every channel in the team. Thanks for any help with this!
All the compliance records for all channels are combined in the single folder. You can’t apply a hold to a specific channel, just a team.
Hola, estuve reHello I was trying to run the script but it tells me that it can not load the powershell online exchange connection module (I have it installed without problems on my computer) and still does nothing… what can it be?
What’s the result of the Get-Module cmdlet? And which script are you trying to run?