ScriptRunner Blog

Integritätsprüfungen – Exchange Server 2019 Mailbox Health Check | ScriptRunner Blog

Geschrieben von Damian Scoles | 08.04.2022 08:45:42

Unternehmen migrieren seit geraumer Zeit ihre lokalen Exchange Server-Postfächer zu Exchange Online (EXO V2). Manchmal verlaufen diese Migrationen reibungslos, manchmal gibt es Probleme, aber oft können die Migrationen für die Administratoren reibungsloser gestaltet werden, je besser ihr Wissen über die Daten ist, die sie migrieren wollen. Wer als Administrator oder Consultant eine Migration durchführt, sollte auch im Blick haben, mit welchen Mitteln sich z.B. die Leistungsfähigkeit des Systems und damit die User Experience verbessern lässt. Vor der Migration sollte daher eine Analyse der Postfacheigenschaften (Mailbox Properties) eines Benutzers durchgeführt werden. Worauf müssen wir dabei achten?

Einige Dinge, die wir überprüfen können, sind große Postfächer und eine große Anzahl von Elementen in einzelnen Ordnern. Diese Postfacheigenschaften sind wichtig, da sie für den Endnutzer von Exchange und Exchange Online einen Unterschied ausmachen bezüglich der Leistungsfähigkeit des Systems. Beide können zu längeren Verzögerungen beim Herunterladen, Beantworten und Senden von Nachrichten führen. Microsoft bietet an dieser Stelle Empfehlungen, und wenn wir diese mit den Erfahrungen aus der Praxis kombinieren, können wir dem Benutzer ein besseres Ergebnis bieten.

Was sich bewährt hat, wenn es um die Leistung großer Postfächer geht:

  • Weniger als 100.000 Elemente pro Ordner
  • Weniger als 500 Ordner pro Postfach
  • Schnellere Hardware – SSD-Laufwerke (nicht defragmentieren), mehr RAM
  • Bei Verwendung eines neueren Outlook-Clients: einstellbarer Schieberegler für Cached-Mode-Clients
  • Mailbox archivieren – reduziert E-Mails im aktiven Postfach
  • E-Mails löschen

Wie wir sehen, gibt es Empfehlungen, die sich sowohl auf die Elemente in einem Ordner als auch auf die Größe des Postfachs beziehen. Lassen Sie uns in die PowerShell eintauchen, um Daten zu den Postfacheigenschaften einer Organisation zu extrahieren und die resultierenden Daten zu behandeln.

 

Große Anzahl von Objekten

Im Laufe der Zeit neigen Postfächer dazu, unübersichtlich zu werden, was zu einer hohen Anzahl von Objekten in Ordnern führt. Zwar gibt es in letzter Zeit einen Trend, den Posteingang zu entrümpeln und die Anzahl der E-Mails auf null zu reduzieren, doch ist dieser Trend nicht für alle Benutzer eines Unternehmens gleichermaßen umsetzbar und auch nicht für alle möglich. Wir stellen fest, dass es einige Benutzer gibt, die niemals E-Mails löschen und die versuchen, alle E-Mails für einen späteren Abruf und eine spätere Verwendung aufzubewahren, was zu einer großen Anzahl von Objekten führt, was wiederum zu einer verringerten Leistung führen kann. Mit Hilfe von PowerShell können wir diese Benutzer und ihre Ordner mit einer hohen Anzahl von Elementen identifizieren und mit ihnen zusammenzuarbeiten, um diese Elemente zu reduzieren und die Leistung ihres Postfachs in Outlook zu verbessern. Wie wird das gemacht? Tauchen wir als Nächstes in den Code ein.

PowerShell

Zunächst legen wir einige Basisvariablen fest, auf die wir später im Code verweisen können. Durch die Verwendung von Kommentaren verbessern wir die Lesbarkeit des Codes, sodass der Zweck jedes Codeabschnitts eindeutig identifiziert werden kann:


# Variables
$Counter = 1
$AllMaxFolders = $Null
$AllMaxFolders = @()
$FiftyKPlusFolders = $Null
$FiftyKPlusFolders = @()

Abrufen einer Liste von Postfächern:


# Mailboxes
$Mailboxes = Get-Mailbox -ResultSize Unlimited
$TotalCount = $Mailboxes.Count

** Die Verwendung von -ResultSize Unlimited ist in Umgebungen mit mehr als 1.000 Postfächern erforderlich. Wenn wir diese Option nicht verwenden, ruft das Cmdlet Get-Mailbox nur die ersten 1.000 Postfächer ab.

