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
- 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.
- Cambiar la variable
- Restaurar la Configuración DHCP:
- Cambiar la variable
$FechaRespaldo
a la fecha del respaldo. - Ejecutar el script en el servidor DHCP.
- Cambiar la variable