Exchange 2010 - How to Monitor Mailbox Sizes

How to schedule a PowerShell script to automatically email a report listing user mailbox sizes.

Required Powershell Scripts

The following PowerShell script will list all mailboxes sorting by size (descending):

ExchGetMailboxSizes.ps1

Get-Mailbox -ResultSize Unlimited |
    Get-MailboxStatistics |
    Select DisplayName,StorageLimitStatus, `
        @{name="TotalItemSize (MB)"; `
            expression={[math]::Round(($_.TotalItemSize.ToString().Split("(")[1].Split(" ")[0].Replace(",","") / 1MB) ,2)} `
        }, `
       ItemCount |
    Sort "TotalItemSize (MB)" -Descending

Example Output

DisplayName  StorageLimitStatus  TotalItemSize (MB)  ItemCount
-----------  ------------------  ------------------  ---------
User 1               NoChecking            10942.95     123888
User 2               NoChecking            10307.82     122734
User 3               NoChecking            10105.58      86925
User 4               NoChecking             9746.91     162055

MailboxAlerts.ps1

This next script will send the output of the above script as an email:

$messageParameters = @{
    Subject = "[Exchange Report] Mailbox Sizes"
    Body = (.\ExchGetMailboxSizes.ps1 | Out-String)
    From = "your@yourdomain.com"
    To = "alerts@yourdomain.com"
    SmtpServer = "smtp.yourdomain.com"
}
Send-MailMessage @messageParameters

Now you can setup a scheduled task to run this script from your Exchange Server.

Creating a Scheduled Task

First up, copy both of the above scripts to a folder on a local disk of the Exchange Server. In the examples below I am assuming C:\Scripts.

Next, create a new Task from the Windows 2008 Task Scheduler. You should configure this task as a user who has Exchange Admin privileges.

Task Settings

General - Security Options

  • Name the task: e.g.: Weekly Mailbox Size Alerts
  • Select Run whether user is logged in or not (will require the user’s password to save the task)
  • Leave Do not store password unchecked
  • Check Run with highest privileges

Action Settings

  • Go to the Action tab and click New…

Mike Pfeiffer does a great job of explaining how to set up scheduled tasks for Exchange 2010 PowerShell Scripts. In summary, use the following settings:

Program/Script

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

Add Arguments (optional)

-version 2.0 -NonInteractive -WindowStyle Hidden -command ". 'C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1'; Connect-ExchangeServer -auto;c:\Scripts\MailboxAlerts.ps1"

Start in (optional)

C:\Scripts

Triggers

  • Setup a sensible schedule that works for you, e.g.: Weekly - Monday at 9am
  • Save the Task be clicking OK.
  • You will be prompted for your password at this stage - this is required so that the task can run when the user is logged off.

View comments.

more ...

Useful ActiveDirectory PowerShell Scripts

For anyone even remotely interested, I have uploaded a GIT repository of useful PowerShell scripts to handle common Active Directory tasks. You can find it here.

Scripting a method to easily remove or add a user from a list of Domain groups was the driver. Feel free to fork it and add your own stuff.

View comments.

more ...