Mit einer Liste von Postfächern können wir nun jeden Ordner in jedem Postfach auf über 100.000 Elemente untersuchen.

Foreach ($Mailbox in $Mailboxes) {

Jede Schleife verfügt über eine Reihe von Variablen, die verwendet werden können. Einige dieser Variablen setzen Werte zurück, die in der Schleife verwendet werden, um die Datenintegrität zu gewährleisten. Andere dienen dazu, Werte zu extrahieren, die für die verarbeitete Mailbox benötigt werden:


# Variables
$Name = $Mailbox.Displayname
$PrimarySMTPAddress = [string]$Mailbox.PrimarySMTPAddress
$Items = $Null
$Stats = $Null
$MaxItems = 0
$MaxFolder = $Null
$Items = $True

Als Nächstes rufen wir die Ordnerinformationen für ein Postfach ab:

 $FolderStats = Get-MailboxFolderStatistics -Identity $PrimarySMTPAddress -ErrorAction STOP | Select-Object Name,ItemsInFolder,FolderPath }

In der folgenden Schleife wird jeder Ordner daraufhin überprüft, ob sich in ihm mehr als 50.000 Elemente befinden. Alle so ermittelten Ordner werden in der Variablen $FiftyKPlusFolders gespeichert.


Foreach ($FolderStat in $FolderStats) {

# Variables for this loop
$Number = $FolderStat.ItemsInFolder
$FolderPath = $FolderStat.FolderPath
$Result = $Null

If ($Number -gt 50000) {
$Result = "$Name,$Number,$FolderPath"
}
If ($Number -gt $MaxItems) {
$MaxItems = $Number
$MaxFolder = $FolderPath
} # Add folder with over 50K items to array
If ($Null -ne $Result) {
$FiftyKPlusFolders += $Result
}
}

 

Beispiel für die Dateiausgabe

Ausgabebeispiel aus einer Umgebung, die keine Objektordner mit mehr als 50.000 Elementen enthält:

------------------------------------------
Folder with over 50K items:
------------------------------------------

No folders were found to contain more than 50,000 items!

Findet das Skript mindestens ein Postfach mit vielen Objekten in einem E-Mail-Ordner, wird das Ergebnis in etwa so aussehen:

------------------------------------------
Folder with over 50K items:
------------------------------------------
Name,Items,FolderPath
Sam Anderson,71497,/Deleted Items
Eric Fornet,99917,/Deleted Items
Jennifer Dorsey,126569,/Inbox
Lory Kendall,88299,/Deleted Items
Anthony Cron,158919,/Inbox/Automated
Dave Smith,108682,/Inbox
Ronald Lee,109252,/Inbox/Monitoring

Dank dieses Reports kann zum Beispiel der Helpdesk die Besitzer dieser besonders großen Postfächer kontaktieren und diesen Nutzern helfen, die hohe Objektanzahl zu reduzieren. Im Beispiel oben sind das zuerst die Benutzer "Jennifer Dorsey" und "Anthony Cron" mit über 100.000 Objekten (Items), da diese Nutzer die Auswirkung am stärksten spüren werden. Danach können strukturiert die Nutzer mit weniger großen Postfächern kontaktiert werden.

 

Große Anzahl von Ordnern

Eine Prüfung, die auf den ersten Blick untypisch erscheint, ist die der Anzahl aller Ordner, die in einem Postfach vorhanden sind. Obwohl die meisten Benutzer eines Unternehmens eine überschaubare Menge an Ordnern nutzen, lohnt es sich dennoch die genaue Anzahl zu überprüfen, da Microsoft angibt, dass mehr als 500 Ordner zu einer schlechten Client-Leistung führen können. Ähnlich wie im vorherigen Codeausschnitt zur Ermittlung der Objektanzahl werden wir jedes Postfach in einer Foreach-Schleife überprüfen und die Ergebnisse zur späteren Analyse in einer CSV-Datei ablegen. Das wichtigste Cmdlet ist hier das Cmdlet Get-MailboxFolderStatistics, mit dem wir die Ordnerzahlen abrufen können

In diesem Szenario greifen wir zudem auf das Cmdlet Measure-Object zurück, mit dem wir die Ordner zählen können. Das Cmdlet Get-MailboxFolderStatistics listet alle Ordner auf, die in einem Postfach enthalten sind, und das Cmdlet Measure-Object zählt diese Ordner. Das Ergebnis könnte etwa so aussehen:

