Exchange Environment Report v1.5.8 now available

The latest version of my Exchange Environment Report script is now available. In this version, updates are provided to better support Exchange 2013, along with a couple of additional new features:
  • Now correctly reports the Cumulative Update or Service Pack version for Exchange 2013.
  • Initial support for Hybrid Exchange Reporting of Office 365 and Exchange Online, with Remote Mailbox counts shown.
  • FQDNs used in Internal and External URLs, and AutoDiscover SCPs are collated and displayed on a per-site basis.
  • If defined, the CAS Array name is shown on a per-site basis.

Download the latest version of the Exchange Environment Report from the TechNet Scripting Gallery, and visit my EER page here.


129 thoughts on “Exchange Environment Report v1.5.8 now available

  1. Hi Steve,

    Found a bug in v1.5.8 where RollupLevels are compared for Exchange 2010(v14).
    String compare thinks 8 > 10 🙂
    Solved it by converting the strings to integers:
    if ([int]$tRU -ge [int]$RollupLevel) { $RollupLevel=$tRU; $RollupVersion=$tRUV }



  2. Steve,
    I am trying to run this script from a remote server. I am invoking a PSSession during the ‘# 1. Initial Startup’ section. This helps me avoid the error about not loading the Exchange Shell and the report is created but most of the report sections are empty. I end up with the Total server count, the #mailboxes in the Org, the server names, and the DAG name but nothing else. How can I modify your script to run from a remote server using an account with full permissions to AD and Exchange?

  3. Not giving Exchange Version Information for Exchange 2013 when running in Exchange 2010 SP3 RU2 and Exchange 2013 CU8 Coexisting environment. Need to fix it.

  4. Hi Steve,

    Great script.

    Is there any easy way to add which edition of Exchange is running ie. standard/enterprise for 2003/2007/2010/2013?

    I know you can get this via PS with the get-exchangeServer command


  5. Getting errors after running script on Exchange 2007 server 2008 Standard, SP2:

    Exception calling “Join” with “2” argument(s): “value cannot be null.
    Parameter name: value”
    At C:\admin\Get-ExchangeEnvironmentReport.ps1:567 char:42


    Any help would be greatly appreciated. Appears to be a great script, though.


    • Same error – something is returning null value!
      $ExtNames = [system.String]::Join(“,”,$ExtNames)

  6. Hi Steve,

    I’m running a Exchange 2013 CU7 DAG using mount points. The report is not reporting the correct free space for the mount points. Also the summaries at the top are not showing E2013 just the total number of servers and mailboxes.


    • Hi DavidS.

      A client of mine had this exact same problem, which I was able to resolve by updating some of the code.

      I have emailed Steve with the details, so hopefully, he will publish an update shortly.



    • Indeed it does not show Exchange 2013 CU version. Also I had to manually change row 800+802 in order to connect to our 2013 server (V14 > V15)

  7. Awesome report, is there a simple way to exclude a specific server or servers? We have a few that are used for testing purposes and it would be awesome to suppress them from the report so I can make my boss happier. Thanks!!!!!

  8. Pingback: Netrix LLC – Exchange 2013 PowerShell Scripts – A Practical Guide – Part 2

  9. HI all,

    Does anyone of you have any idea why the script is not counting my mailboxes? My environment is EX 2013 CU7 and Windows Server 2012 R2. I have 4 DB Servers and 4 CAS servers.
    All other information script shows me 🙂

  10. Hi,

    Script looks great
    can you please include incremental backup as column in your script.

    Nagarjun V

  11. Hi Stev,
    Nice script. I need your help, how to set your script with schedule? Example runing schedule script every 1 week. Thanks lot.

  12. Steve, I need your help and for the life of me I don’t know why this won’t work. I get all kinds of errors and don’t know what is wrong. I have copied everything exactly as you indicate and nothing. Please help and I would pay you to get this to work for me, I need it really bad.

      • Hi Gulab,

        I copied and pasted the script exactly and I put the file output location i.e. c:\report.html but the reports runs so fast I’m not able to capture all the messages. During the task there are a lot of red letters and I can’t read what they say.

        This is on a 2008 R2 server with Exchange 2007.

        Is there a way to capture all the task so I can send you the errors?


  13. Hi

    Run on Win2012 Exchange Management Shell output error

    A parameter cannot be found that matches parameter name ‘IncludePreExchange2010’.
    + CategoryInfo : InvalidArgument: (:) [Get-MailboxDatabase], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Get-MailboxDatabase
    + PSComputerName : MailboxServer


  14. Pingback: Netrix LLC – Exchange 2013 PowerShell Scripts – A Practical Guide – Part 2

  15. Pingback: Exchange 2013 PowerShell Scripts – A Practical Guide – Part 2 | Just A UC Guy

  16. Pingback: Exchange 2013 PowerShell Scripts – A Practical Guide | Just A UC Guy

  17. Boa Noite Steve,

    Eu tenho um servidor Exchange Server 2010 SP3 e ja esta com o Rollup 6 instalado.
    O Script esta no caminho correto [ C:\Program Files\Microsoft\Exchange Server\V14\Scripts ] e o arquivo HTML é gerado com sucesso.
    Ao abrir o arquivo HTML as informações dos campos [ Server, Database Name, Mailboxes, Av. Mailbox Size, DB Size e DB Whitespace ] não aparecem nada, mas as demais informações, tipo, Exchange Version, Roles Installed, etc, todas aparecem.
    Eu estou utilizando a versão V1.5.8, mas ja testei com todas versões disponiveis no site, e todas estao com o mesmo sintoma.

    Voce tem ideia do que poderia ser ?



  18. I see that having drive letters as well as mount points hasn’t been fixed in regards to free drive space – bummer…I really love this report. Is this any part of a bug list you are working on….or, is there a way I can manually fix your script to show correct numbers?

    • I fixed it by editing line 148 into

      if ($($Database.LogFolderPath.PathName +”\”) -eq $($Disk.Name))

      I have my Database pathname as H:\LOG1 and my disk name being reported as H:\ , H:\LOG1\ , H:\LOG2\ , etc
      This caused the script (when looking at the LogFolderPath H:\LOG1) to incorrectly target the H:\ drive which was first in the list, instead of continuing on to the H:\LOG1\ drive.

  19. This is a great script but for us, the one thing missing is an SCR status check to see if our Ex 2007 SCR copies are up to date. Would be great to see if you could add that as an option to the reports.

  20. I have tried this on several of our Exchange servers and keep receiving the same error below:

    You cannot call a method on a null-valued expression.
    At C:\scripts\Get-ExchangeEnvironmentReport.ps1:188 char:47
    + [long]$Size = $Database.DatabaseSize.ToBytes <<<< ()
    + CategoryInfo : InvalidOperation: (ToBytes:String) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

    You cannot call a method on a null-valued expression.
    At C:\scripts\Get-ExchangeEnvironmentReport.ps1:189 char:65
    + [long]$Whitespace = $Database.AvailableNewMailboxSpace.ToBytes <<<< ()
    + CategoryInfo : InvalidOperation: (ToBytes:String) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

  21. What kind of changes would need to be made to the script to export to excel and append with each change to chart growth?

  22. Steve, I’m getting an error on my Windows 2008 SP2 (not R2) / Exchange 2007 SP3 server. It seems to create a (partial?) report.html. When I use the email command line, the email never gets sent out. Maybe 1.5.6 would work better – is it still posted somewhere? Thoughts? Thanks 🙂

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

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

  23. Just wondering if this can be run as an Exchange view only admin?
    Does it make any changes or does it only use “get” cmdlets?

    I’m a paranoid contract worker, thanks!

  24. For the OCD amongst us I made a couple of modifications to sort Servers, DAGs, and DBs to make reading the report a bit easier.
    – Line 899: Added ” | Sort Site,AdminDisplayVersion,Identity”
    – Lines 917, 921, 923, 929: Added ” | Sort Identity”

    Note: I chose Identity over Name so that 2007 and earlier DBs sort correctly since the StorageGroup parameter/property isn’t available from Get-MailboxDatabase in the 2013 shell.

  25. Hi Steve,

    1.5.8 was reporting the wrong rollup versions for a couple of our 2007 servers, so I went back to 1.5.6 and it reported the correct versions. When I compared the code, I found just one difference, (line 356):

    1.5.8 line 356: if ($tRU -ge $RollupLevel) { $RollupLevel=$tRU; $RollupVersion=$tRUV }

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

    I added the “[int]” back to 1.5.8, and now the reported rollup versions are correct for all servers, 2007 and 2010.


  26. Great script Steve, thanks! We’ve got it running as a daily task here 🙂
    Feedback on v 1.5.8:
    – Thanks for fixing the CU issue for 2013 servers
    – Line 313: Spelling error ‘consitent’
    – Lines 567-8: Added a space to allow text to wrap correctly in table ::Join(“, “,$IntNames)
    – Line 572: Cosmetic only ”

  27. Pingback: Exchange Environment Report | Ivan Zini

  28. Great report Steve, thank you! Is it possible to have the report send to two addresses? I’d prefer not to create a separate DL for desired recipients.

    • Use this paramenter:

      -SendMail @(‘’,’’)


      • Sorry, I meant MailTo:

        -MailTo @(‘’,’’)

  29. Pingback: NeWay Technologies – Weekly Newsletter #81 – February 7, 2014 | NeWay

  30. Pingback: NeWay Technologies – Weekly Newsletter #81 – February 6, 2014 | NeWay

  31. one thing:

    in an environment with one single EX2007, the script only works, if there is more than one Database in the first storage group, if there i no one, the output of the html is only filled up to Mailboxes and EX-Versions.
    Is it possible to send the screenshots?


  32. Hello,

    in my E2010 Enviroment (2k8R2/PS2.0) i had to change the “Getting Database Info” Block a little bit:

    for ($i=0; $i -lt @($Databases).Count; $i++)
    $Database = _GetDB -Database @($Databases)[$i] -ExchangeEnvironment $ExchangeEnvironment -Mailboxes $Mailboxes -ArchiveMailboxes $ArchiveMailboxes -E2010 $E2010
    $DAGDB = $false
    for ($j=0; $j -lt $ExchangeEnvironment.DAGs.Count; $j++)
    if ($ExchangeEnvironment.DAGs[$j].Members -contains $Database.ActiveOwner)
    $ExchangeEnvironment.DAGs[$j].Databases += $Database
    if (!$DAGDB)
    $ExchangeEnvironment.NonDAGDatabases += $Database

      • Hi,
        without the explicit array definition $Database.count was always zero, so the whole block skipt and there was no Database info in the output.

        Without the second one, the script ran into an error:

        Object from type “Microsoft.Exchange.Data.Directory.SystemConfiguration.MailboxDatabase” can not be indexed.

        Again, $Databases was not treated as an array. With the definition @() all is well.


  33. Thanks for maintaining this script. We use it every single day to help manage our environment. Great stuff.

  34. Steve,
    Would you be able to add the following features in a future release?
    1. View DB and Log drive letters.
    2. List which databases are currently enabled for provisioning.


  35. Pingback: NeWay Technologies – Weekly Newsletter #80 – January 31, 2014 | NeWay

  36. Pingback: NeWay Technologies – Weekly Newsletter #80 – January 30, 2014 | NeWay

  37. Hi Steve

    I have tried running this from Powershell and the Exchange Management Shell and it gives me an error stating it cannot load the Exchange Management Shell?

    I am running this as a full admin.


  38. Good Steve,

    Previous version was having issue as soon as I had run on ems and the same was informed you too some time back.

    I just ran and it works as expected & Thanks

    Found out of 9, 1 mailbox servers it should the roll up is missing and not equal with other 8 servers, the team will get back to work – this is awesome 😛

    May be i will put at customers environment as scheduled task sending alert for exchange admins for a quick glance how exchange is doing in the environment 🙂

  39. Pingback: Generate Exchange Environment Reports using Powershell | Steve Goodman's Exchange & Office 365 Blog

Comments are closed.