Guía completa para supervisar las concesiones DHCP con PowerShell

¿Te gustaría tener más información sobre las notificaciones de concesiones DHCP para PowerShell? Este artículo explicará por qué la supervisión y gestión de las concesiones DHCP es una tarea crítica para los profesionales de TI y los proveedores de servicios gestionados (MSP). Asegurarse de que los servidores DHCP funcionan eficazmente y de que hay suficientes direcciones IP disponibles en el pool puede evitar problemas de red y garantizar una conectividad eficaz.

Este post profundiza en un script PowerShell diseñado para supervisar las concesiones DHCP, alertando a los administradores cuando el número de concesiones disponibles cae por debajo de un umbral especificado. Este script es una herramienta esencial para mantener la fiabilidad de la red y evitar posibles interrupciones.

Contexto

El Protocolo de Configuración Dinámica de Host (DHCP) es un protocolo de gestión de red utilizado para automatizar el proceso de configuración de dispositivos en redes IP. Sin el DHCP, habría que asignar manualmente una dirección IP a cada dispositivo de la red. Dada la naturaleza dinámica de las redes modernas, los servidores DHCP suelen estar sometidos a una demanda constante para proporcionar direcciones IP.

Es crucial supervisar estos servidores y asegurarse de que disponen de suficientes contratos de alquiler. El script PowerShell proporcionado responde a esta necesidad comprobando los ámbitos DHCP y alertando a los administradores si el número de concesiones libres cae por debajo de un determinado umbral.

El script

#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 {
    
    
    
}

 

Análisis detallado

Este script de PowerShell requiere el módulo DhcpServer y es compatible con Windows Server 2016 o versiones posteriores. Aquí tienes una explicación paso a paso de cómo funciona:

Parámetros

  • LeaseThreshold: este parámetro establece el número mínimo de concesiones libres necesarias antes de activar una alerta.
  • ExcludeScope: especifica las concesiones DHCP que se excluirán de la supervisión.
  • IncludeScope: especifica las concesiones DHCP a incluir en la supervisión.

Configuración inicial

El script comienza definiendo una función para comprobar si se está ejecutando con privilegios de administrador, necesarios para acceder a los datos del servidor DHCP. A continuación, procesa cualquier variable de entorno para los parámetros LeaseThreshold, ExcludeScope e IncludeScope, asegurándose de que están formateados correctamente.

Ámbitos de exclusión e inclusión

El script divide y procesa los parámetros ExcludeScope e IncludeScope, convirtiéndolos en matrices. Garantiza que no haya solapamientos entre las dos listas, lo que podría causar conflictos.

Comprobación de concesiones DHCP

El script recupera todos los ámbitos DHCP disponibles (tanto IPv4 como IPv6). A continuación, filtra estos ámbitos en función de los parámetros ExcludeScope e IncludeScope. Para cada ámbito, el script obtiene las estadísticas, incluido el número de concesiones utilizadas y libres.

Alertas

Si el número de concesiones libres en cualquier ámbito cae por debajo del LeaseThreshold, el script emite un mensaje de alerta. Esto asegura que los administradores estén inmediatamente al tanto de cualquier problema potencial con la disponibilidad de cesión DHCP.

Final

Si el script encuentra algún error, como módulos que faltan o nombres de ámbito no válidos, muestra un mensaje de error apropiado y sale.

Posibles casos de uso

Imagínate a un profesional de TI que gestiona la red de una gran organización que dispone de varios servidores DHCP repartidos por diferentes ubicaciones. Cada servidor gestiona varios ámbitos, y es fundamental garantizar que siempre haya suficientes direcciones IP disponibles para los nuevos dispositivos. Mediante la aplicación de este script, el profesional de TI puede:

  1. Supervisar proactivamente los ámbitos DHCP: comprueba regularmente el estado de las concesiones DHCP sin tener que revisar manualmente cada ámbito.
  2. Recibir alertas: recibe notificaciones instantáneas si algún ámbito cae por debajo de un umbral especificado de concesiones libres, lo que permite intervenir a tiempo.
  3. Asignación eficiente de recursos: ajusta la configuración DHCP o añade más direcciones IP a los ámbitos según sea necesario, evitando interrupciones en la red.

Comparaciones

Script vs. supervisión manual

Supervisar manualmente los ámbitos DHCP puede llevar mucho tiempo y ser propenso a errores humanos. El script automatiza este proceso, proporcionando una supervisión coherente y fiable. Además, el script puede gestionar varios ámbitos y servidores simultáneamente, lo que sería difícil de gestionar manualmente.

