Jetzt testen

Dokumentieren von Exchange Servern mit PowerShell

Table of Contents

Post Featured Image

Die Dokumentation einer funktionierenden Umgebung ist eine wichtige Aufgabe, die in der Regel von Administratoren und Beratern durchgeführt wird, um eine bessere Vorstellung davon zu bekommen, wie die Umgebung konfiguriert ist. Bei Exchange Server 201x ist das nicht anders. Ordnungsgemäße Wartungs- und Migrationsaktivitäten können in hohem Maße von der Dokumentation abhängen. Ein möglichst umfassendes und genaues Bild der Konfiguration ist bei diesen Aufgaben hilfreich. Wie also dokumentiert man eine Exchange Server-Umgebung? Mit einer Kombination aus Get-Cmdlets und Exportdateien - txt, csv und HTML - lässt sich eine angemessene Dokumentation einer Exchangeumgebung erstellen.

Achtung: Der Artikel wird nicht alle denkbaren Aspekte, die es zu dokumentieren gilt, darlegen, sondern sich auf einige ausgewählte konzentrieren.  



Aufbau unsere Frameworks

Bevor wir uns mit den Cmdlets für die Dokumentation befassen, müssen wir unser Framework für die Erfassung dieser Daten aufbauen. Zunächst definieren und erstellen wir die Ausgabedateien und Variablen, die wir brauchen. Einige Ausgaben unserer Cmdlets könnten dabei sehr umfangreich werden, damit uns keine Details entgehen, muss daher ggf. die Puffergröße des Fensters angepasst werden.

Verwenden Sie dieses Kommando, um das aktive PowerShell Fenster zu vergrößern:

$Host.UI.RawUI.BufferSize = New-Object Management.Automation.Host.Size (500, 9999)

Als Nächstes müssen wir eine Hauptausgabedatei und einen Dateipfad festlegen:

