PSWinDocumentation.Exchange.psm1

Add-Type -TypeDefinition @"
    using System;
 
    namespace PSWinDocumentation
    {
        [Flags]
        public enum Exchange {
            // Clean On-Premises Exchange Data
            ExchangeUServers,
            ExchangeUDatabases,
            ExchangeUPublicFolderDatabase,
            ExchangeUMailboxes,
 
            // Prepared On-Premises Exchange Data
            ExchangeServers,
            ExchangeDatabasesBackup,
            ExchangeMailboxesStatistics
        }
    }
"@

function Get-WinExchangeInformation {
    [CmdletBinding()]
    param($TypesRequired)
    $Data = [ordered] @{}
    if ($TypesRequired -eq $null) {
        Write-Verbose 'Get-WinExchangeInformation - TypesRequired is null. Getting all Exchange types.'
        $TypesRequired = Get-Types -Types ([Exchange])
    }
    if (Find-TypesNeeded -TypesRequired $TypesRequired -TypesNeeded @([Exchange]::ExchangeUServers)) {$Data.ExchangeUServers = Get-ExchangeServer}
    if (Find-TypesNeeded -TypesRequired $TypesRequired -TypesNeeded @([Exchange]::ExchangeUDatabases)) {
        $Data.ExchangeUDatabases = Invoke-Command -ScriptBlock {$Command = @(Get-Command Get-MailboxDatabase)[0]
            if ($Command.Parameters.ContainsKey("IncludePreExchange2010")) {$Databases = Get-MailboxDatabase -Status -IncludePreExchange2010} elseif ($Command.Parameters.ContainsKey("IncludePreExchange2013")) {$Databases = Get-MailboxDatabase -Status -IncludePreExchange2013} else {$Databases = Get-MailboxDatabase -Status}
            return $Databases}
    }
    if (Find-TypesNeeded -TypesRequired $TypesRequired -TypesNeeded @([Exchange]::ExchangeUPublicFolderDatabase)) {
        $Data.ExchangeUPublicFolderDatabase = Invoke-Command -ScriptBlock {$Command = @(Get-Command Get-PublicFolderDatabase)[0]
            if ($Command.Parameters.ContainsKey("IncludePreExchange2010")) {$Databases = @(Get-PublicFolderDatabase -Status -IncludePreExchange2010)} else {$Databases = @(Get-PublicFolderDatabase -Status)}
            return $Databases}
    }
    if (Find-TypesNeeded -TypesRequired $TypesRequired -TypesNeeded @([Exchange]::ExchangeUMailboxes)) {
        $Data.ExchangeUMailboxes = Invoke-Command -ScriptBlock {$Mailboxes = Get-Mailbox -ResultSize Unlimited
            return $Mailboxes}
    }
    if (Find-TypesNeeded -TypesRequired $TypesRequired -TypesNeeded @([Exchange]::ExchangeServers)) {
        $Data.ExchangeServers = Invoke-Command -ScriptBlock {$Servers = @()
            foreach ($Server in $Data.ExchangeUServers) {
                $Servers += [PSCustomObject]@{Name = $Server.Name
                    Roles = $Server.ServerRole
                    Edition = $Server.Edition
                    Version = $Server.AdminDisplayVersion
                    Trial = $Server.IsExchangeTrialEdition
                    FQDN = $Server.FQDN
                }
            }
            return $Servers}
    }
    if (Find-TypesNeeded -TypesRequired $TypesRequired -TypesNeeded @([Exchange]::ExchangeDatabasesBackup)) {
        $Data.ExchangeDatabasesBackup = Invoke-Command -ScriptBlock {$Backups = @()
            foreach ($DB in $Data.ExchangeUDatabases) {
                $Backups += [PSCustomObject] @{Name = $DB.Name
                    Mounted = $DB.Mounted
                    LastFullBackup = if ($DB.LastFullbackup) {$DB.LastFullbackup.ToUniversalTime()} else {'N/A'}
                    LastIncrementalBackup = if ($DB.LastIncrementalBackup) {$DB.LastIncrementalBackup.ToUniversalTime()} else {'N/A'}
                    LastDifferentialBackup = if ($DB.LastDifferentialBackup) {$DB.LastDifferentialBackup.ToUniversalTime()} else {'N/A'}
                }
            }
            return $Backups}
    }
    if (Find-TypesNeeded -TypesRequired $TypesRequired -TypesNeeded @([Exchange]::ExchangeMailboxesStatistics)) {
        $Data.ExchangeMailboxesStatistics = Invoke-Command -ScriptBlock {$i = 0
            $ExchangeMailboxesStatistics = @()
            foreach ($Mailbox in $Data.ExchangeUMailboxes) {
                $i = $i + 1
                $PercentComplete = $i / $Data.ExchangeUMailboxes.Count * 100
                Write-Verbose "Collecting mailbox details Processing mailbox $i of $($Data.ExchangeUMailboxes.Count) - $Mailbox Percent Complete $PercentComplete"
                $ExchangeStatistics = $Mailbox | Get-MailboxStatistics | Select-Object TotalItemSize, TotalDeletedItemSize, ItemCount, LastLogonTime, LastLoggedOnUserAccount
                if ($Mailbox.ArchiveDatabase) {$ExchangeStatisticsArchive = $Mailbox | Get-MailboxStatistics -Archive | Select-Object TotalItemSize, TotalDeletedItemSize, ItemCount} else {$ExchangeStatisticsArchive = "n/a"}
                $ExchangeStatisticsInbox = Get-MailboxFolderStatistics $Mailbox.Identity -FolderScope Inbox | Where-Object {$_.FolderPath -eq "/Inbox"}
                $ExchangeStatisticsSent = Get-MailboxFolderStatistics $Mailbox.Identity -FolderScope SentItems | Where-Object {$_.FolderPath -eq "/Sent Items"}
                $ExchangeStatisticsDeleted = Get-MailboxFolderStatistics $Mailbox.Identity -FolderScope DeletedItems | Where-Object {$_.FolderPath -eq "/Deleted Items"}
                $ExchangeUser = Get-User $Mailbox.Identity
                $ActiveDirectoryUser = Get-ADUser $Mailbox.SamAccountName -Properties Enabled, AccountExpirationDate
                $ExchangeDatabasePrimary = $Data.ExchangeUMailboxes | Where-Object {$_.Name -eq $Mailbox.Database.Name}
                $ExchangeDatabaseArchive = $Data.ExchangeUMailboxes | Where-Object {$_.Name -eq $Mailbox.ArchiveDatabase.Name}
                $UserObject = [PSCustomObject]@{"DisplayName" = $Mailbox.DisplayName
                    "Mailbox Type" = $Mailbox.RecipientTypeDetails
                    "Mailbox Size" = $ExchangeStatistics.TotalItemSize.Value
                    "Mailbox Recoverable Item Size" = $ExchangeStatistics.TotalDeletedItemSize.Value
                    "Mailbox Items" = $ExchangeStatistics.ItemCount
                    "Audit Enabled" = $Mailbox.AuditEnabled
                    "Email Address Policy Enabled" = $Mailbox.EmailAddressPolicyEnabled
                    "Hidden From Address Lists" = $Mailbox.HiddenFromAddressListsEnabled
                    "Use Database Quota Defaults" = $Mailbox.UseDatabaseQuotaDefaults
                    "Inbox Folder Size" = $ExchangeStatisticsInbox.FolderandSubFolderSize
                    "Sent Items Folder Size" = $ExchangeStatisticsSent.FolderandSubFolderSize
                    "Deleted Items Folder Size" = $ExchangeStatisticsDeleted.FolderandSubFolderSize
                    "Total Archive Size" = if ($ExchangeStatisticsArchive -eq "n/a") {'n/a'} else {($ExchangeStatisticsArchive.TotalItemSize.Value + $ExchangeStatisticsArchive.TotalDeletedItemSize.Value)}
                    "Archive Size" = if ($ExchangeStatisticsArchive -eq "n/a") {'n/a'} else {$ExchangeStatisticsArchive.TotalItemSize.Value}
                    "Archive Deleted Item Size" = if ($ExchangeStatisticsArchive -eq "n/a") {'n/a'} else {$ExchangeStatisticsArchive.TotalDeletedItemSize.Value}
                    "Archive Items" = if ($ExchangeStatisticsArchive -eq "n/a") {'n/a'} else {$ExchangeStatisticsArchive.ItemCount}
                    "Issue Warning Quota" = if ($Mailbox.UseDatabaseQuotaDefaults) {$ExchangeDatabasePrimary.IssueWarningQuota} else {$Mailbox.IssueWarningQuota}
                    "Prohibit Send Quota" = if ($Mailbox.UseDatabaseQuotaDefaults) {$ExchangeDatabasePrimary.ProhibitSendQuota} else {$Mailbox.ProhibitSendQuota}
                    "Prohibit Send Receive Quota" = if ($Mailbox.UseDatabaseQuotaDefaults) {$ExchangeDatabasePrimary.ProhibitSendReceiveQuota} else {$Mailbox.ProhibitSendReceiveQuota}
                    "Account Enabled" = $ActiveDirectoryUser.Enabled
                    "Account Expires" = $ActiveDirectoryUser.AccountExpirationDate
                    "Last Mailbox Logon" = $ExchangeStatistics.LastLogonTime
                    "Last Logon By" = $ExchangeStatistics.LastLoggedOnUserAccount
                    "Primary Mailbox Database" = $Mailbox.Database
                    "Primary Server/DAG" = $ExchangeDatabasePrimary.MasterServerOrAvailabilityGroup
                    "Archive Mailbox Database" = $Mailbox.ArchiveDatabase
                    "Archive Server/DAG" = $ExchangeDatabaseArchive.MasterServerOrAvailabilityGroup
                    "Primary Email Address" = $Mailbox.PrimarySMTPAddress
                    "Organizational Unit" = $ExchangeUser.OrganizationalUnit
                    "Title" = $ExchangeUser.Title
                    "Department" = $ExchangeUser.Department
                    "Office" = $ExchangeUser.Office
                }
                $ExchangeMailboxesStatistics += $UserObject
            }
            return $ExchangeMailboxesStatistics}
    }
    return $Data
}
Export-ModuleMember -Function @('Get-WinExchangeInformation') -Alias @()