Entra / Microsoft 365 · Compliance & audit
Report compliance case holds
Generate a report about holds for eDiscovery cases.
Connect & set up
Run these once per session. All scopes are read-only unless the script makes changes.
Connect-ExchangeOnline -SkipLoadingCmdletHelp
Run it
The main script. Copy it, or download the .ps1 and run it from your console.
$Status = Get-ConnectionInformationIf (!($Status)) {Connect-ExchangeOnline -SkipLoadingCmdletHelp}# Connect to the compliance endpointConnect-IPPSession$CSVFile = "C:\temp\ComplianceHoldReport.CSV"# Find eDiscovery (standard) casesWrite-Host "Looking for eDiscovery cases"[array]$Cases = Get-ComplianceCase -CaseType eDiscovery[array]$PremiumCases = Get-ComplianceCase -CaseType AdvancedEdiscovery[int]$NumberofCases = $Cases.Count + $PremiumCases.CountIf ($NumberofCases -eq 0) {Write-Host "No eDiscovery cases found - exiting" ; break}Write-Host ("Found {0} eDiscovery (standard) cases and {1} eDiscovery Premium cases - checking for holds" -f $Cases.Count, $PremiumCases.Count)$Report = [System.Collections.Generic.List[Object]]::new()[int]$i = 0Write-Host "Processing standard cases"ForEach ($Case in $Cases) {$i++Write-Host ("Processing case {0} ({1}/{2})" -f $Case.Name, $i, $Cases.Count)[array]$CaseHolds = Get-CaseHoldPolicy -Case $Case.Identity -DistributionDetailIf ($CaseHolds) {ForEach ($CaseHold in $CaseHolds) {$CaseData = [PSCustomObject][Ordered]@{Name = $CaseHold.NameWorkload = $CaseHold.WorkloadEnabled = $CaseHold.EnabledMode = $CaseHold.ModeExchange = $CaseHold.ExchangeLocationSharePoint = $CaseHold.SharePointLocationPublicFolders = $CaseHold.PublicFolderLocationLastUpdate = $Rule.LastStatusUpdateTimeCaseType = 'Standard'}$Report.Add($CaseData)}}}[int]$i = 0Write-Host "Processing premium cases"ForEach ($Case in $PremiumCases) {$i++Write-Host ("Processing case {0} ({1}/{2})" -f $Case.Name, $i, $PremiumCases.Count)[array]$CaseHolds = Get-CaseHoldPolicy -Case $Case.Identity -DistributionDetailIf ($CaseHolds) {ForEach ($CaseHold in $CaseHolds) {$CaseData = [PSCustomObject][Ordered]@{Name = $CaseHold.NameWorkload = $CaseHold.WorkloadEnabled = $CaseHold.EnabledMode = $CaseHold.ModeExchange = $CaseHold.ExchangeLocationSharePoint = $CaseHold.SharePointLocationPublicFolders = $CaseHold.PublicFolderLocationLastUpdate = $CaseHold.LastStatusUpdateTimeCaseType = 'Premium'}$Report.Add($CaseData)}}}$Report | Select-Object Name, CaseType, Enabled, Mode, Exchange, SharePoint, LastUpdate | Out-GridView$Report | Export-CSV -NoTypeInformation $CSVFileWrite-Output ("The outfile is available in {0}" -f $CSVFile)
Attribution
Author
Office365itpros