I have adapted the “Modern Exchange Environment Check” from Satheshwaran Manoharan and for use on a Exchange Server 2016 environment.
Added to the already excelent script is the following
- Section Headers
- MailboxDB provisioning Status
- Whitespace check
- Exchange Log Dir Size
- Exchange Server Drive Space
- Mail Queue Checks
- House Keeping of created files
I feel that this is now a more complete report of the Exchange Server environment and the servers it runs upon.
I had toyed with adding the “10 largest user Mailboxes” to the account, but this takes a considerable time to run and would be better suited to ad-hoc reporting.
[CC lang=’powershell’]
# Requires -version 2 – Runs in Exchange Management Shell
# It displays Complete Exchange Environment Information in a modern HTML. It covers only Exchange 2010 or later.
# Set Working Dir
Push-Location (Split-Path -path $MyInvocation.MyCommand.Definition -Parent)
#Add Exchange Server snapin if not already loaded
if (!(Get-PSSnapin | where {$_.Name -eq “Microsoft.Exchange.Management.PowerShell.E2010”}))
{
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010 -ErrorAction SilentlyContinue
}
Write-Progress -Activity “Date” -status “Collecting Dates info”
$Date = Get-date -ErrorAction SilentlyContinue
# —– Settings —-
#Should the Script Open the HTML File locally on Finishing the script – Say Yes – if you wish to
$Openhtmllocally = “No”
Write-Progress -Activity “Email Settings” -status “Storing Email Settings”
## —– Email —-Fill in with your details
$EmailTo = “[email protected]”
$EmailFrom = “[email protected]”
$EmailSubject = “Exchange Status Report $Date”
$SmtpServer = “mail.yourdomain.com”
$Date = (Get-Date -format “dd-MM-yyyy”)
$Attachment = “.\output\ModernExchangeEnvironmentReport($date).htm”
# —– Settings —-
#Collecting Environment Information
Write-Progress -Activity “Exchange Servers” -status “Collecting Exchange Servers info”
$ExchangeServers = Get-ExchangeServer -ErrorAction SilentlyContinue
Write-Progress -Activity “Mailboxes” -status “Collecting Collecting Mailboxes info”
$mailboxes = Get-mailbox -ResultSize Unlimited -ErrorAction SilentlyContinue
Write-Progress -Activity “Databases” -status “Collecting Databases info”
$Databases = Get-mailboxdatabase -Status -ErrorAction SilentlyContinue
Write-Progress -Activity “DAG” -status “Collecting DAG info”
$DAGS = Get-DatabaseAvailabilityGroup -ErrorAction SilentlyContinue
Write-Progress -Activity “DistributionGroups” -status “Collecting DistributionGroup info”
$DistributionGroups = Get-DistributionGroup -ResultSize Unlimited -ErrorAction SilentlyContinue
Write-Progress -Activity “DynamicDistributionGroups” -status “Collecting DynamicDistributionGroup info”
$DynamicGroups = Get-DynamicDistributionGroup -ResultSize Unlimited -ErrorAction SilentlyContinue
Write-Progress -Activity “MailContacts” -status “Collecting MailContacts info”
$MailContacts = Get-MailContact -ResultSize Unlimited -ErrorAction SilentlyContinue
Write-Progress -Activity “Public Folder” -status “Collecting Public Folder Mailboxes info”
$PFmailboxes = Get-mailbox -PublicFolder -ResultSize Unlimited -ErrorAction SilentlyContinue
Write-Progress -Activity “SendConnectors” -status “Collecting SendConnectors info”
$SendConnectors = Get-SendConnector -ErrorAction SilentlyContinue
Write-Progress -Activity “Accepted Domains” -status “Collecting Accepted Domains info”
$AcceptedDomains = Get-AcceptedDomain -ErrorAction SilentlyContinue
Write-Progress -Activity “OrgAdmins” -status “Collecting OrgAdmins info”
$OrgAdmins = Get-RoleGroupMember “Organization Management” -ErrorAction SilentlyContinue
#Applying Initial CSS For the HTML
Write-Progress -Activity “ModernExchangeEnvironmentReport” -status “Applying CSS”
$head = @”
“@
#Create Tables in split so that users can remove or add tables easily.
$start = @”
Write-Progress -Activity “ModernExchangeEnvironmentReport” -status “Writing Enviroment Initial Info”
$Table1 =@”
Exchange Environment Report
No.Exchange Servers | No.Databases | No.Mailboxes | No.PublicFolder Mailboxes | No.DistributionGroups | No.DynamicGroups | No.Contacts | No.DAG | No.Domains | No.OrgAdmins | Date |
$($ExchangeServers.count) | $($Databases.count) | $($mailboxes.count) | $($PFmailboxes.count) | $($DistributionGroups.count) | $($DynamicGroups.count) | $($MailContacts.count) | $($DAG.count) | $($AcceptedDomains.count) | $($OrgAdmins.count) | $($Date) |
Exchange Servers | Roles | Edition | Site | Version | Operating System | SendConnectors Used |
$($server.name) | $($server.serverrole) | $($server.edition) | $($server.site.name) | $($server.AdmindisplayVersion -replace “version”,”) |
$($windows2012above = ((Get-WmiObject -ComputerName $server.name -class Win32_OperatingSystem -ErrorAction SilentlyContinue) | Where-Object{($_.Version -like “6.*”) -or ($_.version -like “10.*”) -and ($_.Version -notlike “6.1.*”) -and ($_.version -notlike “6.0.*”)}).version.count if ($windows2012above -eq 1) {(Get-CimInstance -ComputerName $server.name Win32_OperatingSystem).caption -replace “Microsoft Windows Server”,”}) |
$(($SendConnectors | Where-Object{$_.SourceTransportServers -match “$($server.name)”}).identity.name) |
“@
Write-Progress -Activity “Databases” -status “Writing Database info”
$Table3 =@”
Mailbox DB Stats
Mailbox Databases | Mounted | ContentIndex | DBSize | WhiteSpace | Mailboxes | Master Group | Database copies | MbxRetention.Days | ItemRetention.Days | CircularLogging | Provisioning Suspended | Provisioning Disabled | Last Full Backup |
$($Database.name) | $($Database.Mountedonserver) | $ContentIndexStatus | $dbsize | $dbWhitespace | $((get-mailbox -database $Database).count) | $($Database.MasterServerOrAvailabilityGroup) | $($Database.databasecopies.identity.name) | $($Database.MailboxRetention.days) | $($Database.DeletedItemRetention.days) | $($Database.CircularLoggingEnabled -replace “False”,”No” -replace “True”,”Yes”) | $($database.IsSuspendedFromProvisioning -replace “False”,”No” -replace “True”,”Yes”) | $($database.IsExcludedFromProvisioning -replace “False”,”No” -replace “True”,”Yes”) | $($database.lastfullbackup) |
“@
if($dags.count -ge 1)
{
Write-Progress -Activity “Dag” -status “Writing DaG info”
$Table4 =@”
DAG statistics
DAG Name | Member Servers | DAC Mode | Witness server | Witness Directory |
$($DAG.name) | $($dag.servers.name) | $($dag.DatacenterActivationMode) | $($dag.Witnessserver) | $($dag.WitnessDirectory) |
“@
Write-Progress -Activity “Dag” -status “Writing DaG Replication info”
$Table5 =@”
Server Statistics
Server | Check | Result | Error |
$(($replstatus).Server[$i]) | $(($replstatus).Check[$i]) | $($replstatus.Result[$i].value) | $(($replstatus).Error[$i]) |
“@
}
else
{
Write-Progress -Activity “Dag” -status “Skipping DaG – No DAG Found”
}
$MailqueueTb= @”
Mail Queues
Next Hop Domain | Status | Message Count | Freespace (GB) | #div_red’, ‘ | ‘ $MailQueues = $MailQueues -replace ‘ | #div_gre’, ‘ | ‘ Remove-Item $file $table6= @” Server Drive Space Statistics
|