Risolvi-NomeDns: Ricerca del record DNS principale in PowerShell

Se stai gestendo server web o di posta, sai quanto sia importante avere record DNS adeguatamente configurati. La mancanza di record DNS può causare una serie di problemi, tra cui gli utenti che non riescono a trovare il tuo sito web o la non consegna delle email. È una cosa positiva che esista il cmdlet Resolve-DnsName di PowerShell, con il quale è possibile automatizzare il monitoraggio dei record DNS tramite scripting.

La giornata di un amministratore è già abbastanza piena, e controllare manualmente se i record DNS possono essere risolti correttamente significa più sforzo manuale.

In questo articolo, imparerai cosa e come utilizzare il cmdlet Resolve-DnsName per interrogare i record DNS con PowerShell. Alla fine di questo articolo, avrai anche imparato come creare uno script di base per creare un rapporto dei tuoi record DNS nominati da monitorare.

Prerequisiti

Questo articolo è una guida pratica e, se hai intenzione di seguirla con gli esempi, avrai bisogno di:

Resolve-DnsName: Il risolutore DNS di PowerShell

Esistono più modi per effettuare una query DNS. Il cmdlet Resolve-DnsName è simile al nslookup strumento da riga di comando incluso in Windows o al dig comando se sei più orientato a Linux.

Alcuni siti web offrono servizi di monitoraggio/rapporto dei record DNS. Ma, questi servizi di terze parti sono per lo più a pagamento, ovviamente. C’è un’alternativa gratuita, che ti permette anche di mostrare le tue competenze di scripting!

Il cmdlet Resolve-DnsName, come suggerisce il nome, risolve i nomi DNS in indirizzi IP e viceversa. Questo cmdlet fa parte del modulo PowerShell dnsclient che, al momento della stesura di questo testo, viene fornito con Windows 10, Windows Server 2012/R2, Windows Server 2016 e Windows Server 2019.

Poiché Resolve-DnsName è un cmdlet di PowerShell, restituisce i risultati come oggetti che possono essere archiviati, manipolati ed esportati. Ad esempio, cercando il record DNS di google.com utilizzando il comando Resolve-DnsName google.com ti darà l’output mostrato di seguito.

DNS Record lookup result using Resolve-DnsName

Il risultato è stato restituito come un oggetto che ti permette di esportare i risultati in un file CSV, o manipolare il formato per produrre rapporti in HTML.

Il cmdlet Resolve-DnsName è diverso dall’utility “vecchia scuola” nslookup. nslookup restituisce una semplice stringa. Puoi vedere un esempio nella seguente immagine. Se hai bisogno di estrarre qualsiasi informazione da questa stringa, sarà una lotta.

DNS record lookup result using nslookup

Interrogare Diversi Tipi di Record DNS

Per impostazione predefinita, il comando Resolve-DnsName interroga i tipi di record DNS A e AAAA. Ad esempio, se si cerca il record DNS per gmail.com utilizzando il comando seguente:

Resolve-DnsName -Name gmail.com

Come si può vedere di seguito, vengono restituiti solo i record AAAA e A. Ciò è dovuto al fatto che non è stato specificato il tipo di record DNS da cercare.

DNS record for gmail.com

Ora, dato che sappiamo tutti che gmail.com è un dominio email utilizzato dal servizio email di Google, ci deve essere un record MX associato, giusto? Beh, non c’è bisogno di supporre quando è possibile confermare utilizzando questo comando:

Resolve-DnsName -Name gmail.com -Type MX

L’output mostrato nella schermata sottostante mostra l’elenco dei record MX per gmail.com.

MX Record list of gmail.com

Per saperne di più sui diversi tipi di record che possono essere utilizzati con Resolve-DnsName, visita questo link e cerca la tabella per il parametro -Type. Oppure puoi fare riferimento all’aiuto di Resolve-DnsName utilizzando il comando get-help Resolve-DnsName.

Utilizzo di Server Specifici per la Ricerca DNS

Resolve-DnsName utilizza per impostazione predefinita gli indirizzi del server DNS configurati sul tuo computer. Tuttavia, puoi anche fare in modo che Resolve-DnsName utilizzi un server DNS specifico durante le ricerche.

Ad esempio, se desideri utilizzare Google Public DNS per cercare i record, puoi farlo aggiungendo il parametro -Server nel tuo comando, come nell’esempio seguente.

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

Il risultato del comando sarebbe simile a quello mostrato nell’immagine di seguito.

DNS record lookup results using a specific DNS servers

A questo punto, potresti chiederti: “perché dovrei utilizzare un server DNS diverso?”. Questa è una domanda valida. Se provi a cercare lo stesso record utilizzando il server DNS predefinito del tuo computer o un altro server DNS, probabilmente otterrai lo stesso risultato.

Ci potrebbero essere molte ragioni per utilizzare server DNS diversi con Resolve-DnsName. Alcuni di questi motivi potrebbero includere:

  • Velocità – Alcuni server DNS possono essere più veloci di altri.
  • Sicurezza – Alcuni server DNS possono avere misure di sicurezza più avanzate rispetto ad altri per prevenire hijack e attacchi.
  • Disponibilità dei record – Nella maggior parte dei casi, le organizzazioni hanno i propri server DNS interni che contengono le zone e i record per i nomi che vengono risolti solo internamente. In questo caso, la ricerca di un nome interno utilizzando un server DNS pubblico non avrà successo.
DNS record lookup failure
  • I server DNS non inoltrano le richieste – Alcune organizzazioni non consentono l’inoltro DNS. L’utilizzo di tali server per la ricerca di record DNS pubblici non avrà successo.
  • Risoluzione dei problemi e testing – Quando i tuoi server DNS preferiti non funzionano correttamente, potresti voler testare le tue ricerche utilizzando un diverso server DNS.

Segnalazione dei record DNS utilizzando uno script PowerShell

Ora che hai imparato le basi su come utilizzare il cmdlet Resolve-DnsName, in questa sezione imparerai a creare uno script PowerShell per monitorare e segnalare i record DNS. Dovresti essere in grado di applicare le conoscenze acquisite nelle sezioni precedenti per costruire questo script.

Avvia il tuo editor di script preferito e crea un nuovo file chiamato GetDnsRecord.ps1.

Definizione delle variabili

Innanzitutto, determina le variabili da utilizzare. Queste variabili includeranno le seguenti:

  • $NameList – Questa variabile conterrà i nomi dei record DNS che desideri che il tuo script interroghi
  • $Serverlist – Utilizza questa variabile per indicare i server DNS che verranno utilizzati dallo script per le ricerche.

Copia il codice di seguito e incollalo all’inizio del tuo script.

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

Esecuzione delle ricerche DNS

Successivamente, il codice deve essere in grado di cercare il record DNS di ciascuno dei nomi specificati. In questo caso, verrà utilizzato il ciclo foreach per iterare l’elenco dei record e cercare ciascun nome utilizzando Resolve-DnsName.

La riga $FinalResult = @() crea un array vuoto in cui verrà memorizzato il risultato finale. Quindi, utilizzando il ciclo foreach, PowerShell passa ogni elemento nella variabile $NameList a una variabile chiamata $Name.

In ogni iterazione, la riga $tempObj = "" | Select-Object Name,IPAddress,Status,ErrorMessage crea un oggetto temporaneo con quattro proprietà per contenere il risultato della ricerca DNS.

Successivamente, lo statement try{} viene utilizzato per eseguire il comando Resolve-DnsName per cercare i record A del DNS e popolare i valori di $tempObj. Nel caso in cui la ricerca DNS non riesca, lo statement catch{} cattura l’errore e l’errore verrà incluso nell’oggetto $tempObj.

Alla fine di ogni iterazione, il valore dell’oggetto $tempObj verrà aggiunto a $FinalResult. E una volta elaborato l’ultimo elemento dell’array $NameList, il ciclo uscirà. Quindi, verrà visualizzato il valore di $FinalResult.

Copia il codice di seguito e incollalo alla fine del tuo script. Non è necessario modificare alcun valore.

$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

Dopo aver salvato lo script, eseguilo in PowerShell chiamandolo con il suo nome GetDnsRecord.ps1. La dimostrazione seguente mostra l’output.

Script to lookup multiple DNS records using Resolve-DnsName

Come puoi vedere dal risultato sopra, l’output è un oggetto utile se desideri esportare i risultati in un file come CSV usando il comando seguente.

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

L’output CSV assomiglierebbe a quello qui sotto.

DNS record lookup report exported to a CSV file

Conclusion

In questo articolo, hai imparato le basi su come utilizzare il cmdlet Resolve-DnsName per eseguire la ricerca dei record DNS in PowerShell. Hai anche appreso come Resolve-DnsName è diverso da altri strumenti come l’utilità nslookup.

Hai visto come Resolve-DnsName può essere utilizzato in uno script per automatizzare la ricerca dei record DNS. Questo sarebbe utile come strumento di monitoraggio per assicurarti di essere a conoscenza dello stato attuale dei record DNS che gestisci.

Utilizzando le tue abilità di scripting di PowerShell, lo script di report può essere ulteriormente migliorato aggiungendo codice per inviare automaticamente il report via email ai destinatari specificati. Può anche essere modificato per creare un output HTML visivamente piacevole.

Alla fine, Resolve-DnsName è uno strumento eccellente per la ricerca DNS, che tu lo utilizzi manualmente o per l’automazione negli script. Ora hai la conoscenza su come funziona, ed è a te trovare modi per utilizzarlo come parte dei tuoi compiti di amministrazione.

Ulteriori letture

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