Get-MailboxFolderStatistics Damian | ft Name,FolderSize

Jede dieser Zeilen repräsentiert einen Ordner in einem Exchange-Postfach. Die Zeilenanzahl ergibt die Ordneranzahl eines Postfachs. Weiter zu PowerShell!

PowerShell


# Variables
$Destination = 'FolderReport.csv'
$Mailboxes = Get-ExOMailbox -ResultSize Unlimited

# Body
$Output = 'Mailbox,FolderCount' | Out-File -FilePath $Destination
Foreach ($Mailbox in $Mailboxes) {
$Folders = Get-MailboxFolderStatistics -Identity $Mailbox.PrimarySMTPAddress | Measure-Object | Select-Object -ExpandProperty Count
$MailboxName = $Mailbox.DisplayName
$Output = "$MailboxName,$Folders" | Out-File -FilePath $Destination -Append
}

Wir definieren eine Ausgabedatei und erfassen alle Postfächer in einer Umgebung in unserem Abschnitt Variable. Im Abschnitt Body überprüfen wir jedes Postfach, zählen die vorhandenen Ordner und exportieren dieses Ergebnis zur Analyse in eine CSV-Datei. Die Datei würde dann wie folgt aussehen:

Mailbox,FolderCount
#Safety,18
Amy A,63
Amy C,233
Amy D,908
Amy K,373
Amy M,65
Amy R,837
Amy S,54
Amy T,171
Amy W,356

Wir sehen, dass die Ordneranzahl sehr variiert, mit einer Anzahl von 18 bis 908 Ordnern. Wir konzentrieren uns auf diejenigen mit über 500 und reduzieren unser Ergebnis, indem wir eine Abfrage wie diese einfügen:


If ($Folders -gt 500) {
$MailboxName = $Mailbox.DisplayName
$Output = "$MailboxName,$Folders" | Out-File -FilePath $Destination -Append
}

Damit werden nur Postfächer, die über 500 Ordner enthalten, in unsere Ergebnisdatei exportiert.

Große Postfächer (und Archive)

Nachdem wir nun die Anzahl großer Objekte und Ordner untersucht haben, können wir auch große Postfächer und ihre Archive als Teil unserer Analyse von Postfächern in einer Umgebung untersuchen. In diesem Fall werden wir uns größere Postfächer ansehen, bei denen es Probleme mit der Migration geben könnte, insbesondere Postfächer mit einer Größe von über 75 GB. 75 GB ist ein Richtwert, der als Ausgangspunkt für die Analyse von Postfachgrößen und die Untersuchung des Potenzials für Leistungs- und Migrationsprobleme dient. Bei der Abfrage von Postfächern können wir also all die ermitteln, die diese Größe erreichen, und wir können auch die Postfächer identifizieren, die zwischen 75 und 100 GB groß oder diejenigen, die größer als 100 GB sind:

PowerShell

Mithilfe des folgenden Codeausschnitts ermitteln wir zunächst alle Postfächer und deren Größe:

 
$Mailboxes = Get-Mailbox -ResultSize Unlimited
$OutputStat = @()
Foreach ($Mailbox in $Mailboxes) {
$UPN = $Mailbox.SamAccountName
$MailboxStatistics = Get-MailboxStatistics $UPN | Select-Object DisplayName,@{expression = { $_.TotalItemSize.Value.ToMB()} ; label="MailboxSize"}
$OutputStat += $MailboxStatistics
}
$OutputStat | Sort MailboxSize

Wir möchten diesen Codeabschnitt weiter verbessern und fügen daher am Ende zusätzliche Codezeilen ein, um die Postfachgrößen aufzuschlüsseln. Die Variable $MailboxStatistics speichert die Größe des Postfachs in MB. Um Postfächer zu ermitteln, die größer als 75 GB sind, müssen wir also sicherstellen, dass der Wert der Variable $ MailboxStatistics während der Abfrage 75.000 übersteigt.


# Variables
$Destination = 'LargeMailboxes.csv'
$Mailboxes = Get-Mailbox -ResultSize Unlimited
$Over75GB = @()
$Over100GB = @()

