Tuesday 25 October 2011

Troubleshooting WMI

Hola a todos,
como prometí en el post anterior, en este post intentaré explicar un poco más por qué parece que WMI falla tanto y, lo más importante, os hablaré de un par de herramientas que podemos utilizar para comprobar el estado de este servicio y sus proveedores. Por último, finalizaré explicando algunas acciones que podemos tomar para reparar WMI y evitar lanzar el ordenador por la ventana.
Desde el punto de vista de desarrolladores .Net, es posible que tengamos una visión sesgada de WMI, ya que queda encapsulada de manera más o menos afortunada en el espacio de nombres System.Managament. En el post anterior ya intenté explicar un poco la arquitectura de WMI pero como dicen que una imagen vale más que mil palabras, seguramente quedará más claro con el siguiente diagrama.
clip_image002[1]

¿Por qué parece que WMI falla tanto?

Se podría decir que WMI está hasta en la sopa porque es una tecnología que se utiliza un la gran mayoría de componentes del sistema operativo. Como se puede ver en el diagrama anterior, WMI utiliza proveedores con los que interactúa para recuperar información o ejecutar acciones. Estos proveedores pueden ser de lo más variado, pueden acceder a la red, al directorio activo, al sistema de ficheros o a objetos del núcleo de Windows. Si por cualquier tontería, uno de estos componentes falla, WMI devolverá un error, sin embargo, aunque es posible, este error no significa necesariamente que se haya roto WMI.
Lo primero que tenemos que hacer cuando WMI nos devuelva un error es averiguar si es un error nativo de WMI o está originado por un componente externo. Por ejemplo, aquí muestro unos códigos de error extraídos de la documentación de la utilidad WMIDiag de la que hablaré más adelante.
• 0x800410xx y 0x800440xx: Indican errores de operaciones no específicas de WMI. Pueden ser debidos a privilegios insuficientes para realizar la operación, a una manera incorrecta de ejecutar la operación, o por un problema de infraestructura de WMI, como por ejemplo un registro de COM incorrecto de algún proveedor de WMI.
• 0x8007xxxx son errores internos del sistema operativo. WMI puede devolver este tipo de errores por ejemplo por tener privilegios insuficientes para acceder a DCOM.
• 0x80040xxx son errores de DCOM. WMI puede devolver este tipo de error por ejemplo si DCOM está mal configurado.
• 0x80005xxx errores ADSI (LDAP). WMI puede devolver este tipo de errores debido a algún problema al acceder al directorio activo.

¿Cómo puedo diagnosticar WMI?

La utilidad más básica para consultar el estado del servicio WMI es su consola de administración (WMI Control), podemos acceder a ella ejecutando el comando wmimgmt.msc. Si no indica ningún error es posible que WMI no esté totalmente roto y se pueda recuperar, si indica algún error ya tendremos una pista de por dónde empezar. A continuación muestro una captura de pantalla de esta consola, en ella se puede ver que desde aquí podemos administrar también la seguridad de los espacios de nombres o realizar una copia de seguridad.
clip_image003
Otra de las primeras cosas que debemos mirar es si se está ejecutando el servicio Windows Management Instrumentation y está bien configurado. Cosa que podemos hacer desde la consola de administración de los servicios de Windows (services.msc).
Si aun así, no encontramos la fuente del error, aún nos quedan dos ases en la manga. El primero es el script wmidiag.vbs que se puede descargar desde aquí: http://www.microsoft.com/download/en/details.aspx?id=7684
Al ejecutar este script nos genera un informe de gran ayuda a la hora de detectar cualquier error ya que revisa todos los componentes de WMI incluidos posibles problemas por modulos MOF sin compilar o por falta de credenciales para acceder a DCOM.
La otra alternativa es la utilidad WBEMTest, que tiene una interfaz gráfica de la que se muestra a continuación una captura de pantalla. Quizás esta utilidad sea más avanzada que WMIDiag pero recomiendo utilizar ambas ya que con WMIDiag realizaremos un análisis automático de las funcionalidades principales y más tarde con WBEMTest podremos probar la funcionalidad de los espacios de nombres o los aspectos específicos que nos estén dando problemas.
clip_image004

Reparar WMI

Estas acciones pueden ser muy peligrosas y solo deben ejecutarse como último recurso ya que podrían estropearse otras partes del componente u otros componentes que necesitaran indirectamente de WMI para funcionar, así que ejecutadlas bajo vuestra propia responsabilidad.
Después de haber descartado los errores por factores externos, uno de los problemas más comunes que puede presentar WMI es la corrupción de su repositorio, para intentar repararlo podemos intentar actualizarlo y para ello debemos ejecutar el siguiente comando:
rundll32 WbemUpgd, UpgradeRepository
Tras realizar la actualización es posible que no encuentre los archivos de localización de algunos componentes, por ejemplo al ejecutar WMIC se puede quejar de que no encuentra el archivo c:\Windows\MUI\Fallback\0403\CLIEGALI.MFL
Una solución es copiarlo de otra carpeta, por ejemplo de c:\Windows\MUI\Fallback y después compilarlo utilizando la utilidad MOFCOMP.
mofcomp c:\Windows\MUI\Fallback\0403\CLIEGALI.MFL
Hablando de mofcomp otro de los errores comunes es que el archivo MOF de alguno de los proveedores WMI no se haya compilado correctamente, podemos intentar volverlo a recompilar utilizando el comando mofcomp de la siguiente manera:
mofcomp C:\WINDOWS\system32\wbem\Cli.mof
Si no nos funciona ni siquiera la utilidad mofcomp, es posible que tengamos errores más graves, un indicativo de ésto sería que retornara un error del tipo:
An error occurred while opening the namespace for object x defined on lines yyy
0X80041002 Class, instance, or property '' was not found.
Compiler returned error 0x80041002
Para solucionarlo podemos probar a re-registrar WMI en COM y sincronizar los contadores de rendimiento, para ello podemos ejecutar los siguientes comandos:
regsvr32.exe WBEMPROX.DLL
regsvr32.exe FASTPROX.DLL
winmgmt.exe /regserver
winmgmt.exe /clearadap
winmgmt.exe /resyncperf
Más info en:
WMI Architecture
http://msdn.microsoft.com/en-us/library/aa394553%28v=vs.85%29.aspx
WMI Command-line Tool is not Completely Localized in Std 2009
http://blogs.msdn.com/b/embedded/archive/2009/10/29/wmi-command-line-tool-is-not-completely-localized-in-std-2009.aspx
KX9CPP5ENM8F

No comments: