Cleanup unused Exchange 2007 mailboxes

I often use my orphaned home directory cleanup script at work, to recover unused space from our file and print clusters. So my manager recently suggested that I do something similar for Exchange. Knowing that the orphan folder cleanup utility is still my responsibility as the administrators are not too comfortable with running scripts, I decided to give this utility a nice GUI.
To generate the code for the forms, I used SAPIEN PrimalForms. What beautiful tool. Very short learning curve, and very, very powerful. When the form loads, it will get a list of all the Exchange mailbox servers using get-mailboxserver.
This excludes Exchange 2003 servers as get-mailboxstatistics does not work with legacy mailboxes. I may develop a solution for that later. The three query buttons (Disabled, Hidden, Stale) will perform the following actions respectively: Disabled – Find mailboxes linked to disabled AD accounts Hidden – Find mailboxes hidden from the address book.  Stale – Find mailboxes linked to accounts which have not logged on in the last 3 months.
This search may take a little time to complete and this button is not supported against Exchange 2003 servers. These queries will populate the listbox with the names of the mailboxes. Besides the “Export List” button, the Action buttons at the bottom will action only selected items.
You can select items using SHIFT or CTRL. Export List will create a text file containing your search results. Export PST will grant the current user Full Mailbox with Send As and Receive As permission, and then export the mailbox to the path specified. Rename will change the display name based on the query performed. For mailboxes found with the “Disabled” button the display name will be prefixed with “DISABLED-MBXCleaner-“, for “Hidden” with “HIDDEN-MBXCleaner-“ and so forth. Users previously renamed will be excluded from subsequent searches. The “Disable” action will remove Exchange Attributes without deleting the AD account. The mailbox will be removed when the retention time expires. Delete will remove the mailbox and AD account completely.
I have not had a chance to test the Delete button as I would need to submit a change control request before using the utility in our live environment. All of the Action buttons are set to –whatif mode by default. The “Go Hot” checkbox will activate the heavy hitters (Export PST; Rename; Disable and Delete) so you can safely test each button first before taking any action. The “Reserved” button, currently, does nothing. I plan to allow this button to read or build a custom search for users, either by Name or other criteria.
WARNING: This is a dangerous utility, and can wreck your Exchange system if you are not careful. Please test this in your test environment first, and adhere to your change control procedures before using this utility in the live environment. I take absolutely no responsibility for any damage caused by using this tool. The utility requires the Exchange Management shell, and if launched from a Vista / Windows 7 needs to be “Run as Administrator” The script can be downloaded from here:

6 thoughts on “Cleanup unused Exchange 2007 mailboxes”

  1. This is a great script. What would it take to add a button that would move them to a different mailbox Datastore? The reason i ask, when people leave our organization, we disable the AD account, hide the mailbox, and move the mailboxes to a separate Datastore. If we could have something like this automated with a form, this would be GREAT!!!

    Keep up the good work.


  2. Aaron,

    Thanks for the feedback. I can certainly explore that option when I have a little extra time.

    Thanks for the suggestion.


  3. Hi, i was wondering if you could help me..this is exactly what i need to do because we have over 200 users who have been disabled and their mailboxes hidden…I want to put them into PSTs and remove their mailbox. need to save space. when i try to run this script i get the following error:

    [PS] C:>.clean-exchange.ps1
    File C:clean-exchange.ps1 cannot be loaded. The file C:clean-exchange.ps1 is
    not digitally signed. The script will not execute on the system. Please see "ge
    t-help about_signing" for more details..
    At line:1 char:21
    + .clean-exchange.ps1 <<<<
    + CategoryInfo : NotSpecified: (:) [], PSSecurityException
    + FullyQualifiedErrorId : RuntimeException

    I unblocked the script but it still wont run… i am new to this so im sure im doing something wrong. Thanks for your help.

  4. Hi goof!

    Thanks for downloading the script. What is your execution policy currently set at?

    You can run the following command to determine what level it is currently set at:


    Also, you can mail me directly, at jeanlouw at gmail dot com, it makes troubleshooting problems quicker than posting on the blog.

  5. Hey,

    nice script. Worked like a charm, after setting the ExecutionPolicy to unrestricted.


  6. Hello Vahur,

    Thanks for downloading the script. I always appreciate feedback.

    I am glad the script helped you!

    Best Regards


Comments are closed.