Respaldar DHCP y GPO’s en DC Windows

Backups Scripts Tecnología Windows

Respaldar los servicios de DHCP y las Políticas de Grupo (GPOs) en un controlador de dominio de Windows es crucial para mantener la estabilidad y la seguridad de una red corporativa. El servicio DHCP asigna dinámicamente direcciones IP a los dispositivos de la red, y una pérdida de configuración puede interrumpir la conectividad, afectando la productividad de toda la organización. Por otro lado, las GPOs controlan configuraciones críticas de seguridad y administración para los equipos y usuarios; sin ellas, se corre el riesgo de comprometer políticas de seguridad, configuraciones específicas y reglas de acceso. Al contar con respaldos periódicos de ambos elementos, es posible restaurar rápidamente configuraciones clave en caso de fallos, migraciones o ciberataques, asegurando así la continuidad y eficiencia operativa de la red.

Script que realiza el respaldo

### ===== RESPALDAR GPO's ===== ###

# Obtener la fecha actual
$hoy = Get-Date -Format "dd-MM-yyyy"

# Ruta base para los respaldos
$RespaldarEn = "\\<Recurso_Compartido>\$hoy\Respaldos_GPO"
$Borrar_desde = "\\<Recurso_Compartido>"

# Comentario para el respaldo
$Comentario_Bkp = "Backup GPOS <HOST> $hoy"

# Obtener todas las GPOs del dominio
$GPOs = Get-GPO -All

# Variable para determinar si hubo algún error en GPO
$ErrorEnGPO = $false

# Crear la carpeta para el respaldo de GPOs
New-Item -Path $RespaldarEn -ItemType Directory -Force | Out-Null

# Ruta del archivo de log
$PathArchivoLog = Join-Path -Path $RespaldarEn -ChildPath "respaldo.log"

# Crear o sobrescribir el archivo de log
$null = New-Item -Path $PathArchivoLog -ItemType File -Force

# Iterar a través de cada GPO para realizar el respaldo y escribir en el log
foreach ($GPO in $GPOs) {
    $NombreGPO = $GPO.DisplayName
    $BackupPath = Join-Path -Path $RespaldarEn -ChildPath $NombreGPO
    
    # Crear la carpeta de respaldo para la GPO si no existe
    if (!(Test-Path -Path $BackupPath)) {
        New-Item -Path $BackupPath -ItemType Directory
    }
    
    # Realizar el respaldo de la GPO
    try {
        $TimeStamp = Get-Date -Format "dd-MM-yyyy HH:mm:ss"
        $MensajesLog = "[${TimeStamp}] Iniciando respaldo de la GPO $NombreGPO.`r`n"
        Add-content -Path $PathArchivoLog -Value $MensajesLog
        Backup-GPO -Name $NombreGPO -Path $BackupPath -Comment $Comentario_Bkp
        $TimeStamp = Get-Date -Format "dd-MM-yyyy HH:mm:ss"
        $MensajesLog = "[${TimeStamp}] Respaldo de la GPO $NombreGPO realizado correctamente en $BackupPath.`r`n"
        Add-content -Path $PathArchivoLog -Value $MensajesLog

        # Comprimir la carpeta de respaldo en un archivo ZIP usando .NET Framework
        $NombreArchivoZip = "$BackupPath.zip"
        Add-Type -AssemblyName System.IO.Compression.FileSystem
        [System.IO.Compression.ZipFile]::CreateFromDirectory($BackupPath, $NombreArchivoZip)

        # Eliminar la carpeta original después de comprimir
        Remove-Item -Path $BackupPath -Recurse -Force

    } catch {
        $ErrorEnGPO = $true
        $TimeStamp = Get-Date -Format "dd-MM-yyyy HH:mm:ss"
        $MensajesLog = "[${TimeStamp}] Error al realizar el respaldo de la GPO $NombreGPO $_`r`n"
        Add-content -Path $PathArchivoLog -Value $MensajesLog
        # Terminar el bucle si ocurre un error
        break
    }
}

# Estado de salida para el respaldo de GPOs
$GPOBackupStatus = if ($ErrorEnGPO) { "1" } else { "0" }

### ===== RESPALDAR CONFIGURACION DHCP ===== ###

# Ruta donde se almacenará el respaldo del DHCP
$PathCarpetaRespaldo = "\\<Recurso_Compartido>\$hoy\Respaldo_DHCP"

# Nombre del archivo de respaldo DHCP
$NombreArchivoBackup = "dhcp_backup_$(Get-Date -Format 'dd-MM-yyyy').xml"
$PathArchivoBackup = Join-Path -Path $PathCarpetaRespaldo -ChildPath $NombreArchivoBackup

# Inicializar registro de eventos
$LogPath = $PathCarpetaRespaldo
if (!(Test-Path $LogPath)) {
    New-Item -Path $LogPath -ItemType Directory -Force | Out-Null
}
$PathArchivoLog = Join-Path -Path $LogPath -ChildPath "DHCP_Backup_Log_$(Get-Date -Format 'dd-MM-yyyy').log"

# Función para escribir en el registro de eventos
function Write-Log {
    param(
        [string]$Message
    )
    $TimeStamp = Get-Date -Format "dd-MM-yyyy HH:mm:ss"
    $MensajesLog = "[${TimeStamp}] $Message"
    Add-Content -Path $PathArchivoLog -Value $MensajesLog
}

