Utilización del instrumental de administración de Windows (WMI) para diagnósticos

Windows Communication Foundation (WCF) expone datos de la inspección de un servicio en el tiempo de ejecución a través de un proveedor del Instrumental de administración de Windows (WMI) WCF.

Habilitar WMI

WMI es la implementación de Microsoft de la norma de Web-Based Enterprise Management (WBEM). Para obtener más información acerca de el SDK de WMI, vea la biblioteca MSDN. (https://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/wmi\_start\_page.asp). WBEM es un estándar de la industria para saber cómo exponen las aplicaciones la instrumentación de administración a las herramientas de administración externas.

Un proveedor de WMI es un componente que expone la instrumentación en el tiempo de ejecución a través de una interfaz compatible con WBEM. Está compuesto de un conjunto de objetos WMI con pares atributo/valor. Los pares pueden ser de varios tipos simples. Las herramientas de administración pueden establecer la conexión con los servicios a través de la interfaz en el tiempo de ejecución. WCF expone atributos de servicios como direcciones, enlaces, comportamientos y agentes de escucha.

El proveedor de WMI integrado puede activarse en el archivo de configuración de la aplicación. Esto se consigue a través del atributo wmiProviderEnabled de <diagnostics> Element en la sección system.ServiceModel element, como se muestra en la configuración del ejemplo siguiente.

<system.serviceModel>
    …
    <diagnostics wmiProviderEnabled="true" />
    …
</system.serviceModel>

Esta entrada de configuración expone una interfaz WMI. Ahora, las aplicaciones de administración pueden establecer la conexión a través de esta interfaz y obtener acceso a la instrumentación de administración de la aplicación.

Obtener acceso a datos WMI

Puede obtenerse acceso a los datos WMI de maneras muy distintas. Microsoft proporciona API de WMI para los scripts, aplicaciones Visual Basic, aplicaciones C++ y .NET Framework. Para obtener más información, vea Utilización de WMI.

ms735120.Caution(es-es,VS.90).gifPrecaución:
Si utiliza los métodos proporcionados por .NET Framework para tener acceso mediante programación a los datos de WMI, debe tener en cuenta que tales métodos pueden iniciar excepciones una vez establecida la conexión. La conexión no se establece durante la construcción de la instancia ManagementObject, sino con la primera solicitud que implique el intercambio real de datos. Por lo tanto, utilice un bloque try..catch para detectar las posibles excepciones.

Puede cambiar la traza y el nivel de registro de mensajes, así como las opciones de registro de mensajes para el origen de seguimiento de la traza System.ServiceModel en WMI. Puede hacerlo teniendo acceso a la instancia AppDomainInfo, que expone estas propiedades booleanas: LogMessagesAtServiceLevel, LogMessagesAtTransportLevel, LogMalformedMessages, y TraceLevel. Por consiguiente, si configura un agente de escucha de seguimiento de traza para el registro de mensajes, pero define estas opciones en false, en la configuración, puede cambiarlas después a true, una vez se esté ejecutando la aplicación. Esto habilitará de manera efectiva el registro de mensajes en el tiempo de ejecución. De igual forma, si habilita el registro de mensajes en su archivo de configuración, puede deshabilitarlo en el tiempo de ejecución mediante WMI.

Debe tener en cuenta que si en el archivo de configuración no se especifica ningún agente de escucha de traza del registro de mensajes para el registro de mensajes, o no se especifica ningún agente de escucha System.ServiceModel para el seguimiento de traza, ninguno de sus cambios se hará efectivo, aunque WMI acepte los cambios. Para obtener más información sobre cómo establecer correctamente los agentes de escucha respectivos, vea Configuración del registro de mensajes y Configurar seguimiento. El nivel de seguimiento de traza, del resto de los orígenes de seguimiento de traza, especificado por la configuración es efectivo cuando se inicia la aplicación, y no se puede cambiar.

WCF expone un método GetOperationCounterInstanceName para scripting. Este método devuelve un nombre de instancia del contador de rendimiento si le proporciona un nombre de operación. Sin embargo, no valida la entrada. Por lo tanto, si proporciona un nombre de operación incorrecto, se devuelve un nombre de contador incorrecto.

La propiedad OutgoingChannel de la instancia Service no cuenta los canales abiertos por un servicio para establecer la conexión con otro servicio, si no se crea el cliente WCF del servicio de destino en el método Service.

Precaución   WMI solo admite un valor TimeSpan con un máximo de 3 separadores decimales. Por ejemplo, si su servicio establece una de sus propiedades en MaxValue, su valor se trunca pasados los 3 separadores decimales cuando se ve mediante WMI.

Seguridad

Dado que el proveedor WMI WCF permite la detección de servicios en un entorno, debería tener una precaución extrema al permitir el acceso a él. Si suaviza el acceso predeterminado exclusivo a los administradores, puede permitir el acceso de partes menos fiables a los datos confidenciales de su entorno. En concreto, si suaviza los permisos de acceso remoto a WMI, pueden producirse ataques por inundación. Si un proceso se inunda por un exceso de solicitudes de WMI, su rendimiento puede degradarse.

Además, si suaviza los permisos de acceso para el archivo MOF, partes menos fiables pueden manipular el comportamiento de WMI y modificar los objetos que se cargan en el esquema de WMI. Por ejemplo, pueden quitarse campos de modo que se oculten datos críticos al administrador, que no se puedan rellenar campos, o provocar que se agreguen excepciones al archivo.

De manera predeterminada, el proveedor de WMI WCF otorga permisos "ejecutar métodos", "escritura del proveedor", y "habilitar cuentas" para el administrador, y el permiso "habilitar cuentas" para ASP.NET, el servicio local y el servicio de red. En concreto, en plataformas no Windows Vista, la cuenta de ASP.NET posee acceso de lectura al espacio de nombres ServiceModel de WMI. Si no desea conceder estos privilegios a un grupo de usuarios determinado, debe desactivar el proveedor de WMI (deshabilitado de manera predeterminada), o deshabilitar el acceso para el grupo de usuarios concreto.

Además, al intentar habilitar WMI a través de la configuración, WMI puede no estar habilitada debido a un privilegio de usuario insuficiente. No obstante, no se escribe ningún evento en el registro de eventos que registre este error.

Para modificar los niveles de privilegio del usuario, siga los pasos siguientes.

  1. Haga clic en Inicio y, a continuación, en Ejecutar y escriba compmgmt.msc.
  2. Haga clic con el botón secundario en Servicios y Controles de Aplicación/WMI para seleccionar Propiedades.
  3. Seleccione la pestaña Seguridad, y vaya al espacio de nombres Root/ServiceModel . Haga clic en el botón Seguridad.
  4. Seleccione el grupo o usuario específico para el que desea controlar el acceso, y utilice la casilla Permitir o Denegar para configurar los permisos.

Acceso a las instancias de objeto de WMI remotas

Si necesita tener acceso a las instancias WMI WCF en un equipo remoto, debe habilitar la privacidad de paquete en las herramientas que utilice para el acceso. La siguiente sección describe cómo conseguirlo mediante CIM Studio de WMI, la herramienta de comprobación de instrumental de administración de Windows, y .NET SDK 2.0.

CIM Studio de WMI

Si ha instalado WMI Administrative Tools, puede usar CIM Studio de WMI para tener acceso a las instancias WMI. Las herramientas se encuentran en la carpeta siguiente

%windir%\Program Files\WMI Tools\

  1. En la ventana Conectar con el espacio de nombre:, escriba root\ServiceModel, y haga clic en Aceptar.
  2. En la ventana Inicio de sesión de CIM Studio de WMI, haga clic en el botón Opciones >> para expandir la ventana. Seleccione Privacidad de paquete para el Nivel de autenticación, y haga clic en Aceptar.

Herramienta de comprobación del instrumental de administración de Windows

Windows instala esta herramienta. Para ejecutarlo, inicie una consola de comandos escribiendo cmd.exe en el cuadro de diálogo Iniciar/Ejecutar, y haga clic en Aceptar. A continuación, escriba wbemtest.exe en la ventana de comandos. Se inicia la herramienta de comprobación del instrumental de administración de Windows.

  1. Haga clic en el botón Conectar situado en la esquina superior derecha de la ventana.
  2. En la nueva ventana, escriba root\ServiceModel en el campo Espacio de nombres, y seleccione Privacidad de paquete para el Nivel de autenticación. Haga clic en Conectar.

Utilización del código administrado

También puede obtener acceso a instancias WMI remotas mediante programación utilizando las clases proporcionadas por el espacio de nombres System.Management. En el ejemplo de código siguiente se muestra cómo utilizar este recurso.

String wcfNamespace = String.Format(@"\\{0}\Root\ServiceModel",    
   this.serviceMachineName);

ConnectionOptions connection = new ConnectionOptions();
connection.Authentication = AuthenticationLevel.PacketPrivacy;
ManagementScope scope = new ManagementScope(this.wcfNamespace, connection);