El problema
Un cliente me notifica que en un Windows 2008 no se podía instalar service pack 2 debido a un error en Windows Update. El error era 0×80070490. Adicionalmente, cuando se abría Server Manager y se trataban de listar los roles o featues del servidor aparecía el mismo error.
El Desarrollo de la solución
Luego de investigar el varios foros llegué al artículo KB958044. En este artículo se describen dos soluciones para Windows 2008, Windows 2008 R2, Windows Vista o Windows 7, la primera es correr el aplicativo checksur.exe (Check System Update Readiness Tool) o … reparar la instalación de Windows 2008… :S.
Como obviamente no iva a reparar el sistema operativo, y menos en un servidor de producción… aunque hosteaba un par de máquinas virtuales de Desarrollo (je)… me decidí por probar con la primera opción
.
Luego de descargar la actualización del artículo, en la carpeta C:\windows\logs\cbs encontré el archivo checkSUR.log con el siguiente contenido:
=================================
Checking System Update Readiness.
Binary Version 6.0.6002.22285
Package Version 7.0
2010-02-11 09:18
Checking Windows Servicing Packages
Checking Package Manifests and Catalogs
Checking Package Watchlist
Checking Component Watchlist
Checking Packages
(f) CBS Registry Error 0x80070002 Package_for_KB948610~31bf3856ad364e35~amd64~~6.0.6001.2123 failed to get CurrentState
(f) CBS Registry Error 0x80070002 Package_for_KB948610~31bf3856ad364e35~amd64~~6.0.6001.2123 failed to get Visibility
Checking Component Store
Summary:
Seconds executed: 215
Found 2 errors
CBS Registry Error Total count: 2
Teoricamente CeckSUR resuelve problemas conocidos de errores de Windows Update (ver el artículo KB947821 para ver una lista completa) pero como siempre ocurre, el número de error que tenemos no está dentro de la lista… con lo cual volví a sumergirme en las entrañas del guguel en busca de más respuestas o soluciones.
Este error puede darse por varios motivos y como es lógico, hay varias soluciones, pero ninguna aplicaba (algunos recomendaban renombrar la carpeta de cache de downloads de Windows Update, otros revisar si existían los archivos en la carpeta C:\Windows\servicing\Packages y reemplazar o copiar los archivos faltantes por otra instalación). Por ende volví a las bases… es decir… a leer el artículo descriptivo de checkSUR como corresponde
La solución
La respuesta vino por asociación, luego de leer el artículo obtuve la siguiente entrada de la registryHKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing
Entonces… como el error 0×80070002 en el artículo apunta a File not Found (cosa que no era así ya que los archivos de servicing tanto en la carpeta de Windows Update como los .cat y .mum existían) se me ocurrió pensar que podía faltar una entrada de la registry…. De hecho… el archivo CheckSUR.log me lo indica clarito desde el primer momento!.
Finalmente dentro de la clave HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\Package_for_KB948610~31bf3856ad364e35~amd64~~6.0.6001.2123 no había datos. La clave estaba creada pero no existía ningún registro dentro de la clave. Entonces, como precaución, exporte la clave vacía (si.. siempre hacer backup de lo que uno toca, ya sea archivo de texto, registry, o lo que sea!!) y me fui a un Windows 2008 con la misma versión del que tenía el problema. Exporte la clave de registro y la importe en el servidor con el problema…
Y voilá… probé correr Service Pack 2 y funcionó (excepto cuando llego a la comprobación de espacio… el servidor tenía poco espacio… por lo que quedó pendiente la instalación, pero ya este no era mi problema!)
El Problema
Actualmente estoy rediseñando la ubicación de unos servicios en varios servidores y me encontré con la necesidad de mover algunos servidores DNS de Microsoft que estaban en un Windows Server a otro – Adicionalmente tenía la necesidad de reconfigurar los Time To Live de los registros SOA y MX, agregar un MX adicional a todos los dominios (para tener failover con otro SMTP en otra ubicación Física) y reemplazar o corregir los registros SOA configurando los campos como corresponde.
Realmente la cantidad de zonas no era enorme (unas 15 zonas primarias, y más cuatro zonas secundarian que replicaban del servidor primario) pero realmente me daba fiaca ir sitio por sitio para hacer las modificaciones.
La herramienta
Cada vez que se agrega el rol de Servidor DNS se instala un comando llamado DNSCMD. Dicho comando permite administrar tanto el servidor en sí como hacer manteminiento y alta de zonas o ABMs de registros dentro de la zonas DNS creadas.
La sintaxis regular de dnscmd es la siguiente
dnscmd.exe <servername> </Command> <CommandParameters>
Este comando permite realizar modificaciones o cambios inclusive a servidores DNS remotos, sin necesidad de estar logueado en la consola de cada servidor. Esto acelera mucho la tarea, en especial cuando hay que distribuir replicación de zonas entre diferentes servidores, cambiar el registro SOA, agregar un registro MX o A, o cambiar los name servers de nuestras zonas.

