Come cercare nella cache DNS in modo efficiente con PowerShell: una guida completa

Nel mondo interconnesso di oggi, i professionisti IT devono spesso indagare e gestire diversi problemi legati alla rete. Uno degli aspetti critici della risoluzione dei problemi di rete è la comprensione delle query DNS (Domain Name System) e la risoluzione dei problemi relativi al DNS.

Il DNS è il protocollo responsabile della traduzione dei nomi di dominio di facile utilizzo in indirizzi IP che i computer utilizzano per comunicare tra loro. In questo contesto, la ricerca di record specifici nella cache DNS può essere un compito essenziale per gli amministratori di rete e i Managed Service Provider (MSP).

In questo articolo analizziamo uno script PowerShell progettato per cercare nella cache DNS i nomi dei record che corrispondono a parole chiave specificate. Faremo una panoramica sul background, sul suo funzionamento, e parleremo delle sue applicazioni reali e del perché si tratta uno strumento prezioso per i professionisti IT.

L’importanza della gestione della cache DNS

Prima di entrare nei dettagli dello script, è fondamentale comprendere l’importanza della gestione della cache DNS. La cache DNS è un database temporaneo gestito dal sistema operativo che memorizza i record di tutte le visite recenti e dei tentativi di visita a siti web e altri domini Internet. Questa cache consente di accedere più rapidamente ai siti visitati di frequente, riducendo la necessità di ripetere le ricerche DNS e migliorando così l’efficienza della navigazione.

Tuttavia, questa cache può talvolta contenere record obsoleti o errati, causando problemi di accesso al sito web o vulnerabilità di sicurezza. È qui che la capacità di cercare e gestire la cache DNS diventa fondamentale. Lo script di cui parleremo oggi fornisce un modo semplificato per cercare e analizzare i record della cache DNS, ed è uno strumento indispensabile per i professionisti IT.

Lo script per cercare nella cache DNS:

#Requires -Version 5.1

<#
.SYNOPSIS
    Search for DNS cache record names that match the specified keywords.
.DESCRIPTION
    Search for DNS cache record names that match the specified keywords.
    The DNS cache is a temporary database maintained by the operating system that contains records of all the recent visits and attempted visits to websites and other internet domains.
    This script searches the DNS cache for record names that match the specified keywords and outputs the results to the Activity Feed.
    Optionally, the results can be saved to a multiline custom field.

PARAMETER: -Keywords "ExampleInput"
    Comma separated list of keywords to search for in the DNS cache.
.EXAMPLE
    -Keywords "arpa"
    ## EXAMPLE OUTPUT WITH Keywords ##
    Entry: 1.80.19.172.in-addr.arpa, Record Name: 1.80.19.172.in-addr.arpa., Record Type: 12, Data: test.mshome.net, TTL: 598963

PARAMETER: -Keywords "arpa,mshome" -MultilineCustomField "ReplaceMeWithAnyMultilineCustomField"
    The name of the multiline custom field to save the results to.
.EXAMPLE
    -Keywords "arpa,mshome" -MultilineCustomField "ReplaceMeWithAnyMultilineCustomField"
    ## EXAMPLE OUTPUT WITH MultilineCustomField ##
    Entry: 1.80.19.172.in-addr.arpa, Record Name: 1.80.19.172.in-addr.arpa., Record Type: 12, Data: test.mshome.net, TTL: 598963
    Entry: test.mshome.net, Record Name: test.mshome.net., Record Type: 1, Data: 172.19.80.1, TTL: 598963

.NOTES
    Minimum OS Architecture Supported: Windows 10, Windows Server 2016
    Release Notes: Initial Release
By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://ninjastage2.wpengine.com/terms-of-use.
    Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. 
    Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. 
    Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. 
    Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. 
    Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. 
    Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. 
    EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).
#>

[CmdletBinding()]
param (
    [Parameter()]
    [String[]]$Keywords,
    [Parameter()]
    [String]$MultilineCustomField
)

begin {
    $ExitCode = 0
    function Set-NinjaProperty {
        [CmdletBinding()]
        Param(
            [Parameter(Mandatory = $True)]
            [String]$Name,
            [Parameter()]
            [String]$Type,
            [Parameter(Mandatory = $True, ValueFromPipeline = $True)]
            $Value,
            [Parameter()]
            [String]$DocumentName
        )
    
        $Characters = $Value | Measure-Object -Character | Select-Object -ExpandProperty Characters
        if ($Characters -ge 10000) {
            throw [System.ArgumentOutOfRangeException]::New("Character limit exceeded, value is greater than 10,000 characters.")
        }
        
        # If we're requested to set the field value for a Ninja document we'll specify it here.
        $DocumentationParams = @{}
        if ($DocumentName) { $DocumentationParams["DocumentName"] = $DocumentName }
        
        # This is a list of valid fields that can be set. If no type is given, it will be assumed that the input doesn't need to be changed.
        $ValidFields = "Attachment", "Checkbox", "Date", "Date or Date Time", "Decimal", "Dropdown", "Email", "Integer", "IP Address", "MultiLine", "MultiSelect", "Phone", "Secure", "Text", "Time", "URL", "WYSIWYG"
        if ($Type -and $ValidFields -notcontains $Type) { Write-Warning "$Type is an invalid type! Please check here for valid types. https://ninjarmm.zendesk.com/hc/en-us/articles/16973443979789-Command-Line-Interface-CLI-Supported-Fields-and-Functionality" }
        
        # The field below requires additional information to be set
        $NeedsOptions = "Dropdown"
        if ($DocumentName) {
            if ($NeedsOptions -contains $Type) {
                # We'll redirect the error output to the success stream to make it easier to error out if nothing was found or something else went wrong.
                $NinjaPropertyOptions = Ninja-Property-Docs-Options -AttributeName $Name @DocumentationParams 2>&1
            }
        }
        else {
            if ($NeedsOptions -contains $Type) {
                $NinjaPropertyOptions = Ninja-Property-Options -Name $Name 2>&1
            }
        }
        
        # If an error is received it will have an exception property, the function will exit with that error information.
        if ($NinjaPropertyOptions.Exception) { throw $NinjaPropertyOptions }
        
        # The below type's require values not typically given in order to be set. The below code will convert whatever we're given into a format ninjarmm-cli supports.
        switch ($Type) {
            "Checkbox" {
                # While it's highly likely we were given a value like "True" or a boolean datatype it's better to be safe than sorry.
                $NinjaValue = [System.Convert]::ToBoolean($Value)
            }
            "Date or Date Time" {
                # Ninjarmm-cli expects the GUID of the option to be selected. Therefore, the given value will be matched with a GUID.
                $Date = (Get-Date $Value).ToUniversalTime()
                $TimeSpan = New-TimeSpan (Get-Date "1970-01-01 00:00:00") $Date
                $NinjaValue = $TimeSpan.TotalSeconds
            }
            "Dropdown" {
                # Ninjarmm-cli is expecting the guid of the option we're trying to select. So we'll match up the value we were given with a guid.
                $Options = $NinjaPropertyOptions -replace '=', ',' | ConvertFrom-Csv -Header "GUID", "Name"
                $Selection = $Options | Where-Object { $_.Name -eq $Value } | Select-Object -ExpandProperty GUID
        
                if (-not $Selection) {
                    throw [System.ArgumentOutOfRangeException]::New("Value is not present in dropdown")
                }
        
                $NinjaValue = $Selection
            }
            default {
                # All the other types shouldn't require additional work on the input.
                $NinjaValue = $Value
            }
        }
        
        # We'll need to set the field differently depending on if its a field in a Ninja Document or not.
        if ($DocumentName) {
            $CustomField = Ninja-Property-Docs-Set -AttributeName $Name -AttributeValue $NinjaValue @DocumentationParams 2>&1
        }
        else {
            $CustomField = Ninja-Property-Set -Name $Name -Value $NinjaValue 2>&1
        }
        
        if ($CustomField.Exception) {
            throw $CustomField
        }
    }
}
process {
    # Get the keywords to search for in the DNS cache
    $Keywords = if ($env:keywordsToSearch -and $env:keywordsToSearch -ne "null") {
        $env:keywordsToSearch -split "," | ForEach-Object { $_.Trim() }
    }
    else {
        $Keywords -split "," | ForEach-Object { $_.Trim() }
    }
    $Keywords = if ($Keywords -and $Keywords -ne "null") {
        $Keywords | ForEach-Object {
            Write-Host "[Info] Searching for DNS Cache Records Matching: $_"
            Write-Output "*$_*"
        }
    }
    else {
        # Exit if Keywords is empty
        Write-Host "[Error] No Keywords Provided"
        $ExitCode = 1
        exit $ExitCode
    }
    # Get the multiline custom field to save the results to
    $MultilineCustomField = if ($env:multilineCustomField -and $env:multilineCustomField -ne "null") {
        $env:multilineCustomField -split "," | ForEach-Object { $_.Trim() }
    }
    else {
        $MultilineCustomField -split "," | ForEach-Object { $_.Trim() }
    }

    Write-Host ""

    # Get the DNS cache entries that match the keywords
    $DnsCache = Get-DnsClientCache -Name $Keywords | Select-Object -Property Entry, Name, Type, Data, TimeToLive

    if ($null -eq $DnsCache) {
        Write-Host "[Warn] No DNS Cache Entries Found"
    }
    else {
        # Format the DNS cache entries
        $Results = $DnsCache | ForEach-Object {
            "Entry: $($_.Entry), Record Name: $($_.Name), Record Type: $($_.Type), Data: $($_.Data), TTL: $($_.TimeToLive)"
        }
        Write-Host "[Info] DNS Cache Entries Found"
        # Save the results to a multiline custom field if specified
        if ($MultilineCustomField -and $MultilineCustomField -ne "null") {
            Write-Host "[Info] Attempting to set Custom Field '$MultilineCustomField'."
            try {
                Set-NinjaProperty -Name $MultilineCustomField -Value $($Results | Out-String)
                Write-Host "[Info] Successfully set Custom Field '$MultilineCustomField'!"
            }
            catch {
                Write-Host "[Warn] Failed to set Custom Field '$MultilineCustomField'."
                $Results | Out-String | Write-Host
            }
        }
        else {
            # Output the results to the Activity Feed
            $Results | Out-String | Write-Host
        }
    }
    exit $ExitCode
}
end {
    
    
    
}

 

