Resolve-DnsName: Master DNS Record Lookup in PowerShell

Als je web- of mailservers beheert, weet je hoezeer deze servers afhankelijk zijn van adequaat geconfigureerde DNS-records. Ontbrekende DNS-records kunnen allerlei problemen veroorzaken, waaronder gebruikers die je website niet kunnen vinden of het niet afleveren van e-mails. Het is een goed ding dat het PowerShell Resolve-DnsName cmdlet bestaat, en hiermee kan het controleren van DNS-records worden geautomatiseerd via scripting.

De dag van een beheerder is al druk genoeg, en handmatig controleren of DNS-records correct kunnen worden opgelost betekent meer handmatige inspanning.

In dit artikel leer je wat en hoe je het Resolve-DnsName cmdlet moet gebruiken om DNS-records te bevragen met PowerShell. Tegen het einde van dit artikel heb je ook geleerd hoe je een basis script kunt maken om een rapport te maken van de door jou aangewezen DNS-records om te monitoren.

Vereisten

Dit artikel is een stapsgewijze handleiding, en als je van plan bent om de voorbeelden te volgen, heb je nodig:

Resolve-DnsName: De PowerShell DNS-oplosser

Er zijn meer dan één manier om een DNS-query uit te voeren. Het Resolve-DnsName cmdlet is vergelijkbaar met de nslookup command-line tool die bij Windows wordt geleverd, of de dig commando als je meer een Linux-beheerder bent.

Sommige websites bieden DNS-record-monitoring-/rapportageservices aan. Maar deze diensten van derden gaan meestal gepaard met kosten, natuurlijk. Er is echter een gratis alternatief, waarmee je ook je scriptingsvaardigheden kunt laten zien!

De Resolve-DnsName-cmdlet, zoals de naam al aangeeft, lost DNS-namen op naar IP-adressen en vice versa. Deze cmdlet maakt deel uit van de dnsclient-PowerShell-module die, op het moment van schrijven, wordt meegeleverd met Windows 10, Windows Server 2012/R2, Windows Server 2016 en Windows Server 2019.

Omdat Resolve-DnsName een PowerShell-cmdlet is, geeft het de resultaten terug als objecten die kunnen worden opgeslagen, gemanipuleerd en geëxporteerd. Bijvoorbeeld, het opzoeken van het DNS-record van google.com met het commando Resolve-DnsName google.com geeft je de hieronder getoonde output.

DNS Record lookup result using Resolve-DnsName

Het resultaat werd geretourneerd als een object dat je in staat stelt om de resultaten naar een CSV-bestand te exporteren, of de opmaak te manipuleren om HTML-rapporten te genereren.

De Resolve-DnsName-cmdlet verschilt van het ouderwetse nslookup-hulpprogramma. nslookup geeft een eenvoudige string terug. Je kunt een voorbeeld zien in de onderstaande screenshot. Als je informatie uit deze gegevens moet halen, wordt het een uitdaging.

DNS record lookup result using nslookup

Querying Different Types of DNS Records

Standaard vraagt Resolve-DnsName de A- en AAAA-types van DNS-records op. Als voorbeeld, als je het DNS-record voor gmail.com opzoekt met de onderstaande opdracht:

Resolve-DnsName -Name gmail.com

Zoals je hieronder kunt zien, worden alleen de AAAA- en A-records weergegeven. Dat komt doordat het type DNS-record dat moet worden opgezocht niet is gespecificeerd.

DNS record for gmail.com

Nu, aangezien we allemaal weten dat gmail.com een e-maildomein is dat wordt gebruikt door de e-mailservice van Google, moet er toch een MX-record aan gekoppeld zijn, toch? Nou, er is geen noodzaak om aan te nemen wanneer je het kunt bevestigen met deze opdracht:

Resolve-DnsName -Name gmail.com -Type MX

De output zoals weergegeven in de onderstaande schermafbeelding toont de lijst met MX-records voor gmail.com.

MX Record list of gmail.com

Om meer te weten te komen over de verschillende recordtypes die kunnen worden gebruikt met Resolve-DnsName, bezoek deze link en zoek naar de tabel voor de -Type-parameter. Of raadpleeg de Resolve-DnsName-help gewoon met de opdracht get-help Resolve-DnsName.

Specifieke Servers Gebruiken voor DNS-opzoeking

Resolve-DnsName gebruikt standaard de DNS-serveradressen die zijn geconfigureerd op uw computer. Maar u kunt ook Resolve-DnsName laten gebruikmaken van een specifieke DNS-server bij het uitvoeren van zoekopdrachten.

Bijvoorbeeld, als u Google Public DNS wilt gebruiken om records op te zoeken, kunt u dat doen door de -Server-parameter toe te voegen aan uw opdracht, vergelijkbaar met het onderstaande voorbeeld.

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

Het resultaat van de bovenstaande opdracht zou vergelijkbaar zijn met wat wordt weergegeven in de onderstaande schermafbeelding.

DNS record lookup results using a specific DNS servers

Op dit punt vraagt u zich misschien af: “waarom zou ik een andere DNS-server moeten gebruiken?”. Dat is een geldige vraag. Als u probeert dezelfde record op te zoeken met de standaard DNS-server van uw machine, of een andere DNS-server, krijgt u waarschijnlijk hetzelfde resultaat.

