DNS Server: Modificar zonas primarias masivamente con dnscmd

En un servidor Windows Server 2012 R2 usariamos el cmdlet Set-DNSServerPrimaryZone para cambiar una o varias zonas primarias con Powershell. En mi caso tengo un Windows Server 2008 R2 así que he tenido que usar el comando dnscmd para modificar todas las zonas primarias de un servidor y darlas de alta como secundarias en otro servidor DNS.

Por ejemplo para el servidor DNS 192.168.1.25, el comando para establecer 192.168.1.76 en la lista de servidores a los que esta permitida la transferencia de la zona "dominio.com":
dnscmd 192.168.1.25 /zoneresetsecondaries dominio.com /securelist 192.168.1.76

Lamentablemente el comando machacará la lista de servidores existente. Para evitarlo he usado ademas de dnscmd, un poco de powershell.


Lo primero listaremos todas las zonas del servidor DNS:
dnscmd 192.168.1.25 /enumzones >DNS_listarzonas.txt
Basandonos en el listado anterior, recuperaré la información de cada zona:
for /f "skip=6 eol=* tokens=1,2" %%i in (DNS_listarzonas.txt) do (
 if "%%j"=="Primary" dnscmd 192.168.1.25 /zoneinfo %%i >logs\%%i.log
)
Los ficheros resultantes tendrán el siguiente formato:
Resultado de consulta de zona:

Información de zona:
 Puntero               = 003E6778
 Nombre de zona        = dominio.com
 Tipo de zona          = 1
 Cierre                = 0
 En pausa              = 0
 Actualización         = 0
 Integrada en DS       = 0
 Zona de sólo lectura  = 0
 Archivo de datos         = dominio.com.dns
 Con WINS                 = 0
 Con Nbstat               = 0
 Detección reg. obs.      = 0
   Intervalo actualiz.    = 168
   Sin actualización      = 168
   Eliminación disponible = 0
 Maestros de zona  Matriz IP NULL.
 Secundarios de zona
 Puntero        = 003E6810
 Nº máx.        = 3
 Nº direcciones = 3
  Secundario[0] => af=2, salen=16, [sub=0, flag=00000000] p=0, addr=192.168.1.26
  Secundario[1] => af=2, salen=16, [sub=0, flag=00000000] p=0, addr=192.168.1.27

 secure secs           = 2
Comando completado correctamente.

Y es ahora cuando usare un poco de powershell para parsear todos los ficheros log del comando anterior, leer la lista de servidores a los que esta permitida la transferencia de cada zona y añadir mi nuevo servidor DNS 192.168.1.76 al final:
$ficheros=gci ".\logs\*.log"
$currentDNSIP="192.168.1.25"
$newDNSIP="192.168.1.76"
foreach($fichero in $ficheros)
{
$currentIPs=$newIPs=$null
$content=get-content($fichero)
$zone=(($content -cmatch "Nombre de zona").split("="))[1].trim()
$transfertype=(($content -cmatch "secure secs").split("="))[1].trim()
write-host "$zone es de tipo $transfertype" -fore cyan
 if ($transfertype -eq "2")
 {
 $currentIPs=$content -cmatch 'Secundario\['
  foreach($currentIP in $currentIPs)
  {
  $IP=$currentIP.substring($currentIP.indexof("addr=")+5)
  $newIPs="$newIPS$IP "
  }
 $newIPs="$newIPS$newDNSIP"
 out-file "DNSresetsecondaries.cmd" -input "dnscmd $currentDNSIP /zoneresetsecondaries $zone /securelist $newIPs" -append -enc ascii
 }
}
El script Powershell ha generado un fichero bat con todos los comandos dnscmd /resetsecondaries necesarios:
dnscmd 192.168.1.25 /zoneresetsecondaries dominio.com /securelist 192.168.1.26 192.168.1.27 192.168.1.76
dnscmd 192.168.1.25 /zoneresetsecondaries dominio2.com /securelist 192.168.1.27 192.168.1.76
dnscmd 192.168.1.25 /zoneresetsecondaries dominio3.com /securelist 192.168.1.26 192.168.1.27 192.168.1.76

Para terminar ejecutaré el siguiente comando para crear las zonas secundarias en el nuevo servidor DNS:
for /f "skip=6 eol=* tokens=1,2" %%i in (DNS_listarzonas.txt) do (
 if "%%j"=="Primary" dnscmd 192.168.1.76 /zoneadd %%i /secondary 192.168.1.25
)

Comentarios