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
- PowerShell - Running
Executables
http://social.technet.microsoft.com/wiki/contents/articles/7703.PowerShell-running-executables.aspx - Hey, Scripting Guy! How Do I
Query and Retrieve DNS
Information?
http://blogs.technet.com/b/heyscriptingguy/archive/2009/02/26/how-do-i-query-and-retrieve-dns-information.aspx - System.Net.Dns
http://msdn.microsoft.com/en-us/library/system.net.dns.aspx - http://pinvoke.net/default.aspx/dnsapi.DnsQuery
- http://www.eggheadcafe.com/articles/20050129.asp
- http://www.codeproject.com/Articles/23673/DNS-NET-Resolver-C
- http://stackoverflow.com/questions/2669841/how-to-get-mx-records-for-a-dns-name-with-system-net-dns