Una descrizione dettagliata dello script

Analizziamo lo script per cercare nella cache DNS per capire come funziona e quali funzionalità offre.

1. Inizializzazione dello script:

  • Lo script per cercare nella cache DNS inizia impostando i parametri che consentono agli utenti di specificare le parole chiave per la ricerca nella cache DNS. Queste parole chiave sono inserite in un elenco separato da virgole.
  • Un parametro opzionale consente agli utenti di salvare i risultati in un campo personalizzato multilinea. Questo è particolarmente utile per scopi di logging e documentazione.

2. Elaborazione delle parole chiave:

  • Lo script per cercare nella cache DNS elabora le parole chiave fornite, assicurandosi che siano formattate correttamente per l’operazione di ricerca. Se non vengono fornite parole chiave, lo script uscirà con un errore, assicurandosi che gli utenti siano consapevoli della mancanza di input.

3. Recupero della cache DNS:

  • Il cuore dello script per cercare nella cache DNS consiste nel recuperare le voci della cache DNS utilizzando il cmdlet Get-DnsClientCache. Questo cmdlet recupera dalla cache locale i record DNS che corrispondono alle parole chiave specificate.
  • I risultati vengono quindi formattati in modo da visualizzare la voce, il nome del record, il tipo di record, i dati e il Time-To-Live (TTL) per ogni record DNS trovato.

4. Gestione dell’output:

  • Se viene specificato il campo personalizzato multilinea opzionale, lo script per cercare nella cache DNS tenta di salvare i risultati in questo campo utilizzando una funzione personalizzata chiamata Set-NinjaProperty. Questa funzione gestisce vari tipi di dati di input e assicura che il campo venga aggiornato correttamente.
  • Se il campo personalizzato non è specificato, i risultati vengono semplicemente inviati al feed delle attività, consentendo una rapida revisione e analisi.

Casi d’uso concreti

Come esempio dell’utilità di questo script per cercare nella cache DNS, immagina uno scenario in cui un professionista IT sta risolvendo un problema di rete per un cliente. Il cliente segnala problemi di connettività intermittenti con alcuni siti web. Il professionista IT sospetta che il problema sia causato da voci della cache DNS obsolete o errate.

Utilizzando questo script PowerShell, il professionista IT può cercare nella cache DNS, rapidamente, tutti i record relativi ai siti Web problematici. Identificando questi record, può determinare se la cache DNS deve essere svuotata o se è necessario aggiornare voci specifiche. Questo approccio mirato consente di risparmiare tempo e di risolvere in modo efficiente i problemi di rete del cliente.

Confronto con altri metodi

Questo script PowerShell offre un approccio più automatizzato e personalizzabile per cercare nella cache DNS rispetto ad altri metodi manuali. Sebbene sia possibile ispezionare manualmente le voci della cache DNS utilizzando il comando ipconfig /displaydnscommand, questo approccio può essere macchinoso e richiedere molto tempo, soprattutto quando si tratta di cache di grandi dimensioni o di più parole chiave.

Inoltre, la possibilità di salvare i risultati in un campo personalizzato per una successiva revisione o documentazione distingue questo script per cercare nella cache DNS dai metodi più semplici, rendendolo più versatile per l’uso professionale.

Domande frequenti

Quali sistemi operativi supportano questo script?

Questo script per cercare nella cache DNS è compatibile con Windows 10 e Windows Server 2016 o versioni successive.

Cosa succede se non vengono fornite parole chiave?

