Resolve-DnsName: Master DNS Record Lookup in PowerShell

Wenn Sie Web- oder Mailserver verwalten, wissen Sie, wie stark diese Server auf ordnungsgemäß konfigurierte DNS-Einträge angewiesen sind. Das Fehlen von DNS-Einträgen kann verschiedene Probleme verursachen, einschließlich der Unfähigkeit von Benutzern, Ihre Website zu finden oder der Nichtzustellung von E-Mails. Es ist eine gute Sache, dass das PowerShell Resolve-DnsName-Cmdlet existiert, mit dem das Überwachen von DNS-Einträgen durch Skripting automatisiert werden kann.

Der Tag eines Administrators ist bereits voll genug, und das manuelle Überprüfen, ob DNS-Einträge ordnungsgemäß aufgelöst werden können, bedeutet mehr manuellen Aufwand.

In diesem Artikel erfahren Sie, was und wie Sie das Resolve-DnsName-Cmdlet verwenden können, um DNS-Einträge mit PowerShell abzufragen. Bis zum Ende dieses Artikels haben Sie auch gelernt, wie Sie ein grundlegendes Skript erstellen können, um einen Bericht über Ihre ausgewählten DNS-Einträge zu erstellen und zu überwachen.

Voraussetzungen

Dieser Artikel ist eine Schritt-für-Schritt-Anleitung, und wenn Sie den Beispielen folgen möchten, benötigen Sie:

Resolve-DnsName: Der PowerShell DNS Resolver

Es gibt mehr als eine Möglichkeit, eine DNS-Abfrage durchzuführen. Das Resolve-DnsName-Cmdlet ähnelt dem nslookup-Befehlszeilentool, das mit Windows geliefert wird, oder dem dig-Befehl, wenn Sie eher ein Linux-Administrator sind.

Einige Websites bieten DNS-Eintrag-Überwachungs- und Berichterstellungsdienste an. Diese Dienste von Drittanbietern sind jedoch meist kostenpflichtig. Es gibt jedoch eine kostenlose Alternative, mit der Sie auch Ihre Skripting-Fähigkeiten demonstrieren können!

Das Cmdlet Resolve-DnsName löst, wie der Name schon sagt, DNS-Namen in IP-Adressen und umgekehrt auf. Dieses Cmdlet ist Teil des dnsclient-PowerShell-Moduls, das zum Zeitpunkt dieses Schreibens mit Windows 10, Windows Server 2012/R2, Windows Server 2016 und Windows Server 2019 ausgeliefert wird.

Da Resolve-DnsName ein PowerShell-Cmdlet ist, liefert es seine Ergebnisse als Objekte zurück, die gespeichert, manipuliert und exportiert werden können. Wenn Sie zum Beispiel den DNS-Eintrag von google.com mit dem Befehl Resolve-DnsName google.com abfragen, erhalten Sie die unten gezeigte Ausgabe.

DNS Record lookup result using Resolve-DnsName

Das Ergebnis wurde als Objekt zurückgegeben, sodass Sie die Ergebnisse in eine CSV-Datei exportieren oder das Format manipulieren können, um HTML-Berichte zu erstellen.

Das Cmdlet Resolve-DnsName unterscheidet sich von dem altbewährten Dienstprogramm nslookup. nslookup gibt eine einfache Zeichenkette zurück. Ein Beispiel finden Sie im folgenden Screenshot. Wenn Sie Informationen daraus extrahieren müssen, kann dies mühsam sein.

DNS record lookup result using nslookup

Abfrage verschiedener Arten von DNS-Einträgen

Standardmäßig fragt Resolve-DnsName die A- und AAAA-Arten von DNS-Einträgen ab. Wenn Sie beispielsweise den DNS-Eintrag für gmail.com mit dem folgenden Befehl abfragen:

Resolve-DnsName -Name gmail.com

Wie unten zu sehen ist, werden nur die AAAA- und A-Einträge zurückgegeben. Das liegt daran, dass der abzufragende DNS-Eintragstyp nicht angegeben wurde.

DNS record for gmail.com

Jetzt, da wir alle wissen, dass gmail.com eine E-Mail-Domäne ist, die von Googles E-Mail-Dienst verwendet wird, muss es einen MX-Eintrag dazu geben, oder? Nun, anstatt anzunehmen, können Sie es bestätigen, indem Sie diesen Befehl verwenden:

Resolve-DnsName -Name gmail.com -Type MX

