Respaldar DHCP y GPO’s en DC 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
- Restaurar una GPO:
- Cambiar la variable
$NombreGPOal nombre de la GPO que se desea restaurar. - Cambiar la variable
$FechaRespaldoa 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
$FechaRespaldoa la fecha del respaldo. - Ejecutar el script en el servidor DHCP.
- Cambiar la variable