Er kunnen verschillende redenen zijn om verschillende DNS-servers te gebruiken met Resolve-DnsName. Enkele van deze redenen kunnen zijn:

  • Snelheid – Sommige DNS-servers kunnen sneller presteren dan andere.
  • Veiligheid – Sommige DNS-servers kunnen meer beveiligingsmaatregelen hebben dan andere die kapingen en aanvallen voorkomen.
  • Beschikbaarheid van records – In de meeste scenario’s hebben organisaties hun eigen interne DNS-servers die de zones en records bevatten voor namen die alleen intern worden opgelost. In dit geval zal het opzoeken van een interne naam met behulp van een openbare DNS-server mislukken.
DNS record lookup failure
  • DNS-servers sturen geen verzoeken door – Sommige organisaties staan geen DNS-doorsturing toe. Het gebruik ervan voor het opzoeken van openbare DNS-records zal mislukken.
  • Probleemoplossing en testen – Als je favoriete DNS-servers problemen vertonen, wil je mogelijk je opzoekingen testen met behulp van een andere DNS-server.

Rapportage van DNS-records met PowerShell-script

Nu je de basisprincipes hebt geleerd van het gebruik van de Resolve-DnsName-cmdlet, leer je in dit gedeelte een PowerShell-script te maken om DNS-records te monitoren en rapporteren. Je zou in staat moeten zijn om de kennis die je tot nu toe hebt opgedaan in de vorige secties toe te passen bij het bouwen van dit script.

Start je scripteditor naar keuze en maak een nieuw bestand met de naam GetDnsRecord.ps1.

Definieer de variabelen

Bepaal eerst de variabelen die je wilt gebruiken. Deze variabelen zullen het volgende bevatten:

  • $NameList – Deze variabele bevat de namen van de DNS-records die je script moet opvragen
  • $Serverlist – Gebruik deze variabele om de DNS-servers aan te geven die door het script zullen worden gebruikt voor opzoekingen.

Kopieer de onderstaande code en plak deze aan het begin van je script.

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

Uitvoeren van DNS-opzoekingen

Volgende, de code moet in staat zijn om de DNS-record van elk van de opgegeven namen op te zoeken. In dit geval zal de foreach-lus worden gebruikt om de lijst met records te doorlopen en voor elke naam op te zoeken met behulp van Resolve-DnsName.

De regel $FinalResult = @() maakt een lege array aan waar het uiteindelijke resultaat zal worden opgeslagen. Vervolgens, met behulp van de foreach-lus, doorloopt PowerShell elk item in de variabele $NameList naar een variabele genaamd $Name.

In elke iteratie wordt de regel $tempObj = "" | Select-Object Name,IPAddress,Status,ErrorMessage gebruikt om een tijdelijk object met vier eigenschappen aan te maken om het resultaat van het volgende DNS-opzoekingsresultaat vast te houden.

Vervolgens wordt de try{}-verklaring gebruikt om het Resolve-DnsName-commando uit te voeren om DNS-A-records op te zoeken en de waarden van $tempObj in te vullen. Als het DNS-opzoekingsresultaat mislukt, vangt de catch{}-verklaring de fout op en wordt de fout opgenomen in het object $tempObj.

Aan het einde van elke iteratie wordt de waarde van het object $tempObj toegevoegd aan de $FinalResult. En zodra het laatste item in de array $NameList is verwerkt, zal de lus stoppen. Vervolgens wordt de waarde van $FinalResult weergegeven.

Kopieer de onderstaande code en plak deze aan het einde van uw script. Er is geen noodzaak om waarden te wijzigen.

$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

Nadat het script is opgeslagen, voer het uit in PowerShell door de naam GetDnsRecord.ps1 te bellen. De demonstratie hieronder toont de uitvoer.

Script to lookup multiple DNS records using Resolve-DnsName

Zoals je kunt zien aan het bovenstaande resultaat, is de uitvoer een object dat handig is als je de resultaten wilt exporteren naar een bestand zoals CSV met behulp van de onderstaande opdracht.

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

De CSV-uitvoer zou er vergelijkbaar uitzien als hieronder.

DNS record lookup report exported to a CSV file

Conclusie

In dit artikel heb je de basisprincipes geleerd van hoe je de cmdlet Resolve-DnsName kunt gebruiken om DNS-records op te zoeken in PowerShell. Je hebt ook geleerd hoe Resolve-DnsName verschilt van andere tools zoals het nslookup-hulpprogramma.

Je hebt gezien hoe Resolve-DnsName kan worden gebruikt in een script om de DNS-recordopzoeking te automatiseren. Dit zou handig zijn als een monitoringstool om ervoor te zorgen dat je op de hoogte bent van de huidige status van de DNS-records die je beheert.

Met je PowerShell-scriptingvaardigheden kan het rapportagescript verder worden verbeterd door code toe te voegen om automatisch het rapport per e-mail te verzenden naar opgegeven ontvangers. Het kan ook worden aangepast om een visueel aantrekkelijke HTML-uitvoer te genereren.

Uiteindelijk is Resolve-DnsName een uitstekende tool voor DNS-opzoekingen, of je het nu handmatig gebruikt of voor automatisering in scripts. Nu heb je kennis over hoe het werkt, en het is aan jou om manieren te vinden om het te gebruiken als onderdeel van je beheertaken.

Verder lezen

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