Script vs. herramientas de terceros

Aunque las herramientas de terceros ofrecen soluciones completas de gestión DHCP, pueden ser caras y requerir infraestructura adicional. Este script PowerShell proporciona una solución rentable y directa para las organizaciones que buscan mejorar su monitorización DHCP sin inversiones significativas.

FAQ

P: ¿Qué ocurre si el script no se ejecuta con privilegios de administrador?

R: El script mostrará un mensaje de error y saldrá. Se requieren privilegios de administrador para acceder a los datos del servidor DHCP.

P: ¿Puedo utilizar este script en versiones anteriores de Windows Server?

R: El script está diseñado para Windows Server 2016 o versiones posteriores. Es posible que las versiones anteriores no admitan el módulo DhcpServer necesario.

P: ¿Qué ocurre si el módulo del servidor DHCP no está instalado?

R: El script mostrará un mensaje de error indicando que el módulo DhcpServer no está instalado. Tendrás que instalar la función de servidor DHCP y el módulo DhcpServer para utilizar este script.

Implicaciones

Una supervisión eficaz del ámbito DHCP puede mejorar significativamente la fiabilidad y la seguridad de la red. Al asegurarse de que siempre hay suficientes direcciones IP disponibles, los administradores de red pueden evitar problemas de conectividad y garantizar el funcionamiento sin problemas de los dispositivos de red. Este script ayuda a identificar posibles problemas antes de que se agraven, lo que permite una gestión y resolución de problemas proactivas.

Recomendaciones

  • Ejecución regular: programa el script para que se ejecute a intervalos regulares mediante el Programador de tareas o una herramienta similar para garantizar una supervisión continua.
  • Ajuste del umbral: ajusta el parámetro LeaseThreshold en función de las necesidades de tu red para evitar falsas alarmas o alertas perdidas.
  • Gestión del alcance: revisa y actualiza periódicamente los parámetros ExcludeScope e IncludeScope para reflejar los cambios en tu red.

Reflexiones finales

Supervisar los ámbitos DHCP es una tarea crítica para mantener la fiabilidad de la red. Este script PowerShell proporciona una forma potente y eficaz de automatizar este proceso, garantizando que los administradores reciban rápidamente alertas sobre posibles problemas. Para los profesionales de TI y los MSP, este script puede ser una herramienta inestimable en su kit de herramientas de gestión de redes.

Además, el uso de herramientas como NinjaOne puede mejorar aún más la supervisión y gestión de la red, proporcionando soluciones integrales para el mantenimiento de la infraestructura de TI.

Al implementar este script y seguir las mejores prácticas, las organizaciones pueden garantizar que sus servidores DHCP estén siempre listos para satisfacer las demandas de la red, evitando interrupciones y manteniendo un funcionamiento impecable.

Categorías:

Quizá también te interese…

×

¡Vean a NinjaOne en acción!

Al enviar este formulario, acepto la política de privacidad de NinjaOne.

Términos y condiciones de NinjaOne

Al hacer clic en el botón “Acepto” que aparece a continuación, estás aceptando los siguientes términos legales, así como nuestras Condiciones de uso:

  • Derechos de propiedad: NinjaOne posee y seguirá poseyendo todos los derechos, títulos e intereses sobre el script (incluidos los derechos de autor). NinjaOne concede al usuario una licencia limitada para utilizar el script de acuerdo con estos términos legales.
  • Limitación de uso: solo podrás utilizar el script para tus legítimos fines personales o comerciales internos, y no podrás compartirlo con terceros.
  • Prohibición de republicación: bajo ninguna circunstancia está permitido volver a publicar el script en ninguna biblioteca de scripts que pertenezca o esté bajo el control de cualquier otro proveedor de software.
  • Exclusión de garantía: el script se proporciona “tal cual” y “según disponibilidad”, sin garantía de ningún tipo. NinjaOne no promete ni garantiza que el script esté libre de defectos o que satisfaga las necesidades o expectativas específicas del usuario.
  • Asunción de riesgos: el uso que el usuario haga del script corre por su cuenta y riesgo. El usuario reconoce que existen ciertos riesgos inherentes al uso del script, y entiende y asume cada uno de esos riesgos.
  • Renuncia y exención: el usuario no hará responsable a NinjaOne de cualquier consecuencia adversa o no deseada que resulte del uso del script y renuncia a cualquier derecho o recurso legal o equitativo que pueda tener contra NinjaOne en relación con su uso del script.
  • CLUF: si el usuario es cliente de NinjaOne, su uso del script está sujeto al Contrato de Licencia para el Usuario Final (CLUF).