Die unten gezeigte Ausgabe zeigt die Liste der MX-Einträge für gmail.com.

MX Record list of gmail.com

Um mehr über die verschiedenen Eintragstypen zu erfahren, die mit Resolve-DnsName verwendet werden können, besuchen Sie diesen Link und suchen Sie nach der Tabelle für den -Type-Parameter. Oder Sie können einfach die Resolve-DnsName-Hilfe mit dem Befehl get-help Resolve-DnsName aufrufen.

Verwendung bestimmter Server für die DNS-Suche

Resolve-DnsName verwendet standardmäßig die auf Ihrem Computer konfigurierten DNS-Server-Adressen. Sie können jedoch auch Resolve-DnsName anweisen, einen bestimmten DNS-Server für Abfragen zu verwenden.

Zum Beispiel können Sie Google Public DNS verwenden, um Einträge nachzuschlagen, indem Sie den -Server-Parameter zu Ihrem Befehl hinzufügen, ähnlich wie im folgenden Beispiel.

# Google Public DNS Server IPs
$dnsServer = @('8.8.8.8','8.8.4.4')
Resolve-DnsName adamtheautomator.com -Server $dnsServer

Das Ergebnis des obigen Befehls würde dem in der untenstehenden Abbildung ähneln.

DNS record lookup results using a specific DNS servers

An diesem Punkt könnten Sie sich fragen: „Warum sollte ich einen anderen DNS-Server verwenden?“. Das ist eine berechtigte Frage. Wenn Sie versuchen, denselben Eintrag mit dem standardmäßigen DNS-Server Ihres Computers oder einem anderen DNS-Server nachzuschlagen, erhalten Sie wahrscheinlich das gleiche Ergebnis.

Es gibt viele Gründe, unterschiedliche DNS-Server mit Resolve-DnsName zu verwenden. Einige dieser Gründe könnten sein:

  • Geschwindigkeit – Einige DNS-Server können schneller arbeiten als andere.
  • Sicherheit – Einige DNS-Server verfügen möglicherweise über mehr Sicherheitsmaßnahmen als andere, die Hijacks und Angriffe verhindern.
  • Verfügbarkeit von Datensätzen – In den meisten Szenarien haben Organisationen ihre eigenen internen DNS-Server, die die Zonen und Datensätze für Namen enthalten, die nur intern aufgelöst werden. In diesem Fall wird die Abfrage eines internen Namens über einen öffentlichen DNS-Server fehlschlagen.
DNS record lookup failure
  • DNS-Server leiten keine Anfragen weiter – Einige Organisationen erlauben keine DNS-Weiterleitung. Die Verwendung von ihnen für die DNS-Abfrage öffentlicher DNS-Datensätze wird fehlschlagen.
  • Fehlerbehebung und Tests – Wenn Ihre bevorzugten DNS-Server Probleme bereiten, möchten Sie vielleicht Ihre Abfragen mit einem anderen DNS-Server testen.

DNS-Datensätze mithilfe eines PowerShell-Skripts melden

Nun, da Sie die Grundlagen der Verwendung des Resolve-DnsName-Cmdlets gelernt haben, erfahren Sie in diesem Abschnitt, wie Sie ein PowerShell-Skript erstellen, um DNS-Datensätze zu überwachen und zu melden. Sie sollten in der Lage sein, das Wissen, das Sie bisher in den vorherigen Abschnitten erworben haben, beim Erstellen dieses Skripts anzuwenden.

Starten Sie Ihren Skript-Editor Ihrer Wahl und erstellen Sie eine neue Datei mit dem Namen GetDnsRecord.ps1.

Definition der Variablen

Zuerst bestimmen Sie die zu verwendenden Variablen. Diese Variablen umfassen Folgendes:

  • $NameList – Diese Variable enthält die Namen der DNS-Datensätze, die Ihr Skript abfragen soll
  • $Serverlist – Verwenden Sie diese Variable, um die DNS-Server anzugeben, die vom Skript für Abfragen verwendet werden.

Kopieren Sie den folgenden Code und fügen Sie ihn am Anfang Ihres Skripts ein.

$NameList = @('adamtheautomator.com','powershell.org','xyz.local')
$ServerList = @('8.8.8.8','8.8.4.4')

Durchführung von DNS-Abfragen

Next muss der Code in der Lage sein, den DNS-Eintrag für jeden der angegebenen Namen nachzuschlagen. In diesem Fall wird die foreach-Schleife verwendet, um die Liste der Einträge zu durchlaufen und für jeden Namen mithilfe von Resolve-DnsName nachzuschlagen.

