Report-MailboxSizes.PS1
✉️ Exchange Online POWERSHELLRaport statystyk skrzynek mailowych (rozmiar, aktywnosc) przez Microsoft Graph — dane za 180 dni
Opis
Autor: Tony Redmond / office365itpros.com GitHub: https://github.com/12Knocksinna/Office365itpros/blob/master/Report-MailboxSizes.PS1 Nowoczesny skrypt korzystajacy z Microsoft Graph API i Exchange Online Management v3.
🕒 2026-04-13
📦 Źródło: 12knocksinna
skrypt.ps1
# Report-MailboxSizes.PS1
# Script to demonstrate how to report mailbox statistics using Graph usage data
# V1.0 20-Nov-2023
# https://github.com/12Knocksinna/Office365itpros/blob/master/Report-MailboxSizes.PS1
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
}
# An example script used to illustrate a concept. More information about the topic can be found in the Office 365 for IT Pros eBook https://gum.co/O365IT/
# and/or a relevant article on https://office365itpros.com or https://www.practical365.com. See our post about the Office 365 for IT Pros repository # https://office365itpros.com/office-365-github-repository/ for information about the scripts we write.
# Do not use our scripts in production until you are satisfied that the code meets the need of your organization. Never run any code downloaded from the Internet without
# first validating the code in a non-production environment.