Generate Exchange Environment Reports using Powershell

image

Update 16th September – V1.6.1 – Exchange 2016 support and various bug fixes (see here for more information)

Update 2nd February – V1.5.8 – Exchange 2013 CU and SP support, HTTPS and CAS array names shown, initial Office 365 Hybrid support (see here for more information)

Update 19th January – V1.5.6 – Exchange 2013 support and bug fixes (see here for more information)

Update 17th August – V1.5.4 – New features and bug fixes (see here for more information)

Update 24th July – V1.5.3 – Bug fixes (see here for more information)

Update 21th July – V1.5 – Re-write with new features including Exchange 2003 support for mixed environments and more detailed information (see here for more information)

Update 21th June – V1.1 – Bug fixes, Exchange 2007-only support in addition to 2010/2010+2007, and new features.

As an Exchange administrator, there’s times when it’s useful to have a visual, straightforward and concise document that gives you a good overview of your environment. Although with tools like Visio and Word you can make such a document, it’s hard to keep these documents up to date or use previous versions to track and check changes.

This script, inspired by the output of an Exchange TAP tool, aims to automatically generate a report that gives you an overview of your environment, Exchange 2003, 2007, 2010, 2013 and 2016 servers and database availability groups – in particular:

    • Total Servers per Exchange version & service pack
    • Total Mailboxes per Exchange version & service pack, plus Office 365 remote mailboxes
    • Totals for Exchange roles across the environment
    • A site-by-site breakdown for the following:
      • Mailboxes per site
      • HTTPS FQDNs used for Internal, External and SCP URLs
      • CAS array names
      • Exchange servers, version, update rollup and version, service level, highlighted installed roles, OS version and service pack

 

    • A breakdown of each Database Availability Group including:
        • DAG name, member count and member list
        • Database information such as
          • Name
          • Mailboxes per database and Average Size
          • Archive mailboxes per database and Average Size only shown if a DB includes Archive mailboxes
          • Database and whitespace size
          • Database and log disk free space percentage
          • Last full backup date/time (new) – only shown if at least one DAG DB has had a full backup
          • Circular Logging state (new) only shown if at least one DAG DB has circular logging enabled
          • Server hosting the active copy
          • List of servers hosting copies and copy count
    • A breakdown of Non-DAG databases including Exchange 2007 and 2003 DBs, including the database information above, along with Storage Group name (where applicable).

The script doesn’t support detailed information about Exchange 2007/2003 CCR/SCC clusters, but these are shown as ClusMBX in the output. At the moment, the script doesn’t show Public Folder information but if there is interest I can add extra features; and of course the source is provided should you wish to alter it to your own needs.

To be able to execute the script, you need to use the Exchange Management Shell (the latest version for your environment, with Powershell 2.0) and be able to get information about AD Sites, Exchange Servers, Mailboxes, Database Availability Groups and Databases. It uses WMI to retrieve OS information and detect Exchange 2007 clusters and calculate Exchange 2007 database size and Remote Registy calls to get Update Rollup information. A normal Exchange administrator should be able to perform these tasks.

Executing the script is straightforward – the only setting you need is to specify where to write the HTML file:

.\Get-ExchangeEnvironmentReport -HTMLReport c:\report.html

If you want it to email the results, the follow parameters are available to allow the report to be sent directly from the script:

.\Get-ExchangeEnvironmentReport -HTMLReport c:\report.html -SendMail:$true -MailFrom:you@example.com -MailTo:you@example.com -MailServer:smtp.example.com

As usual, the script is provided to download as-is without any warranties, at the bottom of this post. Comments and suggestions are always welcome.

Download Get-ExchangeEnvironmentReport.ps1

 

 