# Respaldar la configuración DHCP y escribir en el registro de eventos
$ErrorEnDHCP = $false

try {
    Export-DhcpServer -ComputerName "<HOST>" -File $PathArchivoBackup -Force -ErrorAction Stop
    Write-Log "Se realizó correctamente el respaldo de la configuración DHCP. El archivo de respaldo se encuentra en la siguiente ruta: $PathArchivoBackup"
} catch {
    Write-Log "Hubo un error al realizar el respaldo de la configuración DHCP: $_"
    $ErrorEnDHCP = $true
}

# Variables de Zabbix
$zabbixSenderPath = '"C:\Program Files\Zabbix Agent\zabbix_sender.exe"'
$zabbixServer = "<Servidor_Zabbix>"
$zabbixHost = "<HOST>"

# Estado de salida para GPO
$GPOBackupStatus = if ($ErrorEnGPO) { "1" } else { "0" }

# Enviar estado de GPOs a Zabbix
Start-Process -FilePath $zabbixSenderPath -ArgumentList "-z $zabbixServer -s $zabbixHost -k gpo_backup_status -o $GPOBackupStatus" -NoNewWindow -Wait

# Estado de salida para DHCP
$DHCPBackupStatus = if ($ErrorEnDHCP) { "1" } else { "0" }

# Enviar estado de DHCP a Zabbix
Start-Process -FilePath $zabbixSenderPath -ArgumentList "-z $zabbixServer -s $zabbixHost -k dhcp_backup_status -o $DHCPBackupStatus" -NoNewWindow -Wait

Script para Restaurar configuración DHCP

### ===== RESTAURAR CONFIGURACIÓN DHCP ===== ###

# Parámetros de restauración
$FechaRespaldo = "dd-MM-yyyy"  # Cambiar esto a la fecha del respaldo (ejemplo: "28-08-2024")

# Ruta base donde están los respaldos
$RutaCarpetaRespaldo = "\\<Recurso_Compartido>\$FechaRespaldo\Respaldo_DHCP"
$NombreArchivoRespaldo = "dhcp_backup_$FechaRespaldo.xml"
$RutaArchivoRespaldo = Join-Path -Path $RutaCarpetaRespaldo -ChildPath $NombreArchivoRespaldo

# Verificar si el archivo de respaldo existe
if (Test-Path -Path $RutaArchivoRespaldo) {
    # Restaurar la configuración DHCP
    try {
        Import-DhcpServer -ComputerName "<HOST>" -File $RutaArchivoRespaldo -BackupPath $RutaCarpetaRespaldo -Force -ErrorAction Stop
        Write-Output "La configuración DHCP se ha restaurado correctamente desde $RutaArchivoRespaldo."
    } catch {
        Write-Output "Error al restaurar la configuración DHCP desde $RutaArchivoRespaldo: $_"
    }
} else {
    Write-Output "No se encontró el archivo de respaldo DHCP en $RutaArchivoRespaldo."
}

Script para Restaurar una GPO Determinada

### ===== RESTAURAR GPO ===== ###

# Parámetros de restauración
$NombreGPO = "NombreDeLaGPO"  # Cambiar esto al nombre de la GPO que se desea restaurar
$FechaRespaldo = "dd-MM-yyyy"  # Cambiar esto a la fecha del respaldo (ejemplo: "28-08-2024")

# Ruta base donde están los respaldos
$RutaBaseRespaldo = "\\<Recurso_Compartido>\$FechaRespaldo\Respaldos_GPO"
$RutaArchivoRespaldo = Join-Path -Path $RutaBaseRespaldo -ChildPath "$NombreGPO.zip"

# Verificar si el archivo de respaldo existe
if (Test-Path -Path $RutaArchivoRespaldo) {
    # Ruta temporal para extraer el archivo ZIP
    $RutaTemporal = "C:\Temp\RestaurarGPO"
    if (!(Test-Path -Path $RutaTemporal)) {
        New-Item -Path $RutaTemporal -ItemType Directory -Force | Out-Null
    }

    # Extraer el archivo ZIP
    Add-Type -AssemblyName System.IO.Compression.FileSystem
    [System.IO.Compression.ZipFile]::ExtractToDirectory($RutaArchivoRespaldo, $RutaTemporal)

    # Restaurar la GPO
    try {
        Restore-GPO -Name $NombreGPO -Path $RutaTemporal
        Write-Output "La GPO $NombreGPO se ha restaurado correctamente desde $RutaArchivoRespaldo."
    } catch {
        Write-Output "Error al restaurar la GPO $NombreGPO: $_"
    }

    # Limpiar archivos temporales
    Remove-Item -Path $RutaTemporal -Recurse -Force
} else {
    Write-Output "No se encontró el archivo de respaldo para la GPO $NombreGPO en $RutaArchivoRespaldo."
}

Instrucciones para Ejecutar los Scripts

  1. Restaurar una GPO:
    • Cambiar la variable $NombreGPO al nombre de la GPO que se desea restaurar.
    • Cambiar la variable $FechaRespaldo a la fecha del respaldo.
    • Ejecutar el script en el servidor donde deseas restaurar la GPO.
  2. Restaurar la Configuración DHCP:
    • Cambiar la variable $FechaRespaldo a la fecha del respaldo.
    • Ejecutar el script en el servidor DHCP.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *