Guida completa al monitoraggio dei lease DHCP con PowerShell

Vuoi saperne di più sulle notifiche dei lease DHCP per PowerShell? Questo articolo spiegherà perché il monitoraggio e la gestione degli ambiti DHCP è un compito fondamentale per i professionisti IT e i Managed Service Provider (MSP). Assicurarsi che i server DHCP funzionino in modo efficiente e che ci sia un numero sufficiente di indirizzi IP disponibili nel pool può prevenire problemi di rete e garantire una connettività continua.

Questo post articolo analizza uno script PowerShell progettato per monitorare gli ambiti DHCP, avvisando gli amministratori quando il numero di lease disponibili scende al di sotto di una soglia specificata. Lo script è uno strumento essenziale per mantenere l’affidabilità della rete ed evitare potenziali interruzioni.

Background

Il Dynamic Host Configuration Protocol (DHCP) è un protocollo di gestione della rete utilizzato per automatizzare il processo di configurazione dei dispositivi sulle reti IP. Senza DHCP, ogni dispositivo della rete dovrebbe essere assegnato manualmente a un indirizzo IP. Data la natura dinamica delle reti moderne, i server DHCP sono spesso sottoposti a una costante richiesta di fornire indirizzi IP.

È fondamentale monitorare tali server e assicurarsi che abbiano a disposizione un numero sufficiente di lease. Lo script PowerShell fornito risponde a questa esigenza controllando gli ambiti DHCP e avvisando gli amministratori se il numero di lease liberi scende sotto una certa soglia.

Lo script per le notifiche dei lease DHCP:

#Requires -Version 5.1

<#
.SYNOPSIS
    Checks the DHCP scopes for the number of leases used and alerts if the threshold is exceeded.
.DESCRIPTION
    Checks the DHCP scopes for the number of leases used and alerts if the threshold is exceeded.
    This script requires the DhcpServer module to be installed with the DHCP server feature installed.
    The script will output the number of leases used, free, and total for each scope.
    If the LeaseThreshold parameter is set, the script will alert if the number of free leases is less than the threshold.
    If the ExcludeScope parameter is set, the script will exclude the specified scope from the output.
    If the IncludeScope parameter is set, the script will only include the specified scope in the output.

.PARAMETER LeaseThreshold
    The number of free leases that will trigger an alert. If the number of free leases is less than the threshold, an alert will be triggered.
.PARAMETER ExcludeScope
    The name of the scope to exclude from the output.
.PARAMETER IncludeScope
    The name of the scope to include in the output.

.EXAMPLE
    (No Parameters)
    ## EXAMPLE OUTPUT WITHOUT PARAMS ##
    [Info] Scope: Test1 Leases Used(In Use/Total): 250/252
    [Info] Scope: Test2 Leases Used(In Use/Total): 220/252
    [Info] Scope: Test6 Leases Used(In Use/Total): 4954378/18446744073709551615

.EXAMPLE
    PARAMETER: -LeaseThreshold 10
    ## EXAMPLE OUTPUT WITH LEASETHRESHOLD ##
    [Alert] Scope: Test1 Leases Used(In Use/Free/Total): 220/2/252
    [Info] Scope: Test2 Leases Used(In Use/Free/Total): 150/102/252
    [Info] Scope: Test6 Leases Used(In Use/Free/Total): 0/18446744073709551615/18446744073709551615

.EXAMPLE
    PARAMETER: -ExcludeScope "Test1"
    ## EXAMPLE OUTPUT WITH EXCLUDESCOPE ##
    [Info] Scope: Test2 Leases Used(In Use/Free/Total): 220/2/252
    [Info] Scope: Test6 Leases Used(In Use/Free/Total): 0/18446744073709551615/18446744073709551615

.EXAMPLE
    PARAMETER: -IncludeScope "Test2"
    ## EXAMPLE OUTPUT WITH INCLUDESCOPE ##
    [Info] Scope: Test2 Leases Used(In Use/Free/Total): 220/2/252
.NOTES
    Minimum OS: Windows Server 2016
    Requires the DhcpServer module to be installed with the DHCP server feature installed.
    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://www.ninjaone.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 (
    $LeaseThreshold,
    [string[]]$ExcludeScope,
    [string[]]$IncludeScope
)

begin {
    function Test-IsElevated {
        # check if running under a Pester test case
        $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()
        $p = New-Object System.Security.Principal.WindowsPrincipal($id)
        $p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)
    }

    try {
        if ($env:leaseThreshold -and $env:leaseThreshold -notlike "null") {
            [int]$LeaseThreshold = $env:leaseThreshold
        }
    }
    catch {
        Write-Host "[Error] LeaseThreshold must be a number"
        exit 2
    }
    
    if ($env:excludeScope -and $env:excludeScope -notlike "null") {
        $ExcludeScope = $env:excludeScope
    }
    if ($env:includeScope -and $env:includeScope -notlike "null") {
        $IncludeScope = $env:includeScope
    }

    # Split the ExcludeScope and IncludeScope parameters into an array
    if (-not [String]::IsNullOrWhiteSpace($ExcludeScope) -and $ExcludeScope -like '*,*') {
        $ExcludeScope = $ExcludeScope -split ',' | ForEach-Object { $_.Trim() } | Where-Object { -not [String]::IsNullOrWhiteSpace($_) } | Sort-Object -Unique
    }
    if (-not [String]::IsNullOrWhiteSpace($IncludeScope) -and $IncludeScope -like '*,*') {
        $IncludeScope = $IncludeScope -split ',' | ForEach-Object { $_.Trim() } | Where-Object { -not [String]::IsNullOrWhiteSpace($_) } | Sort-Object -Unique
    }

    # Check if $ExcludeScope and $IncludeScope contain similar items
    if (-not [String]::IsNullOrWhiteSpace($ExcludeScope) -and -not [String]::IsNullOrWhiteSpace($IncludeScope)) {
        $SimilarItems = $ExcludeScope | Where-Object { $IncludeScope -contains $_ }
        if ($SimilarItems) {
            Write-Host "[Error] The following scopes are in both ExcludeScope and IncludeScope: $($SimilarItems -join ', ')"
            exit 2
        }
    }

    $ShouldAlert = $false
}
process {
    if (-not (Test-IsElevated)) {
        Write-Host "[Error] Access Denied. Please run with Administrator privileges."
        exit 2
    }

    # Check if the DhcpServer module is installed
    if (-not (Get-Module -ListAvailable -Name DhcpServer -ErrorAction SilentlyContinue)) {
        Write-Host "[Error] The DhcpServer module is not installed. Please install the DHCP server feature and the DhcpServer module."
        exit 2
    }

    # Get all DHCP scopes
    $AllScopes = $(
        Get-DhcpServerv4Scope | Select-Object -ExpandProperty Name
        Get-DhcpServerv6Scope | Select-Object -ExpandProperty Name
    )

    # Output an error if the ExcludeScope or IncludeScope parameters contain invalid scope names
    $(
        if ($IncludeScope) { $IncludeScope }
        if ($ExcludeScope) { $ExcludeScope }
    ) | ForEach-Object {
        if ($_ -notin $AllScopes) {
            Write-Host "[Error] Scope: $_ does not exist in the DHCP server. Please check the scope name and try again."
        }
    }

    # IPv4
    # Get all DHCP scopes
    $v4scopes = Get-DhcpServerv4Scope | Where-Object { $_.State }

    # Iterate through each scope
    foreach ($scope in $v4scopes) {
        # Get statistics for the scope
        $Stats = Get-DhcpServerv4ScopeStatistics -ScopeId $scope.ScopeId

        # Get the name of the scope
        $Name = (Get-DhcpServerv4Scope -ScopeId $scope.ScopeId).Name

        # Check if the scope should be excluded
        if (-not [String]::IsNullOrWhiteSpace($ExcludeScope) -and $Name -in $ExcludeScope) {
            continue
        }

        # Check if the scope should be included
        if (-not [String]::IsNullOrWhiteSpace($IncludeScope) -and $Name -notin $IncludeScope) {
            continue
        }

        # Check if the number of free leases is less than the threshold
        if ($Stats.Free -lt $LeaseThreshold ) {
            if ($ShouldAlert -eq $false) {
                # Output once if this is the first scope to trigger an alert
                Write-Host "[Alert] Available DHCP Leases Low. You may want to make modifications to one of the below scopes."
            }
            Write-Host "[Alert] Scope: $Name Leases Used(In Use/Free/Total): $($Stats.InUse)/$($Stats.Free)/$($Stats.InUse+$Stats.Free)"
            $ShouldAlert = $true
        }
        else {
            Write-Host "[Info] Scope: $Name Leases Used(In Use/Free/Total): $($Stats.InUse)/$($Stats.Free)/$($Stats.InUse+$Stats.Free)"
        }
    }

    # IPv6
    # Get all DHCP scopes
    $v6Scopes = Get-DhcpServerv6Scope | Where-Object { $_.State }

    # Iterate through each scope
    foreach ($scope in $v6Scopes) {
        # Get statistics for the scope
        $Stats = Get-DhcpServerv6ScopeStatistics -Prefix $scope.Prefix

        # Get the name of the scope
        $Name = (Get-DhcpServerv6Scope -Prefix $scope.Prefix).Name

        # Check if the scope should be excluded
        if (-not [String]::IsNullOrWhiteSpace($ExcludeScope) -and $Name -in $ExcludeScope) {
            continue
        }

        # Check if the scope should be included
        if (-not [String]::IsNullOrWhiteSpace($IncludeScope) -and $Name -notin $IncludeScope) {
            continue
        }

        # Check if the number of free leases is less than the threshold
        if ($Stats.Free -lt $LeaseThreshold ) {
            if ($ShouldAlert -eq $false) {
                # Output once if this is the first scope to trigger an alert
                Write-Host "[Alert] Available DHCP Leases Low. You may want to make modifications to one of the below scopes."
            }
            Write-Host "[Alert] Scope: $Name Leases Used(In Use/Free/Total): $($Stats.InUse)/$($Stats.Free)/$($Stats.InUse+$Stats.Free)"
            $ShouldAlert = $true
        }
        else {
            Write-Host "[Info] Scope: $Name Leases Used(In Use/Free/Total): $($Stats.InUse)/$($Stats.Free)/$($Stats.InUse+$Stats.Free)"
        }
    }

    exit 0

}
end {
    
    
    
}

 

Analisi dettagliata

Questo script PowerShell richiede il modulo DhcpServer ed è compatibile con Windows Server 2016 o versioni successive. Ecco una spiegazione passo passo di come funziona:

Parametri

  • LeaseThreshold: Questo parametro imposta il numero minimo di locazioni libere necessarie per attivare un avviso.
  • ExcludeScope: Specifica gli ambiti DHCP da escludere dal monitoraggio.
  • IncludeScope: Specifica gli ambiti DHCP da includere nel monitoraggio.

Impostazione iniziale

Lo script inizia definendo una funzione per verificare se è in esecuzione con privilegi di amministratore, necessari per accedere ai dati del server DHCP. Quindi verifica le variabili d’ambiente per i parametri LeaseThreshold, ExcludeScope e IncludeScope, assicurandosi che siano formattate correttamente.

Esclusione e inclusione degli ambiti

Lo script divide ed elabora i parametri ExcludeScope e IncludeScope, convertendoli in array. In questo modo si garantisce che non ci siano sovrapposizioni tra i due elenchi, che potrebbero causare conflitti.

Controllo degli ambiti DHCP

Lo script recupera tutti gli ambiti DHCP disponibili (sia IPv4 che IPv6). Quindi filtra questi ambiti in base ai parametri ExcludeScope e IncludeScope. Per ogni ambito, lo script recupera le statistiche, compreso il numero di lease utilizzati e liberi.

Sistema di avvisi

Se il numero di lease liberi in un qualsiasi ambito scende al di sotto della soglia LeaseThreshold, lo script emette un messaggio di avviso. In questo modo gli amministratori sono immediatamente a conoscenza di eventuali problemi di disponibilità dei lease DHCP.

Finalizzazione

Se lo script incontra errori, come moduli mancanti o nomi di scope non validi, emette un messaggio di errore appropriato ed si conclude.

Casi d’uso potenziali

