Update: This script has moved to the PowerShell Gallery.  All future updates will be posted at: https://www.powershellgallery.com/packages/Get-UserHoldPolicies/

If you've ever wanted to be able to track down all of the policies and ways that a mailbox's data might be held, this might be the tool for you.  This script combines data from the Security & Compliance Center's retention and label policies, in-place holds, Exchange Online litigation hold, as well as legacy Exchange Online MRM policies.

This report can be exported to CSV for further manipulation.

For the updated companion blog page, see https://www.undocumented-features.com/2019/01/23/update-to-the-get-userholdpolicies-tool-2.

For previous updates, see https://www.undocumented-features.com/2018/05/15/update-to-the-get-userholdpolicies-tool/ and https://www.undocumented-features.com/2017/10/31/display-or-export-all-user-mailbox-holds/.


List holds applied to a user. 
This script will return holds applied to users through the mechanisms of: 
- Exchange Online in-place holds 
- Litigation hold 
- MRM policies with retention policy tags 
- Security & Compliance Center eDiscovery cases with holds 
- Security & Compliance Center retention policies 
In order to return data for eDiscovery cases, the account used to run 
the script must be a member of eDiscovery Administrators or be a member 
of every open case. 
.PARAMETER Credential 
Specify a PSCredential object for connecting to Exchange Online and the Security 
& Compliane Center. 
.PARAMETER ExcludeLegacyExchangePolicies 
Choose whether to exclude legacy MRM policies for Exchange Online mailboxes. If 
not specified, attempt to locate policies that have policy tags with retention  
enabled.  Legacy Exchange MRM policies don't actually have retention, per se, but 
they can be the source of unexpected behavior if content is being moved/deleted 
without a user's knowledge. 
.PARAMETER Identity 
Specify an individual user for retreiving hold policies. 
.\Get-UserHoldPolicies.ps1 -Identity AdeleV 
Displays all of the holds applied to user AdeleV. 
Get-Mailbox -Resultsize Unlimited | .\Get-UserHoldPolicies.ps1 
Displays all explicit holds applied to all mailboxes. 
Get-Mailbox -Resultsize Unlimited | .\Get-UserHoldPolicies.ps1 -IncludeInheritiedPolicies 
Displays all holds (explicit and inherited) applied to all mailboxes. 
Get-Mailbox -Resultsize Unlimited | .\Get-UserHoldPolicies.ps1 -OutputFile C:\Temp\UserHolds.csv 
Export all explicit holds applied to all mailboxes to CSV C:\Temp\UserHolds.csv 
(.\Get-UserHoldPolicies.ps1 -Identity AdeleV) -OutputFile C:\Temp\AdeleVHolds.csv 
Export all explicit holds applied to AdeleV to CSV C:\Temp\AdeleVHolds.csv 
Get-Mailbox AdeleV | .\Get-UserHoldPolicies.ps1 -IncludeInheritedPolicies 
Display all (including inherited) holds applied to AdeleV. 
$Holds = Get-Mailbox A* | .\Get-UserHoldPolicies.ps1 -IncludeInheritedPolicies 
Save all holds for users starting with A to $holds variable. 
2019-06-04    Added information for DelayHoldApplied 
2019-01-23    Added display info for excluded legacy policies and disposition after expiration. 
            Updated URL in Links. 
2018-05-15    Added capability to display global inherited policies. 
            Added OutputFile parameter. 
            Updated output for MRM policies to display object guid. 
2017-10-31    Initial release. 

2018-05-15 Added capability to display global inherited policies.

Added OutputFile parameter.

Updated output for MRM policies to display object guid.