602 thoughts on “Generate Exchange Environment Reports using Powershell

  1. Running this in our test environment which is Exchange 2010 SP3 and using powershell 2.0 I’m getting:

    Exception calling “Join” with “2” argument(s): “Value cannot be null.
    Parameter name: value”
    At D:\Install\Get-ExchangeEnvironmentReport.ps1:585 char:42
    + $ExtNames = [system.String]::Join <<<< (",",$ExtNames)
    + CategoryInfo : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

    Using Version 1.6.1 of your script, any ideas?

    GREAT WORK.

    • Hey Guys, I’m running a hybrid with exchange 2010 & 2013 CU8. I kept on receive the error below and the report doesn’t show enough information. Can someone help?

      Cannot process argument transformation on parameter ‘Server’. Cannot convert value “removed” to type “Microsoft.Exchange.Configuration.Tasks.ServerIdParameter”. Error: “Cannot
      convert hashtable to an object of the following type: Microsoft.Exchange.Configuration.Tasks.ServerIdParameter. Hashtable-to-Object conversion is not supported in restricted
      language mode or a Data section.”
      + CategoryInfo : InvalidData: (:) [Get-OwaVirtualDirectory], ParameterBindin…mationException
      + FullyQualifiedErrorId : ParameterArgumentTransformationError,Get-OwaVirtualDirectory
      + PSComputerName : pbmbx01w.secure.protective.com

      Cannot process argument transformation on parameter ‘Server’. Cannot convert value “Removed” to type “Microsoft.Exchange.Configuration.Tasks.ServerIdParameter”. Error: “Cannot
      convert hashtable to an object of the following type: Microsoft.Exchange.Configuration.Tasks.ServerIdParameter. Hashtable-to-Object conversion is not supported in restricted
      language mode or a Data section.”
      + CategoryInfo : InvalidData: (:) [Get-WebServicesVirtualDirectory], ParameterBindin…mationException
      + FullyQualifiedErrorId : ParameterArgumentTransformationError,Get-WebServicesVirtualDirectory
      + PSComputerName : “removed”

  2. Pingback: New version of the Exchange Environment Report available now | Steve Goodman's Exchange & Office 365 Blog

  3. hi. thanks for the script. one question: i have two mbx in a DAG, the report would give the number of mailboxes only on one mbx server. the other mbx server have 0 mailboxes. why is that?

  4. Pingback: PowerShell Scripts for your Exchange and Office 365 Toolkit

  5. can I add CC in command?

    -SendMail:$true -MailFrom:you@example.com -MailTo:you@example.com -MailServer:smtp.example.com -ScheduleAs:DOMAIN\user

  6. Running on EXCH 2007 error as below –>

    Exception calling “Join” with “2” argument(s): “Value cannot be null.
    Parameter name: value”
    At C:\…\Get-ExchangeEnvironmentReport.ps1:567 char:42
    + $IntNames = [system.String]::Join <<<< (",",$IntNames)
    + CategoryInfo : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

  7. Hello,

    There is a bad display of echange 2010 SP3 RU 10 version if other RU has been applied before this one. To resolve this, just add [int] in front of variable compare on line 356 in v1.5.8 to evaluate them as numerical and not as string : if ([int]$tRU -ge [int]$RollupLevel) { $RollupLevel=$tRU; $RollupVersion=$tRUV }

  8. Dear, I have the problem in my Exchange 2007:

    Exception calling “Join” with “2” argument(s): “Value cannot be null.
    Parameter name: value”
    At C:\scripts\Get-ExchangeEnvironmentReport.ps1:567 char:42
    + $IntNames = [system.String]::Join <<<< (",",$IntNames)
    + CategoryInfo : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

  9. Pingback: Admin Admin Podcast #027 Show Notes – Nmaping it all up | The Admin Admin Podcast

  10. Hi, I\m running Exchange 2013 RU9 and script not showing exchange version. Please contact me i will send you screenshot. Thank you

  11. Hi Steve,

    This script is a life saver in our daily checks. Thanks for the great work.
    Having some issues with the latest Rollup 10 that we updated Exchange 2010 too. The script still thinks we are on RU9?

    How do I rectify this in the script?

    Also how would I sort and list the databases by db name instead of sorted by which server they are mounted on?

    Many thanks

    Wes

  12. Pingback: Top 5 Tips for Migrating to Office 365 - Essential Computing

  13. I’m running this script from a workstation with Exchange 2013 tools installed. I get errors, and while the HTML report is generated and the DAG information is displayed, there are no databases listed and no details about the databases

    • Hiya, it should work fine with Remote PowerShell (that’s what I assume when you say 2013 tools on a workstation) but it is designed to run on-server. What errors do you get? Do you have connectivity to all servers?

  14. Steve, Great Utility! Definitely useful for sizing when looking to upgrade, as well as current state snapshot.

    Any thoughts to adding a more detailed outputs. For instance giving advanced options to gather URI configurations, certificate, send/receive connector settings, etc?

    I might give it a go and add these things in as well either through separate powershell scripts or expand on this one.

    Thanks!

    • Hi Ken, I’ve thought about it – I wonder if a more detailed PDF report would be more appropriate if that were the case as it would be hard to show the info concisely

  15. Great script/information…if I just wanted Database Availability Group Members and not the other parts how would i do that?

    • Hi David, it is spit into commented sections at the end that generate HTML in functions (IE a named command that makes each table of data), so you should be able to delete the bits you want easily.

  16. I ran this manually and get the HTML file in the specified folder, but the email fails with this PS error message:

    Send-MailMessage : Service not available, closing transmission channel. The server response was: 4.3.2 Service not
    available

    • If you’re talking about seeing something like “Exchange 2010 SP3 UR8 v2” even though UR10 is installed, it’s a bug in the code with the way strings are evaluated. The following line fails because the string “10” is not greater than or equal to “8” even though the int values are:

      if ($tRU -ge $RollupLevel) { $RollupLevel=$tRU; $RollupVersion=$tRUV }

      change the line to:

      if ([int]$tRU -ge [int]$RollupLevel) { $RollupLevel=$tRU; $RollupVersion=$tRUV }

  17. Same here, Exchange 2013 CU and Exchange 2010 SP3, doesnt display the 2013 info, gives databases and everything else but not the version of exchange 2013.

  18. exchange 2010 SP3 RU4

    runs fine from powershell but when i manually run it from Task scheduler nothing happens. no errors from task

    • I’ve got this script working via a schedule task by using Steve’s command to create the initial scheduled task. Then went in to edit as follows:
      1. In the Program/script field: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
      2. In the Add arguments field: -command “. ‘C:\Program Files\Microsoft\Exchange Server\V15\bin\RemoteExchange.ps1’; Connect-ExchangeServer -auto; pushd C:\report; C:\report\Get-ExchangeEnvironmentReport.ps1 -HTMLReport C:\report\report.html -SendMail:$true -MailFrom:emailaddress -MailTo:emailaddress -MailServer:servername”

      Make the appropriate changes to add your email address and servername, and the location of the actual ExchangeEnvironmentReport.ps1 file.

    • I have a Task Scheduler that runs with the following:
      Security options: specify an account with permissions to run the scripts successfully, “run whether the user is logged on or not”
      Action: start a program
      Program/script: powershell
      Arguments: “-executionpolicy bypass -file c:\get-exchangeenvironmentreport.ps1 -HTMLReport c:\exchangeenvironmentreport.html” (no quotes)

      If you’ve configured the following policy, you will need to relax the setting:
      “Network access: Do not allow storage of passwords and credentials for network authentication”
      https://technet.microsoft.com/en-us/library/jj852185%28v=ws.10%29.aspx

Leave a Reply