Foreach ($Mailbox in $Mailboxes) {
$UPN = $Mailbox.SamAccountName
$MailboxStatistics = Get-MailboxStatistics $UPN | Select-Object DisplayName,@{expression = { $_.TotalItemSize.Value.ToMB()} ; label="MailboxSize"}

#Tier 1 and 2 Identification
If ($MailboxStatistics.MailboxSize -gt 75000) {
If ($MailboxStatistics.MailboxSize -gt 100000) {
$Over100GB += $MailboxStatistics
} Else {
$Over75GB += $MailboxStatistics
}
}
}
# Output findings to Output File
$Output = "Mailboxes between 75 and 100 GB:" | Out-File -FilePath $Destination
$Over75GB | Out-File -FilePath $Destination -Append
$Output = "Mailboxes over 100 GB:" | Out-File -FilePath $Destination -Append
$Over100GB | Out-File -FilePath $Destination -Append

 

Beispiel einer Ausgabedatei


Mailboxes between 75 and 100 GB:

DisplayName TotalItemSize
----------- -------------
Nick Smarth 82881.44
Sarah Johnson 93458.09

Mailboxes over 100 GB:

DisplayName TotalItemSize
----------- -------------
Damian Scoles 108520.78

Mithilfe dieses Reports erhalten wir eine Übersicht aller Benutzer, mit denen wir aufgrund der Postfachgröße in Kontakt treten sollten, um die Größe ihrer Postfächer zu reduzieren. Der Vorgang für Archivpostfächer ist weitgehend identisch. Die einzige erforderliche Änderung besteht darin, dem Cmdlet Get-Mailbox die Option "-Archive" hinzuzufügen. Der Rest des Codes läuft genauso ab und wird für alle Archivpostfächer, die ein Endbenutzer hat, ausgeführt.

 

Fazit

PowerShell beweist wieder mal, dass es ein sehr praktisches und leistungsstarkes Tool ist, das zur Identifizierung potenzieller Probleme, die in einer Exchange Server-Umgebung behoben werden müssen, verwendet werden kann. PowerShell ermöglicht die Identifizierung von Postfächern mit zu vielen Ordnerelementen, von Postfächern mit zu vielen Ordnern und von Postfächern, die eine gewisse Größe überschreiten. Diese Codeabschnitte können auch in einem einzigen Bericht zusammengefasst werden, den die IT-Abteilung für die Fehlerbehebung und/oder die Behebung dieser häufigen Probleme verwenden kann.

 

 

Wie kann ScriptRunner Ihnen helfen,
Exchange-Ressourcen zu verwalten?

Mit ScriptRunner können Sie Ressourcen in M365 Exchange Online als auch in Exchange on-premises Umgebungen vollständig managen. ScriptRunner bietet neben der Ausführung von Scripten auch Möglichkeiten, mit ScriptRunner Queries Exchange Ressourcen abzufragen und in Auswahlfeldern für die Anwender anzuzeigen. Zusammen mit dem webbasierten no-code UI und den Delegationsfunktionen können Sie automatisierte Aufgaben sicher und einfach an Helpdesk und End User delegieren.

Aus über 1.500 Skriptvorlagen in GitHub, den ScriptRunner ActionPacks, wählen Sie innerhalb des ScriptRunner Portals die passenden direkt herunter und passen diese ggf. noch etwas an. Klicken Sie im Bereich Skripte einfach auf “Import script”:


Laden Sie das gewünschte Skript nativ über die Git-Integration von ScriptRunner herunter:

Für Exchange gibt es mehrere Skripte, wie beispielsweise Get-ExMailboxProperties.ps1 oder Get-ExMailboxStatisctics.ps1.

Sie können Ihre Skripte mit dem integrierten Code-Editor von ScriptRunner einfach bearbeiten.

Wechseln Sie in die ScriptRunner Admin App, um eine Aktion aus Ihrem neuen Skript anzulegen. Wählen Sie Ihr Skript aus und erstellen Sie eine neue Aktion direkt aus dem Skript heraus.

 

Auf der ersten Seite des Wizards können Sie den Namen und die Tags der Aktion definieren:

Auf der zweiten Seite können Sie das Target auswählen, d. h. Ihr M365-Konto oder Ihr lokales Exchange.

Sie können ScriptRunner auch für die Verwendung von PowerShell v7 einrichten oder Parameter vorkonfigurieren.

Experten Tipp:

Wenn Sie die Aktion an Ihre Helpdesk Nutzer delegieren und vereinfachen möchten, konfigurieren Sie einfach die Parameter vor und blenden Sie die Eingabefelder aus.

ScriptRunner ist die perfekte Lösung für die Verwaltung und das Erstellen von Skripten in einer professionellen Umgebung. Holen Sie sich jetzt hier Ihre Testversion! #KeepOnScripting

 

 

Weiterführende Links