GET-MXRecord

Immer wieder stellt sich mir die Aufgabenstellung, dass ich den MX-Record einer Domain auslesen muss. Speziell beim umstellen von Mailrouting auf andere Server ist es schon interessant zu sehen, wie weit die DNS-Änderung schon voran geschritten ist. Je mehr Domains eine Firma bedient, desto aufwändiger wird die manuelle Überprüfung.

Leider hat Microsoft es selbst im .NET Framework 4.5 versäumt, eine Klasse für die Abfragen anderer DNS-Einträge mit einzubauen. Es gibt nur die Klasse „System.Net.Dns“ (http://msdn.microsoft.com/en-us/library/system.net.dns.aspx), die aber nur Hostnamen zu IP-Adressen und retour auflöst aber keine Service-Records, MX-Records o.ä. Unterstützt. Einzig NSLOOKUP scheint diese Anfragen direkt per UDP zu machen. So haben ich mir ein PowerShell-Skript geschrieben, um die Ausgaben von NSLOOKUP zu parsen

Aufruf

Das Skript „Get-MXRecord“ kann auf zwei weisen aufgerufen werden. Der folgende Aufruf überprüft genau eine angegebene Domäne. Optional kann ein DNS-Server angegeben werden, der gefragt werden soll

Get-mxrecord -domain msxfaq.de <-dnsserver x.x.x.x>

Wenn mehrere Domänen abzufragen sind, dann bietet sich die Übergabe der Domänenliste per Pipeline an. Das kann per Array erfolgen oder auch aus einer Datei ausgelesen werden:

"msxfaq.de","msxfaq.net","msxfaq.info" | Get-mxrecord <-dnsserver x.x.x.x>

get-content domainliste.txt | Get-mxrecord <-dnsserver x.x.x.x>

Wer die Domänen schon in Exchange gepflegt hat, kann auch diese Quelle anzapften

Get-AcceptedDomain | `
    %{$_.domainname} | `
        C:\Migration\get-mxrecord\get-mxrecord.ps1 | `
             export-csv .\mxlist.csv -notypeinformation

Besondere Berechtigungen nicht sind erforderlich. Da allerdings „nslookup.exe“ gestartet wird, muss das Betriebssystem selbst oder der angegebene DNS-Server externe Namen auflösen können.

Die Ausgabe

Das Ergebnis ist eine Liste mit den Feldern Domain, Prio, Host, die von dem Skript an die Pipeline übergeben wird.
Sie können diese Daten auch einfach mit „| export-csv domain.csv“ in eine CSV-Datei exportieren und mit Excel o.ä. weiter bearbeiten. Natürlich können Sie ebenso eine HTML-Ausgabe für einen Webservererzeugen oder das Ergebnis per Mail versenden. PowerShell ist in der Hinsicht recht leistungsfähig

Eine gesonderte Auflösung der Hosts zu IP-Adressen haben ich nicht implementiert, da ein MX-Record normalerweise nicht direkt auf eine IP-Adresse sondern immer auf Hostnamen verweist. Das Auflösen von einem Hostnamen auf eine IP-Adresse ist mit System.Net.Dns dann doch wieder einfach

PS C:\> [System.Net.Dns]::GetHostAddresses("www.msxfaq.de")


Address : 3947144530
AddressFamily : InterNetwork
ScopeId :
IsIPv6Multicast : False
IsIPv6LinkLocal : False
IsIPv6SiteLocal : False
IPAddressToString : 82.165.68.235

Download

Auch wenn die Auflösung von MX-Namen vielleicht nicht allzu schwer sein dürfte, spart das Skript doch den ein oder anderen Handgriff. Insbesondere wenn sie viele Domänen auch noch regelmäßig ablesen wollen.

get-mxrecord.1.0.ps1.txt
Nach dem Download die Extension ändern

Weitere Links