Back to script library
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-ExchangeOnline
Connect-MgGraph -NoWelcome -Scopes Reports.Read.All

Run it

The main script. Copy it, or download the .ps1 and run it from your console.

Connect-ExchangeOnline
Connect-MgGraph -NoWelcome -Scopes Reports.Read.All
# Before doing anything, we need to make sure that the Graph returns non-obfuscated user data
$ObfuscatedReset = $False
If ((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.CSV
Get-MgReportMailboxUsageDetail -Period 'D180' -Outfile MailboxUsage.CSV
[array]$MailboxUsage = Import-CSV MailboxUsage.CSV
[array]$Mbx = Get-ExoMailbox -RecipientTypeDetails UserMailbox -ResultSize Unlimited
Write-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.UserPrincipalName
Name = $M.DisplayName
Items = $MailboxStats.'ItemCount'
Size = $MbxSize
LastActivity = $LastActivityDate
DaysSinceActivity = $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 necessary
If ($ObfuscatedReset -eq $True) {
$Parameters = @{ displayConcealedNames = $True }
Update-MgBetaAdminReportSetting -BodyParameter $Parameters
}
Attribution