Lo script per cercare nella cache DNS uscirà con un errore, informando l’utente che sono necessarie delle parole chiave per eseguire la ricerca.

I risultati possono essere salvati per un uso successivo?

Sì, i risultati possono essere salvati in un campo personalizzato multilinea, che può essere utile per la documentazione o per ulteriori analisi.

Implicazioni per la sicurezza delle ricerche nella cache DNS

Cercare nella cache DNS non aiuta solo nella risoluzione dei problemi, ma ha anche implicazioni significative per la sicurezza. Monitorando regolarmente le voci della cache DNS, i professionisti IT possono rilevare voci potenzialmente dannose o modelli insoliti che potrebbero indicare una violazione di sicurezza o un tentativo di phishing. Questo approccio proattivo alla gestione del DNS è un aspetto cruciale per mantenere un ambiente di rete sicuro.

Raccomandazioni per l’utilizzo di questo script

Quando utilizzi questo script per cercare nella cache DNS, tieni a mente le seguenti best practice:

  • Monitora regolarmente la cache DNS per assicurarti che le voci siano aggiornate e prive di record potenzialmente dannosi.
  • Documenta qualsiasi risultato significativo salvando i risultati in un campo personalizzato, a cui fare riferimento per la risoluzione dei problemi o per gli audit di sicurezza futuri.
  • Usa questo script per cercare nella cache DNS in combinazione con altri strumenti di gestione DNS per ottenere un approccio completo alla sicurezza e alle prestazioni DNS.

Considerazioni finali

Gestire efficacemente la cache DNS è un compito fondamentale per i professionisti IT e gli MSP, e questo script PowerShell per cercare nella cache DNS offre un potente strumento per semplificare questo processo. Grazie alla possibilità di effettuare ricerche rapide e mirate sulle voci della cache DNS, i team IT possono risolvere i problemi di rete in modo più efficiente e migliorare la sicurezza generale della rete.

NinjaOne, leader nelle soluzioni di gestione IT, fornisce gli strumenti necessari per automatizzare e ottimizzare queste attività, assicurando che i professionisti IT possano mantenere ambienti di rete efficienti, solidi e sicuri. Questo script è solo un esempio di come l’automazione e uno scripting attento possano migliorare le operazioni IT e la fornitura di servizi.

Passi successivi

La creazione di un team IT efficiente ed efficace richiede una soluzione centralizzata che funga da principale strumento per la fornitura di servizi. NinjaOne consente ai team IT di monitorare, gestire, proteggere e supportare tutti i dispositivi, ovunque essi si trovino, senza la necessità di una complessa infrastruttura locale.

Per saperne di più sulla distribuzione remota di script con NinjaOne, fai un tour dal vivo, o inizia la tua prova gratuita della piattaforma NinjaOne.

Categorie:

Ti potrebbe interessare anche

×

Guarda NinjaOne in azione!

Inviando questo modulo, accetto La politica sulla privacy di NinjaOne.

Termini e condizioni NinjaOne

Cliccando sul pulsante “Accetto” qui sotto, dichiari di accettare i seguenti termini legali e le nostre condizioni d’uso:

  • Diritti di proprietà: NinjaOne possiede e continuerà a possedere tutti i diritti, i titoli e gli interessi relativi allo script (compreso il copyright). NinjaOne ti concede una licenza limitata per l’utilizzo dello script in conformità con i presenti termini legali.
  • Limitazione d’uso: Puoi utilizzare lo script solo per legittimi scopi personali o aziendali interni e non puoi condividere lo script con altri soggetti.
  • Divieto di ripubblicazione: In nessun caso ti è consentito ripubblicare lo script in una libreria di script appartenente o sotto il controllo di un altro fornitore di software.
  • Esclusione di garanzia: Lo script viene fornito “così com’è” e “come disponibile”, senza garanzie di alcun tipo. NinjaOne non promette né garantisce che lo script sia privo di difetti o che soddisfi le tue esigenze o aspettative specifiche.
  • Assunzione del rischio: L’uso che farai dello script è da intendersi a tuo rischio. Riconosci che l’utilizzo dello script comporta alcuni rischi intrinseci, che comprendi e sei pronto ad assumerti.
  • Rinuncia e liberatoria: Non riterrai NinjaOne responsabile di eventuali conseguenze negative o indesiderate derivanti dall’uso dello script e rinuncerai a qualsiasi diritto legale o di equità e a qualsiasi rivalsa nei confronti di NinjaOne in relazione all’uso dello script.
  • EULA: Se sei un cliente NinjaOne, l’uso dello script è soggetto al Contratto di licenza con l’utente finale (EULA) applicabile.