Get-Routingtable

Auf den Seite Routing2007 haben ich beschrieben, wie Exchange Mails anhand der Zieldomäne zustellt. Exchange nutzt erst den Adresstyp und den Domainpart um einen passenden Send-Connector zu finden und wenn mehrere Connectoren übrig sind, dann wird anhand der Kosten sortiert. Das entspricht ziemlich genau der Logik, anhand der auch ein IP-Stack seine Pakete zur nächsten Station weiter reicht.

Bordmittel Routing Log Viewer

Exchange bringt in der Toolbox einen Routing Log Viewer mit, welcher einen interaktiven Einblick in die aktuelle Konfiguration (oder vorherige Stände) erlaubt.

Exchange protokolliert nämlich alle RoutingÄnderungen in lokalen XML-Dateien. (Pfad: c:\Program Files\Microsoft\Exchange Server\V14\TransportRoles\Logs\Routing) mit.

Skript

Aber so richtige gefällt mir das nicht. Ich hätte doch gerne einfach eine Tabelle, die ähnlich einem "ROUTE PRINT" die verschiedenen Adressräumen untereinander mit den Kosten und Zielen auflistet, so dass ich mal schnell ein Skript zusammengetippt habe, welches die Send-Connectoren ausliest und ausgehend von den Adressräumen als Objekte wieder ausgibt.

# Get-Routingtable
#
# retrieves all sendconnectors and reformats output to get a list of configured Routing entries
#
# Version 1.0 20110329 initial proof of concept
# Version 1.1 20110329 separate lines für targets
# Version 1.2 20110329 separate lines für SourceHosts

$pso = New-Object PSObject
Add-Member -InputObject $pso -MemberType NoteProperty -Name Connectorname -Value $connector.identity
Add-Member -InputObject $pso -MemberType NoteProperty -Name Addressspace -Value $addressspace
Add-Member -InputObject $pso -MemberType NoteProperty -Name enabled -Value $connector.enabled
Add-Member -InputObject $pso -MemberType NoteProperty -Name Sourcehost -Value $connector.SourceTransportServers
Add-Member -InputObject $pso -MemberType NoteProperty -Name NextHop -Value ""


foreach ($connector in Get-SendConnector){
	$pso.Connectorname= $connector.Name
	$pso.enabled = $connector.Enabled
	foreach ($addressspace in $connector.addressspaces){
		$pso.Addressspace = $addressspace
		foreach ($SourceHost in $connector.SourceTransportServers) {
			$pso.SourceHost = $SourceHost
			if ($connector.DNSRoutingEnabled) {
				$pso.NextHop = "DNS-Routing:" + $connector.port
				$pso
			}
			else {
				foreach ($nexthop in $connector.Smarthosts){
					if ($nexthop.isIpAddress) {
						$pso.NextHop = $nexthop.address.ToString() + ":" + $connector.port
					}
					else {
						$pso.NextHop = $nexthop.domain.ToString() + ":" + $connector.port
					}
					$pso
				}
			}
		}
	}
}

get-routingtable.1.2.ps1

Durch die Ausgabe in eine Pipeline ist es relativ einfach, die Daten dann in Text oder CSV-Dateien zu schreiben oder mit anderen Commandlets (z. B. Group-By, Filter etc.) zu bearbeiten. Hier ein Beispiel einer Ausgabe

Sie sehen also, dass ein Send Connector mehrfach auftaucht, d.h. wenn er zwei oder mehr Adressräume bedient und wenn er mehrere "NextHops" hat.

Weitere Links