$Path = (Get-Item -Path ".\" -Verbose).FullName
$File = "ExchangeServerInformation.Txt"
$Destination = $Path+"\"+$File

Exchange Server enthalten im Allgemeinen eine Vielzahl von Daten und Konfigurationsinformationen, die mit PowerShell abgefragt werden können. Je nach Größe der Umgebung bietet es sich an, zusätzliche Dateien zu erstellen, um diese Daten getrennt zu halten. Während in einer Umgebung mit 100 Postfächern beispielsweise alle Einstellungen und Daten in eine einzige Datei exportiert werden können, sieht das ganze bei einer Umgebung mit mehr als 10.000 Postfächern schon anders aus, und Sie möchten möglicherweise Dateien für jede einzelne Komponente definieren. Nachfolgend sind einige Beispiel-Protokolldateien aufgeführt (die vor der Ausführung von Get Cmdlets vordefiniert wurden):

Beispieldatensammlung über die Postfächer der Benutzer:

$ArchiveMailboxDestination = $Path+"\ArchiveMailboxStatistics.txt"
$CASMailboxDestination = $Path+"\CASMailboxProperties.csv"
$MailboxStatDestination = $Path+"\MailboxStatistics.txt"

Beispiel für Serverkonfigurationsdateien:

$ExchangeDatabaseDestination = $Path+"\ExchangeDatabaseInformation-Detailed.txt"
$NICInfoCSVDestination = $Path+"\ExchangeServerNICConfiguration.csv"

 

Untersuchen und Exportieren der Konfiguration 

Exchange ist ein komplexes System, welches sich allerdings in Komponenten unterteilen lässt, um einen organisierten Ansatz für die Datenerfassung zu ermöglichen. Die Aufteilung in einzelne Teile erfordert sowohl umfassende Kenntnisse von Exchange als auch der Backend PowerShell Cmdlets, mit denen Daten ermittelt und Berichte für die Auswertung erstellt werden können. Zerlegen wir eine Exchange-Umgebung in ihre einzelnen Bestandteile und erstellen wir eine Beispieldokumentation.

Beispielhafte Aufgliederung (sample breakdown)

Exchange Server Einrichtung: Anzahl der Server, Version, Patchlevel, Datenbanken, URLs

Windows Server Konfiguration: Hardware oder Ressourcen (VM), Pagefile (Auslagerungsdatei), Event Logs (Ereignisprotokolle), Version, Festplattengröße

Benutzer-Postfächer: Postfachstatistiken, Archiv-Postfachstatistiken, Erlaubte Protokolle, E-Mail-Kontakte

Einstellungen der Exchange-Software: E-Mail-Adressrichtlinien, Adressbuchrichtlinien, Authentifizierungsrichtlinien, Receive Connectors, Send Connectors, DLP-Richtlinien, usw.

 

Hinweis: Sobald Sie an irgendeiner Stelle mehr als tausend Einträge haben, lieber einmal zu viel als zu wenig "-ResultSize Unlimited" nutzen. 

 

Einrichtung Exchange Server 

Wir betrachten zunächst die Konfiguration von Exchange Server selbst.

Version, Edition, Rolle und Standort (Site)

$ExchangeServers = Get-ExchangeServer
$LocalExchangeServer = $Env:ComputerName
$ServerVersionCheck = $True
Foreach ($ExchangeServer in $ExchangeServers) {
$Server = $ExchangeServer.Name
$Site = $ExchangeServer.Site
$ServerRole = $ExchangeServer.ServerRole
$Edition = $ExchangeServer.Edition
If ($Server -ne $LocalExchangeServer) {
$Version = Invoke-Command -ComputerName $Server -ScriptBlock {$Ver = Get-Command Exsetup.exe | ForEach-Object {$_.FileversionInfo};$Version = $Ver.FileVersion;$Version} -ErrorAction Stop
} Else {
$Ver = Get-Command Exsetup.exe | ForEach-Object {$_.FileversionInfo}
$Version = $Ver.FileVersion
}
$Line = "$Server|"+"$Version|"+"$Edition|"+"$ServerRole|"+"$Site" | Out-file $Destination -Append
}


Die Ergebnisse des Scripts sehen in etwa so aus:

Ergebnisse des ScriptsErgebnisse des Scripts 

Nützlich zur Überprüfung der Serverversionen und der auf dem Server installierten Rollen.

Mailbox-Datenbanken

Als nächstes werden wir einige grundlegende Informationen aus unseren Exchange-Datenbanken abrufen:

Get-MailboxDatabase | FT Name, Server, Recovery, ReplicationType, LogFolderPath, EdbFilePath, DeletedItemRetention, MailboxRetention -Auto | Out-file $Destination -Append

Beispielhafte Ausgabe:

 Beispielhafte Ausgabe aus unseren Exchange-Datenbanken
Beispielhafte Ausgabe aus unseren Exchange-Datenbanken

URLs

Die richtige URL-Konfiguration für Exchange-Server ist wichtig für Client-Verbindungen und externe Prozesse. Der folgende Codeblock fragt jeden URL-Typ ab und exportiert die Ergebnisse in eine Datei.

$Line = Get-OWAVirtualDirectory -ADPropertiesOnly |ft Server,*lurl* -Auto | Out-file $Destination -Append
$Line = Get-WebServicesVirtualDirectory -ADPropertiesOnly |ft Server,*lurl* -Auto | Out-file $Destination -Append
$Line = Get-ActiveSyncVirtualDirectory -ADPropertiesOnly |ft Server,*lurl* -Auto | Out-file $Destination -Append
$Line = Get-AutoDiscoverVirtualDirectory -ADPropertiesOnly |ft Server,*lurl* -Auto | Out-file $Destination -Append
$Line = Get-MAPIVirtualDirectory -ADPropertiesOnly |ft Server,*lurl* -Auto | Out-file $Destination -Append
$Line = Get-OABVirtualDirectory -ADPropertiesOnly |ft Server,*lurl* -Auto | Out-file $Destination -Append
$Line = Get-ClientAccessService | ft Name,*uri* -Auto | Out-file $Destination -Append

 

Windows Server Konfiguration

Hardware oder Ressourcen (VM), Pagefile (Auslagerungsdatei), Event Logs (Ereignisprotokolle), Betriebssystemversion (OS Version)

Ein weiterer wichtiger Bestandteil eines Exchange-Servers ist die Konfiguration des zugrunde liegenden Windows-Servers, auf dem er läuft.

Prozessorkerne – logisch und physisch

Überprüfen Sie zuerst die Anzahl der logischen und physischen Prozessoren. Dies dient der Dokumentation und der Überprüfung, ob Hyper-Threading (HT) aktiv ist oder nicht.

$Processors = Get-WMIObject Win32_Processor -ComputerName $Server
$LogicalCPU = ($Processors | Measure-Object -Property NumberOfLogicalProcessors -sum).Sum
$PhysicalCPU = ($Processors | Measure-Object -Property NumberOfCores -sum).Sum

Server RAM

$RamInGb = (Get-wmiobject -ComputerName $Server -Classname win32_physicalmemory -ErrorAction Stop | measure-object -property capacity -sum).sum/1GB

Konfiguration der Auslagerungsdatei (Pagefile)

Prüfen Sie als nächsten Schritt, ob ein Pagefile vorhanden ist, und wenn ja, mit welcher minimalen und maximalen Größe. Wenn die Pagefile-Abfrage Null ergibt, dann wird die Pagefile automatisch vom System verwaltet.

$PageFileCheck = Get-CIMInstance -ComputerName $Server -Class WIN32_PageFile -ErrorAction STOP
$Managed = $False
If ($Null -ne $PageFileCheck) {
$MaximumSize = (Get-CimInstance -ComputerName $Server -Query "Select * from win32_PageFileSetting" | select-object MaximumSize).MaximumSize
$InitialSize = (Get-CimInstance -ComputerName $Server -Query "Select * from win32_PageFileSetting" | select-object InitialSize ).InitialSize
} Else {
$Managed = $True
}

Ereignisprotokolle (Event Log)  

$Line = EventLog -list | where {($_.log -eq 'Application') -or ($_.log -eq 'system') -or ($_.log -eq 'Security')} |ft Log,MAx*,Over* -auto | Out-File $EventLogConfiguration

Informationen zum Windows-Betriebssystem (OS Version)

$OSName = ($os = Get-WmiObject Win32_OperatingSystem -Namespace "root\CIMV2").Name.split('|')[0]

 

Benutzerpostfächer und Kontakte

Ein großer Aspekt einer Exchange Server-Umgebung sind Mail-Objekte wie Kontakte und Postfächer. Die Abfrage nach der Anzahl der Postfächer, Postfachgröße und Archivinformationen kann sehr nützlich sein, da sie dem Supportpersonal ein Gefühl für die Größenordnung vermitteln kann. Es kann auch dabei helfen, die richtigen Supportsysteme für Wartung, Backups und Migrationen zu bestimmen.

Statistiken des Postfachs

Für die Postfachstatistiken der Benutzer haben wir eine definierte Datei, in die die Informationen exportiert werden können. Wird diese Datei zu groß, ist es möglich, einen Export in mehrere einzelne Dateien auszulagern (denken Sie an Umgebungen mit mehr als 10.000 Benutzern).

$MailboxStatDestination = $Path+"\MailboxStatistics.txt"
Get-Mailbox -ResultSize Unlimited | Get-MailboxStatistics | Select-Object DisplayName, @{expression = { $_.TotalItemSize.Value.ToMB()};label="Mailbox Size(MB)"} | ft -auto | Out-File $MailboxStatDestination

Statistiken des Archivpostfachs

Möchten Sie Statistiken für das Archivpostfach erzeugen, führen Sie denselben Code für das Archivpostfach des Benutzers aus, verwenden aber den -Archive Schalter für Get-Mailbox, damit wir alle Archivpostfächer des Benutzers abfragen können:

$ArchiveMailboxDestination = $Path+"\ArchiveMailboxStatistics.txt"
Get-Mailbox -ResultSize Unlimited -Archive | Get-MailboxStatistics | Select-Object DisplayName, @{expression = { $_.TotalItemSize.Value.ToMB()};label="Mailbox Size(MB)"} | ft -auto | Out-File $ArchiveMailboxDestination

Erlaubte Protokolle

Für die Protokolle, welche die Benutzer für ihre Postfächer verwenden können, nutzen wir das Cmdlet Get-CASMailbox und exportieren in unsere vordefinierte Ergebnisdatei:

$CasMailboxDestination = CASMailboxProperties.txt
Get-CasMailbox | ft -auto | Out-File $CasMailboxDestination

E-Mail Kontakte

$MailContactsDestination = ‘MailContacts.txt’
$Line = Get-MailContact -ResultSize Unlimited | Ft DisplayName, Alias, EmailAddress, HiddenFromAddressListsEnabled -Auto | Out-File $MailContactsDestination

 

Einstellungen der Exchange Software

Neben den grundlegenden Exchange Server-Einstellungen gibt es auch benutzerdefinierte Einstellungen, die wir in dem Exchange Server konfigurieren können. Im Folgenden finden Sie einige Beispiele für diese Konfigurationen, die Sie mit PowerShell abfragen können:

E-Mail-Adressrichtlinien 

$Line = Get-EmailAddressPolicy -ErrorAction STOP | Ft Name, RecipientFilterType, Priority ,Enabled*, RecipientFilter, LDAP*, IsValid -Auto | Out-File $Destination -Append

Adressbuchrichtlinien  

$Line = Get-AddressBookPolicy | Fl | Out-File $Destination -Append

Authentifizierungsrichtlinien 

$Line = Get-AuthenticationPolicy -ErrorAction STOP | Fl Name,Identity,allow* | Out-file $Destination -Append

Receive Connectors 

$Line = Get-ReceiveConnector | Ft Identity, Bindings, EnabledAuthMechanism, MaxMessageSize, PermissionGroups, RequireTLS, TransportRole -Auto | Out-file $Destination -Append

Send Connectors

$Line = Get-SendConnector -ErrorAction STOP | Ft Identity, HomeMtaServerId, Enabled, MaxMessageSize, AddressSpaces, CloudServicesMailEnabled, RequireTLS, SmartHosts -Auto | Out-file $Destination -Append

DLP-Richtlinien 

$Line = Get-DLPPolicy | Ft Name,State,Mode,Identity -Auto | Out-File $Destination -Append

 

Erstellen von Berichten

Ein Teil der gesammelten Daten lassen sich besser in Form von HTML-Berichten darstellen. Das hat den Vorteil, dass sie sich damit von anderen Personengruppen besser nutzen lassen. Im IT Management könnten z.B. Geschäftsprozess-Prüfdaten oder Architekturinformationen auf hoher Ebene für interne/externe Quellen bereitgestellt werden.

Mit PowerShell können Sie die abgefragten Informationen aus normalen CSV-Ausgabedateien in HTML-Dateien umwandeln. Aus den unterschiedlichen Ansätzen werden wir hier nur einen übergeordneten Ansatz behandeln, wie er im Prozess der Berichtserstellung Verwendung findet. Als Beispiel werden wir die NIC-Informationen für alle Exchange-Server abfragen, um sicherzustellen, dass kein Server DHCP konfiguriert hat oder zu viele Gateways oder andere Probleme mit der NIC-Konfiguration hat. 

 

$ExchangeServers = (Get-ExchangeServer).Name
Foreach ($ExchangeServer in $ExchangeServers) {
$Networks = Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $ExchangeServer -EA Stop | ? {$_.IPEnabled}
Foreach ($Network in $Networks) {
$IPAddress = $Network.IpAddress[0]
$SubnetMask = $Network.IPSubnet[0]
$DefaultGateway = $Network.DefaultIPGateway
$DNSServers = $Network.DNSServerSearchOrder
$WINS1 = $Network.WINSPrimaryServer
$WINS2 = $Network.WINSSecondaryServer
$WINS = @($WINS1,$WINS2)
$IsDHCPEnabled = $false
If($network.DHCPEnabled) {
$IsDHCPEnabled = $true
}
$MACAddress = $Network.MACAddress
$OutputObj = New-Object -Type PSObject
$OutputObj | Add-Member -MemberType NoteProperty -Name ComputerName -Value $Computer.ToUpper()
$OutputObj | Add-Member -MemberType NoteProperty -Name IPAddress -Value $IPAddress
$OutputObj | Add-Member -MemberType NoteProperty -Name SubnetMask -Value $SubnetMask
$OutputObj | Add-Member -MemberType NoteProperty -Name Gateway -Value ($DefaultGateway -join ",")
$OutputObj | Add-Member -MemberType NoteProperty -Name IsDHCPEnabled -Value $IsDHCPEnabled
$OutputObj | Add-Member -MemberType NoteProperty -Name DNSServers -Value ($DNSServers -join ",")
$OutputObj | FT -auto
$Row = "$Computer," + "$IPAddress," +"$SubnetMask," +"$DefaultGateway," +"$ISDHCPEnabled," + "$DNSServers"
Add-Content -Path $NICInfoCSVDestination $Row
}

Sobald wir all diese Informationen in einer CSV-Datei gesammelt haben, die durch die Variable $NICInfoCSVDestination definiert ist, können wir hier mit der Erstellung des HTML-Headers für unsere Datei beginnen:

# Define Style for HTML file
$OutputFile = "<style>"
$OutputFile = $OutputFile + "TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}"
$OutputFile = $OutputFile + "TH{border-width: 1px;padding: 2px;border-style: solid;border-color: black;}"
$OutputFile = $OutputFile + "TD{border-width: 1px;padding: 2px;border-style: solid;border-color: black;}"
$OutputFile = $OutputFile + "</style>"

Konvertieren Sie dann die Datei $NICInfoCSVDestination und wenden Sie die zuvor definierte Kopfzeile an:

# Convert CSV to HTML
$Output = Import-Csv -Path $NICInfoCSVDestination
$Output | ConvertTo-Html -Head $OutputFile | Set-Content -Path $NICInforHTMLDestination

Wenn dieser Codeabschnitt ausgeführt wird, sollten wir eine HTML-Datei erhalten, die wie folgt aussieht:

Screenshot der HTML-Datei
Screenshot der HTML-Datei 

In der Abbildung wurde eine Liste erstellt über die Netzwerkkonfigurationen der Exchange Server. Sie ermöglicht einen Überblick über die Konfiguration und hilft, mögliche Fehlkonfigurationen zu erkennen.

 

Fazit 

Zugegeben, dieser Blogbeitrag enthielt jede Menge PowerShell Codefragmente. Ich hoffe, damit gezeigt zu haben, wie schnell und einfach die Snippets aufgebaut sind - und wie hilfreich sie in Ihrem Arbeitsalltag sein könnten. Ein Blogbeitrag wie dieser kann einzelne Abschnitte, aber kein komplettes Skript nachbilden (ich denke da gerade an eine 5.000 Zeilen umfassende Dokumentation von Exchange Server, die ich vor einiger Zeit geschrieben habe).

Lesen Sie den Beitrag ruhig mehrmals, nehmen den Code auseinander, nutzen ihn in anderen Bereichen, die Sie dokumentieren müssen. Erstellen Sie dann einen geeigneten Satz von Ausgabedateien. Behalten Sie Ihre Leser und Nutzer der Dokumentation im Hinterkopf und passen Sie die Dokumentation an Ihre Zielgruppe an. Exporte können schnell sehr technisch sein und wenig bis gar keine zusätzlichen Erklärungen enthalten. Letztendlich bleibt es Ihnen überlassen, was Sie daraus machen, und das ist die Freiheit der PowerShell.

 


 

Mehr zum Thema HTML Berichte in diesem Video unseres Kollegen Heiko Brenn

"Introduction: HTML Result Messages and customizable HTML Reports"

 

 

Über den Autor: