Entra / Microsoft 365 · Exchange Online
Report mailbox sizes
Script to demonstrate how to report mailbox statistics using Graph usage data.
Connect & set up
Run these once per session. All scopes are read-only unless the script makes changes.
Connect-ExchangeOnlineConnect-MgGraph -NoWelcome -Scopes Reports.Read.All
Run it
The main script. Copy it, or download the .ps1 and run it from your console.
Connect-ExchangeOnlineConnect-MgGraph -NoWelcome -Scopes Reports.Read.All# Before doing anything, we need to make sure that the Graph returns non-obfuscated user data$ObfuscatedReset = $FalseIf ((Get-MgBetaAdminReportSetting).DisplayConcealedNames -eq $True) {$Parameters = @{ displayConcealedNames = $False }Update-MgBetaAdminReportSetting -BodyParameter $Parameters$ObfuscatedReset = $True}Write-Host "Fetching Microsoft 365 usage data"Get-MgReportEmailActivityUserDetail -Period 'D180' -Outfile EmailActivity.CSV[array]$EmailActivityData = Import-CSV EmailActivity.CSVGet-MgReportMailboxUsageDetail -Period 'D180' -Outfile MailboxUsage.CSV[array]$MailboxUsage = Import-CSV MailboxUsage.CSV[array]$Mbx = Get-ExoMailbox -RecipientTypeDetails UserMailbox -ResultSize UnlimitedWrite-Host ("Processing {0} mailboxes..." -f $Mbx.count)$OutputReport = [System.Collections.Generic.List[Object]]::new()ForEach ($M in $Mbx) {$MbxSize = $Null$UserStats = $EmailActivityData | Where-Object {$_.'User Principal Name' -eq $M.UserPrincipalName}$MailboxStats = $MailboxUsage | Where-Object {$_.'User Principal Name' -eq $M.UserPrincipalName}If ([string]::IsNullOrWhiteSpace($MailboxStats.'Last Activity Date')) {$LastActivityDate = $Null$DaysSinceActivity = $Null} Else {$DaysSinceActivity = (New-TimeSpan $MailboxStats.'Last Activity Date').Days$LastActivityDate = Get-Date ($MailboxStats.'Last Activity Date') -format 'dd-MMM-yyyy'}[long]$MbxStorage = $MailboxStats.'Storage Used (Byte)'If ($MbxStorage -le 1GB) {$MailboxSize = [Math]::Round(($MbxStorage/1MB), 2)[string]$MbxSize = $MailboxSize.toString() + " MB"} Else {$MailboxSize = [Math]::Round(($MbxStorage/1GB), 2)[string]$MbxSize = $MailboxSize.toString() + " GB"}$ReportLine = [PSCustomObject]@{UPN = $M.UserPrincipalNameName = $M.DisplayNameItems = $MailboxStats.'ItemCount'Size = $MbxSizeLastActivity = $LastActivityDateDaysSinceActivity = $DaysSinceActivity'Send Count' = $UserStats.'Send Count''Receive Count' = $UserStats.'Receive Count'}$OutputReport.Add($ReportLine)}$OutputReport | Format-Table Name, UPN, Items, Size, LastActivity# Now reset the obfuscated user data setting if necessaryIf ($ObfuscatedReset -eq $True) {$Parameters = @{ displayConcealedNames = $True }Update-MgBetaAdminReportSetting -BodyParameter $Parameters}
Attribution
Author
Office365itpros