2023-10-06 17:44:15 +05:30
<#
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
Name : Microsoft 365 Mailbox Size Report
Description : This script exports Microsoft 365 mailbox size report to CSV
2024-07-08 16:48:34 +05:30
Version : 3.0
2023-10-06 17:44:15 +05:30
Website : o365reports . com
Script Highlights :
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
2024-07-08 16:48:34 +05:30
1 . Exports mailbox size report for all mailboxes .
2 . Retrieves mailbox size for list of mailboxes ( import CSV )
3 . Allows to use filter to get user mailboxes ’ size alone
4 . Allows to use filter to get shared mailboxes ’ size alone .
5 . Automatically installs the EXO PowerShell module ( if not installed already ) upon your confirmation .
6 . The script can be executed with MFA enabled account too .
7 . Exports report results to CSV .
8 . The script is scheduler friendly .
9 . Supports certificate - based authentication ( CBA ) too .
2023-10-06 17:44:15 +05:30
For detailed Script execution : https : / / o365reports . com / 2020 / 10 / 21 / export-office - 365 -mailbox -size -report -using -powershell /
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
#>
Param
(
[ Parameter ( Mandatory = $false ) ]
[ switch ] $SharedMBOnly ,
[ switch ] $UserMBOnly ,
[ string ] $MBNamesFile ,
[ string ] $UserName ,
2024-07-08 16:48:34 +05:30
[ string ] $Password ,
[ string ] $Organization ,
[ string ] $ClientId ,
[ string ] $CertificateThumbprint
2023-10-06 17:44:15 +05:30
)
Function Get_MailboxSize
{
$Stats = Get-MailboxStatistics -Identity $UPN
$ItemCount = $Stats . ItemCount
$TotalItemSize = $Stats . TotalItemSize
$TotalItemSizeinBytes = $TotalItemSize – replace “ ( . * \ ( ) | , | [ a-z ] * \ ) ” , “ ”
$TotalSize = $stats . TotalItemSize . value -replace " \(.* " , " "
$DeletedItemCount = $Stats . DeletedItemCount
$TotalDeletedItemSize = $Stats . TotalDeletedItemSize
#Export result to csv
$Result = @ { 'Display Name' = $DisplayName ; 'User Principal Name' = $upn ; 'Mailbox Type' = $MailboxType ; 'Primary SMTP Address' = $PrimarySMTPAddress ; 'Archive Status' = $Archivestatus ; 'Item Count' = $ItemCount ; 'Total Size' = $TotalSize ; 'Total Size (Bytes)' = $TotalItemSizeinBytes ; 'Deleted Item Count' = $DeletedItemCount ; 'Deleted Item Size' = $TotalDeletedItemSize ; 'Issue Warning Quota' = $IssueWarningQuota ; 'Prohibit Send Quota' = $ProhibitSendQuota ; 'Prohibit send Receive Quota' = $ProhibitSendReceiveQuota }
$Results = New-Object PSObject -Property $Result
$Results | Select-Object 'Display Name' , 'User Principal Name' , 'Mailbox Type' , 'Primary SMTP Address' , 'Item Count' , 'Total Size' , 'Total Size (Bytes)' , 'Archive Status' , 'Deleted Item Count' , 'Deleted Item Size' , 'Issue Warning Quota' , 'Prohibit Send Quota' , 'Prohibit Send Receive Quota' | Export-Csv -Path $ExportCSV -Notype -Append
}
Function main ( )
{
2024-07-08 16:48:34 +05:30
#Check for EXO module inatallation
2023-10-06 17:44:15 +05:30
$Module = Get-Module ExchangeOnlineManagement -ListAvailable
if ( $Module . count -eq 0 )
{
2024-07-08 16:48:34 +05:30
Write-Host Exchange Online PowerShell module is not available -ForegroundColor yellow
2023-10-06 17:44:15 +05:30
$Confirm = Read-Host Are you sure you want to install module ? [ Y] Yes [N ] No
if ( $Confirm -match " [yY] " )
{
Write-host " Installing Exchange Online PowerShell module "
2024-07-08 16:48:34 +05:30
Install-Module ExchangeOnlineManagement -Repository PSGallery -AllowClobber -Force -Scope CurrentUser
Import-Module ExchangeOnlineManagement
2023-10-06 17:44:15 +05:30
}
else
{
2024-07-08 16:48:34 +05:30
Write-Host EXO module is required to connect Exchange Online . Please install module using Install-Module ExchangeOnlineManagement cmdlet .
2023-10-06 17:44:15 +05:30
Exit
}
}
2024-07-08 16:48:34 +05:30
Write-Host Connecting to Exchange Online . . .
#Storing credential in script for scheduling purpose/ Passing credential as parameter - Authentication using non-MFA account
if ( ( $UserName -ne " " ) -and ( $Password -ne " " ) )
2023-10-06 17:44:15 +05:30
{
2024-07-08 16:48:34 +05:30
$SecuredPassword = ConvertTo-SecureString -AsPlainText $Password -Force
$Credential = New-Object System . Management . Automation . PSCredential $UserName , $SecuredPassword
Connect-ExchangeOnline -Credential $Credential
}
elseif ( $Organization -ne " " -and $ClientId -ne " " -and $CertificateThumbprint -ne " " )
{
Connect-ExchangeOnline -AppId $ClientId -CertificateThumbprint $CertificateThumbprint -Organization $Organization -ShowBanner: $false
2023-10-06 17:44:15 +05:30
}
else
{
2024-07-08 16:48:34 +05:30
Connect-ExchangeOnline -ShowBanner: $false
2023-10-06 17:44:15 +05:30
}
#Output file declaration
$ExportCSV = " .\MailboxSizeReport_ $( ( Get-Date -format yyyy-MMM -dd -ddd ` hh-mm ` tt ) . ToString ( ) ) .csv "
$Result = " "
$Results = @ ( )
$MBCount = 0
$PrintedMBCount = 0
Write-Host Generating mailbox size report . . .
#Check for input file
if ( [ string ] $MBNamesFile -ne " " )
{
#We have an input file, read it into memory
$Mailboxes = @ ( )
$Mailboxes = Import-Csv -Header " MBIdentity " $MBNamesFile
foreach ( $item in $Mailboxes )
{
$MBDetails = Get-Mailbox -Identity $item . MBIdentity
$UPN = $MBDetails . UserPrincipalName
$MailboxType = $MBDetails . RecipientTypeDetails
$DisplayName = $MBDetails . DisplayName
$PrimarySMTPAddress = $MBDetails . PrimarySMTPAddress
$IssueWarningQuota = $MBDetails . IssueWarningQuota -replace " \(.* " , " "
$ProhibitSendQuota = $MBDetails . ProhibitSendQuota -replace " \(.* " , " "
$ProhibitSendReceiveQuota = $MBDetails . ProhibitSendReceiveQuota -replace " \(.* " , " "
#Check for archive enabled mailbox
if ( ( $MBDetails . ArchiveDatabase -eq $null ) -and ( $MBDetails . ArchiveDatabaseGuid -eq $MBDetails . ArchiveGuid ) )
{
$ArchiveStatus = " Disabled "
}
else
{
$ArchiveStatus = " Active "
}
$MBCount + +
Write-Progress -Activity " `n Processed mailbox count: $MBCount " ` n " Currently Processing: $DisplayName "
Get_MailboxSize
$PrintedMBCount + +
}
}
#Get all mailboxes from Office 365
else
{
Get-Mailbox -ResultSize Unlimited | foreach {
$UPN = $_ . UserPrincipalName
$Mailboxtype = $_ . RecipientTypeDetails
$DisplayName = $_ . DisplayName
$PrimarySMTPAddress = $_ . PrimarySMTPAddress
$IssueWarningQuota = $_ . IssueWarningQuota -replace " \(.* " , " "
$ProhibitSendQuota = $_ . ProhibitSendQuota -replace " \(.* " , " "
$ProhibitSendReceiveQuota = $_ . ProhibitSendReceiveQuota -replace " \(.* " , " "
$MBCount + +
Write-Progress -Activity " `n Processed mailbox count: $MBCount " ` n " Currently Processing: $DisplayName "
if ( $SharedMBOnly . IsPresent -and ( $Mailboxtype -ne " SharedMailbox " ) )
{
return
}
if ( $UserMBOnly . IsPresent -and ( $MailboxType -ne " UserMailbox " ) )
{
return
}
#Check for archive enabled mailbox
if ( ( $_ . ArchiveDatabase -eq $null ) -and ( $_ . ArchiveDatabaseGuid -eq $_ . ArchiveGuid ) )
{
$ArchiveStatus = " Disabled "
}
else
{
$ArchiveStatus = " Active "
}
Get_MailboxSize
$PrintedMBCount + +
}
}
#Open output file after execution
If ( $PrintedMBCount -eq 0 )
{
Write-Host No mailbox found
}
else
{
Write-Host ` nThe output file contains $PrintedMBCount mailboxes .
if ( ( Test-Path -Path $ExportCSV ) -eq " True " )
{
Write-Host ` n The Output file available in : -NoNewline -ForegroundColor Yellow
Write-Host $ExportCSV
$Prompt = New-Object -ComObject wscript . shell
$UserInput = $Prompt . popup ( " Do you want to open output file? " , `
0 , " Open Output File " , 4 )
If ( $UserInput -eq 6 )
{
Invoke-Item " $ExportCSV "
}
}
}
#Disconnect Exchange Online session
Disconnect-ExchangeOnline -Confirm: $false | Out-Null
Write-Host ` n ~ ~ Script prepared by AdminDroid Community ~ ~ ` n -ForegroundColor Green
Write-Host " ~~ Check out " -NoNewline -ForegroundColor Green ; Write-Host " admindroid.com " -ForegroundColor Yellow -NoNewline ; Write-Host " to get access to 1800+ Microsoft 365 reports. ~~ " -ForegroundColor Green ` n ` n
}
. main