Die Zeile $FinalResult = @() erstellt ein leeres Array, in dem das Endergebnis gespeichert wird. Dann übergibt PowerShell mit der foreach-Schleife jedes Element in der Variable $NameList an eine Variable namens $Name.

In jeder Iteration erstellt die Zeile $tempObj = "" | Select-Object Name,IPAddress,Status,ErrorMessage ein temporäres Objekt mit vier Eigenschaften, um das Ergebnis des erfolgreichen DNS-Lookups zu speichern.

Anschließend wird die try{}-Anweisung verwendet, um den Befehl Resolve-DnsName auszuführen und die DNS A-Einträge abzurufen und die Werte in $tempObj zu setzen. Falls der DNS-Lookup fehlschlägt, fängt die catch{}-Anweisung den Fehler ab, und der Fehler wird im Objekt $tempObj eingefügt.

Am Ende jeder Iteration wird der Wert des Objekts $tempObj dem $FinalResult angehängt. Und sobald das letzte Element im Array $NameList verarbeitet wurde, wird die Schleife beendet. Dann wird der Wert des $FinalResult angezeigt.

Kopieren Sie den folgenden Code und fügen Sie ihn am Ende Ihres Skripts ein. Es ist nicht erforderlich, Werte zu ändern.

$FinalResult = @()
foreach ($Name in $NameList) {
    $tempObj = "" | Select-Object Name, IPAddress, Status, ErrorMessage
    try {
        $dnsRecord = Resolve-DnsName $Name -Server $ServerList -ErrorAction Stop | Where-Object { $_.Type -eq 'A' }
        $tempObj.Name = $Name
        $tempObj.IPAddress = ($dnsRecord.IPAddress -join ',')
        $tempObj.Status = 'OK'
        $tempObj.ErrorMessage = ''
    }
    catch {
        $tempObj.Name = $Name
        $tempObj.IPAddress = ''
        $tempObj.Status = 'NOT_OK'
        $tempObj.ErrorMessage = $_.Exception.Message
    }
    $FinalResult += $tempObj
}
return $FinalResult

Nachdem Sie das Skript gespeichert haben, führen Sie es in PowerShell aus, indem Sie es mit seinem Namen aufrufen GetDnsRecord.ps1. Die Demonstration unten zeigt die Ausgabe.

Script to lookup multiple DNS records using Resolve-DnsName

Wie Sie aus dem obigen Ergebnis sehen können, ist die Ausgabe ein Objekt, das nützlich ist, wenn Sie die Ergebnisse beispielsweise als CSV-Datei exportieren möchten, indem Sie den folgenden Befehl verwenden.

.\GetDnsRecord.ps1 | Export-Csv DnsRecord.csv -NoTypeInformation

Die CSV-Ausgabe würde ähnlich aussehen wie die untenstehende.

DNS record lookup report exported to a CSV file

Fazit

In diesem Artikel haben Sie die Grundlagen gelernt, wie Sie das Resolve-DnsName-Cmdlet verwenden können, um DNS-Records-Lookups in PowerShell durchzuführen. Sie haben auch gelernt, wie sich Resolve-DnsName von anderen Tools wie dem nslookup-Dienstprogramm unterscheidet.

Sie haben gesehen, wie Resolve-DnsName in einem Skript verwendet werden kann, um die DNS-Record-Suche zu automatisieren. Dies wäre nützlich als Überwachungstool, um sicherzustellen, dass Sie über den aktuellen Status der von Ihnen betreuten DNS-Records informiert sind.

Mit Ihren PowerShell-Skripting-Fähigkeiten kann das Berichtsskript weiter verbessert werden, indem Code hinzugefügt wird, um den Bericht automatisch an bestimmte Empfänger zu senden. Es kann auch so modifiziert werden, dass es einen visuell ansprechenden HTML-Ausgang erstellt.

Letztendlich ist Resolve-DnsName ein ausgezeichnetes Tool für DNS-Lookups, egal ob Sie es manuell verwenden oder für die Automatisierung in Skripten. Jetzt haben Sie das Wissen darüber, wie es funktioniert, und es liegt an Ihnen, Wege zu finden, es als Teil Ihrer Administrationsaufgaben zu nutzen.

Weiterführende Literatur

Source:
https://adamtheautomator.com/resolve-dnsname/