From 7fb3643a5b7df347dfda53c439ba6af96c7d1219 Mon Sep 17 00:00:00 2001 From: AdminDroid <49208841+admindroid-community@users.noreply.github.com> Date: Fri, 6 Oct 2023 17:44:15 +0530 Subject: [PATCH] Export Mailbox Size Report Export Mailbox Size Report --- Mailbox Size Report/GetMailboxSizeReport.ps1 | 197 +++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 Mailbox Size Report/GetMailboxSizeReport.ps1 diff --git a/Mailbox Size Report/GetMailboxSizeReport.ps1 b/Mailbox Size Report/GetMailboxSizeReport.ps1 new file mode 100644 index 0000000..f20d1e2 --- /dev/null +++ b/Mailbox Size Report/GetMailboxSizeReport.ps1 @@ -0,0 +1,197 @@ +<# +============================================================================================= +Name: Microsoft 365 Mailbox Size Report +Description: This script exports Microsoft 365 mailbox size report to CSV +Version: 2.0 +Website: o365reports.com + +Script Highlights: +~~~~~~~~~~~~~~~~~ +1.The script uses modern authentication to connect to Exchange Online. +2.The script can be executed with MFA enabled account too. +3.Exports report results to CSV. +4.You can choose to either “export mailbox size of all mailboxes” or pass an input file to “get usage statistics of specific mailboxes” alone. +5.Allows to use filter to get user mailboxes’ size alone +6.Allows to use filter to get shared mailboxes’ size alone. +7.Automatically installs the EXO (Exchange Online) V2 module (if not installed already) upon your confirmation. +8.The script is scheduler friendly. I.e., Credential can be passed as a parameter instead of saving inside the script. + +For detailed Script execution: https://o365reports.com/2020/10/21/export-office-365-mailbox-size-report-using-powershell/ +============================================================================================ +#> +Param +( + [Parameter(Mandatory = $false)] + [switch]$MFA, + [switch]$SharedMBOnly, + [switch]$UserMBOnly, + [string]$MBNamesFile, + [string]$UserName, + [string]$Password +) + +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() +{ + #Check for EXO v2 module inatallation + $Module = Get-Module ExchangeOnlineManagement -ListAvailable + if($Module.count -eq 0) + { + Write-Host Exchange Online PowerShell V2 module is not available -ForegroundColor yellow + $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" + Install-Module ExchangeOnlineManagement -Repository PSGallery -AllowClobber -Force + } + else + { + Write-Host EXO V2 module is required to connect Exchange Online.Please install module using Install-Module ExchangeOnlineManagement cmdlet. + Exit + } + } + + #Connect Exchange Online with MFA + if($MFA.IsPresent) + { + Connect-ExchangeOnline + } + + #Authentication using non-MFA + else + { + #Storing credential in script for scheduling purpose/ Passing credential as parameter + if(($UserName -ne "") -and ($Password -ne "")) + { + $SecuredPassword = ConvertTo-SecureString -AsPlainText $Password -Force + $Credential = New-Object System.Management.Automation.PSCredential $UserName,$SecuredPassword + } + else + { + $Credential=Get-Credential -Credential $null + } + Connect-ExchangeOnline -Credential $Credential + } + + #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 + +