Immagina un professionista IT che gestisce una rete per una grande organizzazione. Hanno più server DHCP distribuiti in diverse sedi. Ogni server gestisce diversi ambiti ed è fondamentale assicurarsi che ci siano sempre abbastanza indirizzi IP disponibili per i nuovi dispositivi. Implementando questo script, il professionista IT può:

  1. Monitorare in modo proattivo gli ambiti DHCP: Controlla regolarmente lo stato dei lease DHCP senza dover esaminare manualmente ogni ambito.
  2. Ricevere avvisi: Ricevi notifiche istantanee se un ambito scende al di sotto di una determinata soglia di lease liberi, consentendo un intervento tempestivo.
  3. Allocare in modo efficiente le risorse: Regola le impostazioni DHCP o aggiungi altri indirizzi IP agli ambiti, se necessario, per evitare interruzioni della rete.

Confronti

Monitoraggio manuale o tramite script

Il monitoraggio manuale degli ambiti DHCP può richiedere molto tempo ed essere soggetto a errori umani. Lo script automatizza questo processo, fornendo un monitoraggio coerente e affidabile. Inoltre, lo script è in grado di gestire più ambiti e server contemporaneamente, cosa che sarebbe difficile da gestire manualmente.

Script e strumenti di terze parti

Gli strumenti di terze parti offrono soluzioni di gestione DHCP complete, ma possono essere costosi e richiedere un’infrastruttura aggiuntiva. Questo script PowerShell offre una soluzione economica e semplice per le organizzazioni che desiderano migliorare il monitoraggio DHCP senza investimenti significativi.

Domande frequenti

D: Cosa succede se lo script non viene eseguito con i privilegi di amministratore?

R: Lo script emette un messaggio di errore ed termina. Per accedere ai dati del server DHCP sono necessari i privilegi di amministratore.

D: È possibile utilizzare questo script su versioni precedenti di Windows Server?

R: Lo script è progettato per Windows Server 2016 o varianti successive. Le versioni precedenti potrebbero non supportare il modulo DhcpServer richiesto.

D: Cosa succede se il modulo server DHCP non è installato?

R: Lo script emette un messaggio di errore che indica che il modulo DhcpServer non è installato. Per utilizzare questo script è necessario installare la funzione server DHCP e il modulo DhcpServer.

Implicazioni

Un monitoraggio efficace dell’ambito DHCP può migliorare significativamente l’affidabilità e la sicurezza della rete. Assicurandosi che ci sia sempre un numero sufficiente di indirizzi IP disponibili, gli amministratori di rete possono prevenire i problemi di connettività e garantire il funzionamento continuo dei dispositivi di rete. Questo script aiuta a identificare i potenziali problemi prima che si aggravino, consentendo una gestione e una risoluzione dei problemi proattive.

Raccomandazioni

  • Esecuzione regolare: Pianifica l’esecuzione dello script a intervalli regolari utilizzando Task Scheduler o uno strumento simile per garantire un monitoraggio continuo.
  • Regolazione della soglia: Imposta il parametro LeaseThreshold in base alle esigenze della tua rete per evitare falsi allarmi o avvisi mancati.
  • Gestione dell’ambito: Verifica e aggiorna regolarmente i parametri ExcludeScope e IncludeScope per riflettere le modifiche apportate alla tua rete.

Considerazioni finali

Il monitoraggio degli ambiti DHCP è un’attività fondamentale per mantenere l’affidabilità della rete. Questo script PowerShell offre un modo efficiente e potente per automatizzare questo processo, assicurando che gli amministratori siano prontamente avvisati di potenziali problemi. Per i professionisti IT e gli MSP, lo script può essere uno strumento prezioso per la gestione della rete.

Inoltre, l’utilizzo di strumenti come NinjaOne può migliorare ulteriormente il monitoraggio e la gestione della rete, fornendo soluzioni complete per la manutenzione dell’infrastruttura IT.

Implementando questo script e seguendo le best practice, le organizzazioni possono garantire che i loro server DHCP siano sempre pronti a soddisfare le richieste della rete, evitando interruzioni e mantenendo un funzionamento regolare.

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ù su NinjaOne Endpoint Management, 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.