DNSCmd Parameters
La Solución
Lo primero que hice fue crear un archivo de texto con los nombres de las zonas de dominio con las que tenía que trabajar. Para ello abrí el notepad, escribí las siguientes líneas
domain1.com
domain2.com
domain3.com y lo guardé como un archivo de texto en una ubicación fácil de ubicar como es la raíz del perfil (ej. c:\). Al archivo lo nombré como zonas.txt.

El batch multipropósito
Con el archivo de texto creado me faltaba crear un archivo batch multipropósito que me permitiese ejecutar el mismo comando tantas veces como zonas aparezcan en el archivo de texto. Para elló abrí otro notepad y escribí el siguiente comando
FOR /F %%P IN (c:\zonas.txt) DO dnscmd ..%%P.. que pasó a explicar a continuación:
FOR /F realizará una iteración del comando ingresado despues de DO. El parámetro /F especifíca que se busquen los parámetros %%P dentro del archivo IN (c:\zonas.txt). Por último por cada línea que exista en el archivo se ejecutará DO dnscmd ..%%P.. reemplazando %%P por lo que exista en cada línea del archivo.
Configurando para que la zona primaria acepte transferencias desde los servidores secundarios
Por default, cuando se crea una zona primaria en un servidor DNS corriendo en Windows 2003 o 2008, no está habilitada la transferencia de zona. El objetivo es que el nuevo servidor realice una copia de la zona configurando una zona secundaria. Para ello debemos permitir que la zona primaria acepte la transferencia.
El batch quedaría así:
FOR /F %%P IN (c:\zonas.txt) DO dnscmd darthmaul /ZoneResetSecondaries %%P /SecureList 192.168.1.150Al comando dnscmd le es indicado el nombre del servidor (que es DarthMaul) y es ejecutado con el parámetro /ZoneResetSecondaries. Este parámetro requiere que se le indique la seguridad (en este ejemplo le doy una lista de direcciones ip internas con /SecureList y luego le autorizo la dirección ip 192.168.1.150 para que pueda realizar desde esta IP la transferencia de zona.

Agregando las zonas Secundarias al servidor
Una vez que permití la transferencia tengo que crear en el nuevo servidor la zona secundaria para que transfiera los registros para luego convertirla en primaria.
Para esta oportunidad mi batch quedó así:
FOR /F %%P IN (c:\zonas.txt) DO dnscmd dc /ZoneAdd %%P /Secondary 192.168.1.246 /file %%P.dns El comando dnscmd se ejecuta en el servidor dc y corre el parámetro /ZoneAdd. Este parámetro requiere el nombre de la zona (reemplazado por las zonas en el archivo de texto con %%P) y el tipo de zona, en donde se especifica /Secondary. Partícularmente /Secondary requiere que se le indique una dirección IP desde donde podrá obtener la información de transferencia (en este caso, la dirección IP 192.168.1.246 corresponde al servidor DarthMaul. El parámetro /file %%P.dns permite crearme un archivo con el nombre de la zona y la extensión .dns. (hay que tener en cuenta que los servidores DNS de Windows guardan la información de zona en archivos de texto, como hace BIND. Aquellos servidores DNS que son controladores de dominio pueden guardar la zona en active directory).

Cambiando las zonas de secundarias a primarias
Dado que estaba migrando el servidor DNS necesitaba que el nuevo sea el primario para poder seguir administrando las zonas y poder desafectar el anterior. Por este motivo modifiqué mi batch file para que corriese sobre DC:
FOR /F %%P IN (c:\zonas.txt) DO dnscmd dc /ZoneResetType %%P /Primary /file %%P.dns El parámetro /ZoneResetType permite cambiar el tipo de zona. En este caso la cambié a /Primary y le vuelvo a indicar el archivo en donde se guardará la información de la zona con /file %%P.dns

Modificando el registro SOA
El Registro SOA, entre otras cosas, permite manejar el versionado para la transferencia de zonas, el Time To Live por default y la información de Update, Retry y Timeout de las zonas secundarias que replican esta zona. Uno de los problemas de cambiar el tipo de zona de Primario a Secundario es que pierde el Primary Name Server y lo reemplaza por el FQDN del servidor (un problema si el servidor está expuesto y aparece en este campo el FQDN con el nombre interno del servidor).
EL batch quedó un poco mas largo que en los ejemplos anteriores:
FOR /F %%P IN (c:\zonas.txt) DO dnscmd dc /RecordAdd %%P @ 86400 SOA ns1.demo.com hostmaster.demo.com 22022010 3600 600 172800 86400 El parámetro /RecordAdd permite agregar registros o modificar registros existentes. Luego de la zona se debe indicar el nombre del registro que se creará. En este caso el @ hace referencia al dominio en sí mismo. Luego se indica el time to live en segundos para el registro (86400 es 1 día).
ns1.demo.com y hostmaster.demo.com hacen referencia al campo primary name server y al contacto responsable.
El resto de los parámetros (22022010 3600 600 172800 86400) completan el registro SOA: Número de Serie, Intervalo de actualización en segundos, Intervalo de Reintento en segundos, expiración de la zona y Time to Live por default en segundos para registros nuevos.


Otros Ejemplos
Acá hay otros ejemplos de mi batch file que pueden llegar a ser de utilidad
FOR /F %%P IN (c:\zonas.txt) DO dnscmd dc /RecordAdd %%P @ 86400 MX 10 mail.demo.com.
FOR /F %%P IN (c:\zonas.txt) DO dnscmd dc /RecordAdd %%P www 86400 A 200.100.10.100
FOR /F %%P IN (c:\zonas.txt) DO dnscmd dc /RecordAdd %%P smtp 86400 CNAME mail1.demo.com.
|
Este Viernes 31 de Octubre de 2008 tuve el honor y el agrado de participar del Evento realizado por los estudiantes de la Universidad Nacional de Jujuy, Miembros de Progreso Universitario. En el evento se disertó sobre Visual Studio 2008, SQL Server 2008 y Windows Server 2008 y Sharepoint (Ver el link del temario en la página del MUG).
Durante esta jornada, más de 250 personas (entre estudiantes y profesionales locales) se juntaron para ver las nuevas características y capacidades de las tecnologías Microsoft sobre las que se disertó. Desde muy temprano la gente de acerco para acreditarse. Al inicio, El Rector de la Facultad de Ingeniería dedicó unas palabras, destacando la importancia del evento. Luego el Presidente de la Cámara de Software Local informó acerca de los beneficios para las empresas desarrolladoras de software de la región informando acerca de becas y subsidios para los nuevos emprendimientos.
Luego fue mi turno. Durante las siguientes 3 horas hablé de las nuevas características de Windows Server 2008 y Sharepoint. Pese a la alta cantidad de desarrolladores, fue grato y satisfactorio notar que estaban interesados en la plataforma. Y tal como lo prometí, – adjunto la presentación para que puedan descargarla – la misma está en formato PDF
|

 |
Quiero aprovechar este espacio para agradecer a los Chicos de Progreso Universitario ya que fueron muy amables y hospitalarios con el trato para nosotros, además de invitarme el sábado a la noche a comer unas ricas empanadas y charlar un poco de la Selección Argentina de Fútbol!! – espero que se vuelva a repetir la experiencia. |