Für den Exchange Reporter gibt es ein Update auf Version 3.14 mit einigen Bugfixes und Performance-Verbesserungen. Besonders in größeren Exchange-Umgebungen mit mehreren Servern sollte der Report jetzt deutlich schneller fertig sein.
Performance-Verbesserungen
Parallele Tracking-Log-Abfragen (mailreport.ps1)
Bisher wurden die Message Tracking Logs aller Exchange-Server sequenziell abgefragt. In einer Umgebung mit 4 Servern bedeutete das 8 aufeinanderfolgende Aufrufe (Send + Receive pro Server). Mit Version 3.14 läuft jede Server-Abfrage als separater PowerShell-Job parallel. Die Laufzeit reduziert sich damit auf die Dauer des langsamsten Servers statt der Summe aller Server.
# Vorher: sequenzielle Abfragen über alle Server
Get-TransportService | Get-MessageTrackingLog -EventId Send ...
Get-TransportService | Get-MessageTrackingLog -EventId Receive ...
# Jetzt: ein paralleler Job pro Server mit Fallback
$job = Start-Job -ScriptBlock $trackingLogJob -ArgumentList $server.Name, $Start, $End, ...
$null = $serverJobs | Wait-Job -Timeout 1800
Code-Sprache: PowerShell (powershell)
Für Server, die nicht innerhalb des Timeouts antworten oder fehlschlagen, gibt es einen Fallback auf sequenzielle Abfragen.
Postfach-Statistiken nur noch einmal laden (mbxreport.ps1)
Das Modul mbxreport.ps1 rief
Get-MailboxStatistics
bisher für jedes Postfach einzeln auf, in einer Umgebung mit 1.000 Postfächern also über 1.000 separate EMS-Aufrufe. Dazu kam, dass die Statistiken für verschiedene Bereiche des Reports (Top-Postfächer, Quota-Check, inaktive Postfächer) jeweils komplett neu geladen wurden.
Jetzt werden alle Statistiken einmalig über
Get-MailboxDatabase | Get-MailboxStatistics
geladen und per Hashtable-Lookup abgerufen:
# Einmaliges Laden aller Statistiken
$allStats = Get-MailboxDatabase | Get-MailboxStatistics -wa 0 -ea 0
# Hashtable für O(1)-Lookup im Quota-Check
$statsHash = @{}
foreach ($stat in $allStats) {
if ($stat.MailboxGuid) { $statsHash[$stat.MailboxGuid.ToString()] = $stat }
}
Code-Sprache: PowerShell (powershell)
Weitere Optimierungen
- dgreport.ps1: HashSet statt
Sort-Object | Group-Object | Compare-Objectfür die Erkennung ungenutzter Verteilergruppen.Get-DistributionGroupMemberprüft jetzt mit-ResultSize 1nur noch ob mindestens ein Mitglied vorhanden ist. - mailreport.ps1: Tagesstatistiken werden per Hashtable-Vorgruppierung berechnet statt mit wiederholten
Where-Object-Filtern über alle Mails.
Bugfixes
dgreport.ps1: Nur letzte Verteilergruppe wurde angezeigt
Im Report wurde bisher immer nur die letzte ungenutzte Verteilergruppe angezeigt, alle anderen wurden zwar verarbeitet, aber nicht ins HTML geschrieben. Die
New-HTMLTableLine
-Zeile stand versehentlich außerhalb der foreach-Schleife. Jetzt werden alle ungenutzten DLs korrekt ausgegeben.
dbreport.ps1: Falscher Parameter bei Get-MailboxDatabase
Die Postfachanzahl pro Datenbank wurde mit
Get-MailboxDatabase -database $name
abgefragt – einen
-Database
-Parameter besitzt dieser Cmdlet aber nicht. Der Aufruf schlug mit einem Parameterfehler fehl. Ersetzt durch den korrekten Aufruf:
$pf = (Get-Mailbox -Database $database.Name -ResultSize Unlimited).count
Code-Sprache: PowerShell (powershell)
mailreport.ps1: Tageswerte zeigten immer 0
In der täglichen Statistikschleife wurden Variablennamen verwendet, die nie befüllt wurden (
$daysendmails
statt
$DaySendMails
). Dadurch zeigten alle Tageswerte für Anzahl und Volumen immer 0.
Exchange SE und Exchange 2019: Fallback bei unbekannter Version
Wenn die Exchange-Version nicht erkannt werden kann – was bei Exchange SE oder neueren Build-Nummern vorkommen kann – bricht der Reporter jetzt nicht mehr mit „Wrong EMS Version“ ab. Stattdessen wird automatisch Exchange 2019 als Fallback gesetzt und eine gelbe Warnung ausgegeben. Der Report läuft damit weiter, und der Fehler wird zusätzlich ins ErrorLog geschrieben.
Den Download gibt es hier oder auf Github:
FrankysWeb/Exchange-Reporter auf GitHub

Im Errorlog gibt es Fehlermeldungen:
In „exchange-reporter\modules\rightsreport.ps1:35 Zeichen:221
+ … e „NT AUTHORITY\SELF“) -and -not ($_.User -like „NT-AUTORITÄT\SELBST …
+ ~
Schließende „)“ fehlt in einem Ausdruck.
In exchange-reporter\modules\rightsreport.ps1:35 Zeichen:65
+ … endas = Get-ADPermission $mailbox.DistinguishedName | where {($_.Exte …
+ ~
Die schließende „}“ fehlt im Anweisungsblock oder der Typdefinition.
In exchange-reporter\modules\rightsreport.ps1:8 Zeichen:2
+ {
+ ~
Die schließende „}“ fehlt im Anweisungsblock oder der Typdefinition.
Bei mir zeigt mailreport.ps1 immer noch überall 0 an !?
Bei mir läuft das Modul mailreport.ps1 auf einen Fehler:
The Wait-Job cmdlet cannot finish working, because one or more jobs are blocked waiting for user interaction. Process interactive job output by using the Receive-Job cmdlet, and then try again
Es wäre sehr hilfreich, wenn auch der Pfad zum ErrorLog in den Settings eingestellt werden könnte: ich verteile alle Skripte für unsere Exchange-Server per Git, und es ist schlecht, wenn dann in einem Repo-Verzeichnis lokal eine Datei angelegt wird… ;-)
dafür wurde die .gitignore-Datei erfunden…