Reinicio lento en servidores Exchange 2000/2003 instalado en Domain Controllers

Una falla muy conocida en Exchange 2003, instalado en Domain Controllers, es su lento apagado. Resulta que el problema es causado porque los servicios de Active Directory se detienen antes que los de Exchange. Como todos ya sabemos, Exchange se apoya fuertemente en nuestra estructura de AD, y avisa a AD cuando se va a detener. En ese momento, Exchange no puede contactarse con AD y es por eso que demora bastante en apagarse, ya que se detienen por TimeOut.

Existen varios procedimientos para solucionarlo que van desde modificar la registry hasta correr scripts antes del apagado, aunque la verdadera solución y recomendación es no instalar Exchange en Domain Controllers.

Vamos a ver todas las alternativas.

1) Cambios en la registry:

Existe una clave en la registry ubicada en: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control llamada WaitToKillServiceTimeout. Este parámetro indica el tiempo en milisegundos que el sistema operativo esperará que un servicio se dentenga antes de “matarlo”.

Lo recomendado es configurar ese valor en 120000. Esta solución no es la más recomendable ya que detiene abruptamente los servicios y puede causar corrupción en las bases de datos.

USUARIOS DE SBS2003: esta clave ya viene configurada por defecto, y a veces su valor es demasiado bajo, lo que puede causar que las bases de Exchange se corrompan. Microsoft lanzó un Workaround.

Services may stop abruptly when you shut down or restart a Windows Small Business Server 2003-based computer
http://support.microsoft.com/default.aspx?scid=kb;en-us;839262

—————————————————–

2) Scripts al shutdown:

La mejor manera de atacar este problema es deteniendo los servicios de Exchange antes del proceso de shutdown del servidor. Acá tenemos tres opciones:

————————–

 2.1) Lee Derbyshire escribió un archivo .bat que muestra un menú antes de apagar. Es un proceso manual antes de apagar el servidor, y su contenido es:

@ECHO OFF
ECHO.
ECHO Please select…
ECHO.
ECHO R – Reboot
ECHO S – Shut Down
ECHO A – Abort Shutdown
ECHO Q – Quit
ECHO.

CHOICE /C RSAQ

IF ERRORLEVEL 4 GOTO END
IF ERRORLEVEL 3 GOTO ABORT
IF ERRORLEVEL 2 GOTO SHUTDOWN
IF ERRORLEVEL 1 GOTO REBOOT
IF ERRORLEVEL 0 GOTO END
GOTO END

:ABORT
shutdown /a
GOTO END

:REBOOT
SET PARAM=/r
GOTO STOPSERVICES

:SHUTDOWN
SET PARAM=/s
GOTO STOPSERVICES

:STOPSERVICES
ECHO ON
net stop MSExchangeES /y
net stop MSExchangeIS /y
net stop MSExchangeMTA /y
net stop MSExchangeSA /y
net stop WinHttpAutoProxySvc /y
shutdown %PARAM% /t 10 /c “TO ABORT, RE-RUN BATCH FILE AND PRESS A”

:END

Lo que muestra una ventana así:

————————–

 2.2) La siguiente opción que tenemos es adjuntar un .bat a una policy de shutdown del servidor. Esta opción es más compleja, pero mucho más segura.

Como primer paso debemos escribir un archivo de texto con el siguiente contenido:

net stop MSExchangeES /y
net stop MSExchangeIS /y
net stop MSExchangeMTA /y
net stop MSExchangeSA /y
net stop WinHttpAutoProxySvc /y

Luego lo renombramos con extensión .bat y armamos la policy.

 Para ello vamos a incio –> ejecutar –> gpedit.msc y luego presionamos aceptar.
 Expandimos Computer Configuration –> Windows Settings –> Scripts (Startup/Shutdown) y hacemos doble clic en Shutdown:

 Hacemos clic en el botón add:

 Escribimos la ruta en donde guardamos el archivo bat:

 Y quedará así:

 

Aceptamos la ventana y ya quedará configurada. 

————————–

 2.3) La última opción es adjuntando un VBScript a una policy de shutdown del servidor. El efecto y resultado es el mismo que en la anterior opción:

Como primer paso debemos escribir un archivo de texto con el siguiente contenido:

servername = “localhost”
 set wmi = getobject(“winmgmts://” & servername)
 StopService (“Microsoft Exchange System Attendant”)
 StopService (“IIS Admin Service”)
 StopService (“Netlogon”)

Sub StopService (ServiceName)
         wql = “select state from win32_service ” _
               & “where displayname='”& ServiceName & “‘”
         set results = wmi.execquery(wql)
         for each service in results
            if service.state = “Running” then
             service.stopService
            end if
          next
End Sub

Luego lo renombramos con extensión .vbs y armamos la policy de la misma manera que la anterior, pero cambiando el nombre del archivo por el vbs que creamos recientemente.

 

Saludos,
Vernocchi Pablo