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 } } } } }
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.