Table of Contents
List Exchange Retention Tags Assigned to Folders
A reader wondered how they could create a report of folders in an Exchange Online mailbox to include the retention tag assigned to folders. Retention tags mean both mailbox records management (MRM) retention tags (Exchange legacy retention) and Microsoft 365 retention labels. The Managed Folder Assistant (MFA), the component responsible for retention processing of mailboxes, treats both types equally.
Although Microsoft would like customers to transition from Exchange MRM, the older implementation of retention tags still offers significant value that isn’t available in Microsoft 365. The major gaps in Microsoft 365 retention are the ability to move mailbox items to Exchange archive mailboxes and folder-level retention processing (using default folder tags or personal retention tags). You can transition most retention processing to Microsoft 365, but some elements of MRM retention are still required to use these two features. Microsoft tweaks Exchange MRM to make it behave more like Microsoft 365 retention, but the gap remains.
Getting Exchange Retention Tags from Folder Statistics
Our reader used the Get-ExoMailboxFolderStatistics cmdlet to retrieve details of mailbox folders. The DeletePolicy property is one of the properties fetched for each folder. This property stores the name of the retention tag (folder or personal) assigned to the folder. However, the property is blank if the folder is governed by the default delete and default archive tags defined in the MRM policy assigned to the mailbox. An MRM retention policy can have one default (move to) archive tag and one default delete tag. A policy doesn’t have to include default tags.
Script Steps to Report Exchange Retention Tags
To create a complete picture, I did the following:
Run Get-ExoMailboxFolderStatistics to fetch details of the default mailbox folders (like Inbox and Sent Items) plus user created folders (those likely to be exposed in a client for users to apply retention tags to).
$User = Read-Host "Enter name of user mailbox to examine" $User = Get-ExoMailbox -Identity $User -ErrorAction SilentlyContinue -Properties RetentionPolicy If (!($User)) { Write-Host ("Can't find mailbox for {0}" -f $User) ; break } Write-Host ("Checking mailbox folders for {0}" -f $User.DisplayName) [array]$MailboxFolders = Get-ExoMailboxFolderStatistics -Identity $User.UserPrincipalName | Where-Object {$_.FolderType -eq 'User created' -or $_.FolderType -eq 'Inbox' ` -or $_.FolderType -eq 'SentItems' -or $_FolderType -eq 'DeletedItems' -or $_.FolderType -eq 'JunkEMail' -or $_.FolderType -eq 'Contacts'} | Sort-Object Name
Unfortunately, Exchange Online mailboxes contain a heap of system-generated folders that are marked as user created. I remove these from the folder set. This is the lazy way to remove the folders.
$MailboxFolders = $MailboxFolders | Where-Object {$_.Name -ne 'Social Activity Notifications'} $MailboxFolders = $MailboxFolders | Where-Object {$_.Name -ne 'Clutter'} $MailboxFolders = $MailboxFolders | Where-Object {$_.Name -ne 'Quick Step Settings'} $MailboxFolders = $MailboxFolders | Where-Object {$_.Name -ne 'Suggested Contacts'}
The script then finds the MRM retention policy assigned to the mailbox and check if the policy contains any default delete or archive tags.
[array]$Tags = Get-RetentionPolicy $User.RetentionPolicy |Select-Object -ExpandProperty RetentionPolicyTagLinks [array]$DefaultTags = $Null ForEach ($Tag in $Tags) { If ((Get-RetentionPolicyTag -Identity $Tag | Select-Object -ExpandProperty Type) -eq 'All') { $DefaultTags += $Tag } }
After that, it’s a matter of running down through the folder set to find if the folder has a tag noted. If it does, we report that. If not, we report the default tags. Figure 1 shows the result.

You can download the script from GitHub.
Get Retention Tags for Individual Messages
There’s no obvious way to get the retention tag for individual messages with PowerShell. I asked Glen Scales, an MVP with long experience of developing against Exchange with EWS and the Graph, and he pointed me to a property called Single Value Extended Properties where Exchange stores the retention tag data for messages. Here’s some code to fetch the top 10 messages from the Inbox folder in a mailbox, including the retention data:
$Uri = "https://graph.microsoft.com/v1.0/users('tony.redmond@office365itpros.com')/MailFolders/Inbox/messages/?`$select=ReceivedDateTime,Sender,Subject,IsRead,InternetMessageId,parentFolderId,hasAttachments&`$Top=10&`$expand=SingleValueExtendedProperties(`$filter=(Id%20eq%20'String%20%7B403FC56B-CD30-47C5-86F8-EDE9E35A022B%7D%20Name%20ComplianceTag'))" $Data = Invoke-MgGraphRequest -Uri $Uri -Method Get
The “normal” properties are obvious in the output:
$data.value[0] Name Value ---- ----- @odata.etag W/"CQAAABYAAAA3tTkMTDKYRI6zB9VW59QNAAaLOoml" singleValueExtendedProperties {System.Collections.Hashtable} sender {emailAddress} parentFolderId AAMkADAzNzBmMzU0LTI3NTItNDQzNy04NzhkLWNmMGU1MzEwYThkNAAuAAAAAAB_7ILpFNx8TrktaK8VYWerAQBe9CuwLc2fTK7W4... isRead True id AAMkADAzNzBmMzU0LTI3NTItNDQzNy04NzhkLWNmMGU1MzEwYThkNABGAAAAAAB_7ILpFNx8TrktaK8VYWerBwBe9CuwLc2fTK7W4... receivedDateTime 27/07/2023 19:43:43 hasAttachments False subject Delivery estimate update for your Amazon.co.uk order #026-5997568-1550717 internetMessageId <0102018998e0cc4a-0fef8181-323f-4bb1-b22f-951a6840abe4-000000@eu-west-1.amazonses.com>
The retention tag is in a hash table in Single Value Extended Properties. We can see that the name of the retention tag is “Inbox 7 Year.”
$data.value[0].singleValueExtendedProperties Name Value ---- ----- value Inbox 7 Year id String {403fc56b-cd30-47c5-86f8-ede9e35a022b} Name ComplianceTag
Note: retention tag information is only present when an item has been stamped with a tag. Items under the control of a default retention tag (for deletion or archival) don’t have the retention information in their properties. When Managed Folder Assistant processes mailbox items, it applies the settings from default tags to items when if a more specific tag (folder or personal) is absent.
It is possible to fetch the information for every message in a mailbox and report its retention tag. Given the sheer number of messages in mailboxes, I’m not sure if the exercise would be useful in any way, but at least you know it can be done.
Learn more about how the Office 365 applications really work on an ongoing basis by subscribing to the Office 365 for IT Pros eBook. Our monthly updates keep subscribers informed about what’s important across the Office 365 ecosystem.
Small correction. Microsoft actually encourages customers to use MRM for the scenarios you described: https://learn.microsoft.com/en-us/purview/retention#use-retention-policies-and-retention-labels-instead-of-older-features
Hello Erica… Nice to see you hanging out here. It’s fair to say that it took quite a while before Microsoft acknowledged the value of MRM and adjusted the documentation. I hold to my position that Microsoft would like people to move off MRM to Microsoft 365 retention… Which is why I have the link to https://practical365.com/exchange-online-retention-m365-retention/ in the article.
Totally agree that it took us awhile to add it. That wasn’t really due to some strategy – one of our community members pointed out that clarity would be helpful to include this guidance in the documentation, so we added it. Really appreciate how much you help the community (including me) through your posts, and this was another great one!