Utilización del instrumental de administración de Windows (WMI) para diagnósticosUsing Windows Management Instrumentation for Diagnostics

Windows Communication Foundation (WCF) expone los datos de inspección de un servicio en tiempo de ejecución a través de un proveedor de Instrumental de administración de Windows (WMI) de WCF.Windows Communication Foundation (WCF) exposes inspection data of a service at runtime through a WCF Windows Management Instrumentation (WMI) provider.

Habilitar WMIEnabling WMI

WMI es la implementación de Microsoft del estándar Web-Based Enterprise Management (WBEM).WMI is Microsoft's implementation of the Web-Based Enterprise Management (WBEM) standard. Para obtener más información sobre el SDK de WMI, vea Instrumental de administración de Windows.For more information about the WMI SDK, see Windows Management Instrumentation. 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.WBEM is an industry standard for how applications expose management instrumentation to external management tools.

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.A WMI provider is a component that exposes instrumentation at runtime through a WBEM-compatible interface. Está compuesto de un conjunto de objetos WMI con pares atributo/valor.It consists of a set of WMI objects that have attribute/value pairs. Los pares pueden ser de varios tipos simples.Pairs can be of a number of simple types. Las herramientas de administración pueden conectarse a los servicios a través de la interfaz en tiempo de ejecución.Management tools can connect to the services through the interface at runtime. WCF expone atributos de servicios como direcciones, enlaces, comportamientos y agentes de escucha.WCF exposes attributes of services such as addresses, bindings, behaviors, and listeners.

El proveedor de WMI integrado puede activarse en el archivo de configuración de la aplicación.The built-in WMI provider can be activated in the configuration file of the application. Esto se hace wmiProviderEnabled a través del atributo del <> de diagnóstico en la <sección system.serviceModel>, como se muestra en la siguiente configuración de ejemplo.This is done through the wmiProviderEnabled attribute of the <diagnostics> in the <system.serviceModel> section, as shown in the following sample configuration.

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

Esta entrada de configuración expone una interfaz WMI.This configuration entry exposes a WMI interface. 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.Management applications can now connect through this interface and access the management instrumentation of the application.

Obtener acceso a datos WMIAccessing WMI Data

Puede obtenerse acceso a los datos WMI de maneras muy distintas.WMI data can be accessed in many different ways. Microsoft proporciona API de WMI para scripts, aplicaciones de Visual Basic, aplicaciones C++ y .NET Framework.Microsoft provides WMI APIs for scripts, Visual Basic applications, C++ applications, and the .NET Framework. Para obtener más información, consulte Uso de WMI.For more information, see Using WMI.

Precaució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.If you use the .NET Framework provided methods to programmatically access WMI data, you should be aware that such methods may throw exceptions when the connection is established. 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.The connection is not established during the construction of the ManagementObject instance, but on the first request involving actual data exchange. Por lo tanto, utilice un bloque try..catch para detectar las posibles excepciones.Therefore, you should use a try..catch block to catch the possible exceptions.

Puede cambiar la traza y el nivel de registro de mensajes, así como las opciones de registro de mensajes para el origen de traza de la traza System.ServiceModel en WMI.You can change the trace and message logging level, as well as message logging options for the System.ServiceModel trace source in WMI. Esto se puede hacer accediendo a la instancia de AppDomainInfo, que expone estas propiedades LogMessagesAtServiceLevelbooleanas: LogMessagesAtTransportLevel, , LogMalformedMessagesy TraceLevel.This can be done by accessing the AppDomainInfo instance, which exposes these Boolean properties: LogMessagesAtServiceLevel, LogMessagesAtTransportLevel, LogMalformedMessages, and TraceLevel. Por consiguiente, si configura un agente de escucha 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.Therefore, if you configure a trace listener for message logging, but set these options to false in configuration, you can later change them to true when the application is running. Esto habilitará de manera efectiva el registro de mensajes en el tiempo de ejecución.This will effectively enable message logging at runtime. 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.Similarly, if you enable message logging in your configuration file, you can disable it at runtime using WMI.

Debe tener en cuenta que si en el archivo de configuración no se especifica ningún agente de escucha de traza de registro de mensajes para el registro de mensajes, o no se especifica ningún agente de escucha de traza de System.ServiceModel, no se aplica ninguno de sus cambios, aunque WMI los acepte.You should be aware that if no message logging trace listeners for message logging, or no System.ServiceModel trace listeners for tracing are specified in the configuration file, none of your changes are taken into effect, even though the changes are accepted by WMI. Para obtener más información sobre cómo configurar correctamente los agentes de escucha respectivos, consulte Configuración del registro de mensajes y Configuración del seguimiento.For more information on properly setting up the respective listeners, see Configuring Message Logging and Configuring Tracing. El nivel de seguimiento de traza, del resto de los orígenes de traza de traza, especificado por la configuración es efectivo cuando se inicia la aplicación, y no se puede cambiar.The trace level of all other trace sources specified by configuration is effective when the application starts, and cannot be changed.

WCF expone GetOperationCounterInstanceName un método para secuencias de comandos.WCF exposes a GetOperationCounterInstanceName method for scripting. Este método devuelve un nombre de instancia del contador de rendimiento si le proporciona un nombre de operación.This method returns a performance counter instance name if you provide it with an operation name. Sin embargo, no valida la entrada.However, it does not validate your input. Por lo tanto, si proporciona un nombre de operación incorrecto, se devuelve un nombre de contador incorrecto.Therefore, if you provide an incorrect operation name, an incorrect counter name is returned.

La OutgoingChannel propiedad Service de la instancia no cuenta los canales abiertos por un servicio para conectarse Service a otro servicio, si el cliente WCF al servicio de destino no se crea dentro del método.The OutgoingChannel property of the Service instance does not count channels opened by a service to connect to another service, if the WCF client to the destination service is not created within the Service method.

Precaución WMI solo TimeSpan admite un valor de hasta 3 puntos decimales.Caution WMI only supports a TimeSpan value up to 3 decimal points. 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.For example, if your service sets one of its properties to MaxValue, its value is truncated after 3 decimal points when viewed through WMI.

SeguridadSecurity

Dado que el proveedor WMI de WCF permite la detección de servicios en un entorno, debe tener mucho cuidado para conceder acceso a él.Because the WCF WMI provider allows the discovery of services in an environment, you should exercise extreme caution for granting access to it. Si suaviza el acceso predeterminado exclusivo a los administradores, puede permitir el acceso de partes menos fiables a los datos confidenciales de su entorno.If you relax the default administrator-only access, you may allow less-trusted parties access to sensitive data in your environment. En concreto, si suaviza los permisos de acceso remoto a WMI, pueden producirse ataques por inundación.Specifically, if you loosen permissions on remote WMI access, flooding attacks can occur. Si un proceso se inunda por un exceso de solicitudes de WMI, su rendimiento puede degradarse.If a process is flooded by excessive WMI requests, its performance can be degraded.

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.In addition, if you relax access permissions for the MOF file, less-trusted parties can manipulate the behavior of WMI and alter the objects that are loaded in the WMI schema. 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.For example, fields can be removed such that critical data is concealed from the administrator or that fields that do not populate or cause exceptions are added to the file.

De forma predeterminada, el proveedor WMI de WCF concede el permiso "execute method", "provider write" y "enable account" para Administrator y el permiso "enable account" para ASP.NET, Local Service y Network Service.By default, the WCF WMI provider grants "execute method", "provider write", and "enable account" permission for Administrator, and "enable account" permission for ASP.NET, Local Service and Network Service. En particular, en plataformas que no son de Windows Vista, la cuenta de ASP.NET tiene acceso de lectura al espacio de nombres ServiceModel de WMI.In particular, on non-Windows Vista platforms, the ASP.NET account has read access to the WMI ServiceModel namespace. 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.If you do not want to grant these privileges to a particular user group, you should either deactivate the WMI provider (it is disabled by default), or disable access for the specific user group.

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.In addition, when you attempt to enable WMI through configuration, WMI may not be enabled due to insufficient user privilege. No obstante, no se escribe ningún evento en el registro de eventos que registre este error.However, no event is written to the event log to record this failure.

Para modificar los niveles de privilegio del usuario, siga los pasos siguientes.To modify user privilege levels, use the following steps.

  1. Haga clic en Inicio y, a continuación, en Ejecutar y escriba compmgmt.msc.Click Start and then Run and type compmgmt.msc.

  2. Haga clic con el botón derecho en Servicios y controles de aplicación/WMI para seleccionar Propiedades.Right-click Services and Application/WMI Controls to select Properties.

  3. Seleccione la ficha Seguridad y vaya al espacio de nombres Raíz/ServiceModel.Select the Security Tab, and navigate to the Root/ServiceModel namespace. Haga clic en el botón Seguridad.Click the Security button.

  4. Seleccione el grupo o usuario específico que desea controlar el acceso y use la casilla Permitir o Denegar para configurar los permisos.Select the specific group or user that you want to control access and use the Allow or Deny checkbox to configure permissions.

Conceder permisos de registro de WCF WMI a usuarios adicionalesGranting WCF WMI Registration Permissions to Additional Users

WCF expone datos de administración a WMI.WCF exposes management data to WMI. Lo hace hospedando un proveedor WMI en proceso, a veces llamado "proveedor desacoplado".It does so by hosting an in-process WMI provider, sometimes called a "decoupled provider". La cuenta que registra este proveedor debe tener los permisos apropiados para poder exponer los datos de administración.For the management data to be exposed, the account that registers this provider must have the appropriate permissions. En Windows, solo un pequeño conjunto de cuentas privilegiadas pueden registrar proveedores desacoplados de forma predeterminada.In Windows, only a small set of privileged accounts can register decoupled providers by default. Esto supone un problema, ya que los usuarios normalmente desean exponer los datos WMI de un servicio WCF que se está ejecutando bajo una cuenta que no se encuentra en el conjunto predeterminado.This is a problem because users commonly want to expose WMI data from a WCF service running under an account that is not in the default set.

Para proporcionar este acceso, el administrador debe conceder los permisos siguientes a la cuenta adicional en el orden siguiente:To provide this access, an administrator must grant the following permissions to the additional account in the following order:

  1. Permiso para tener acceso al espacio de nombres de WMI de WCF.Permission to access to the WCF WMI Namespace.

  2. Permiso para registrar el proveedor desacoplado WMI de WCF.Permission to register the WCF Decoupled WMI Provider.

Para conceder permiso de acceso al espacio de nombres WMITo grant WMI namespace access permission

  1. Ejecute el siguiente script de PowerShell.Run the following PowerShell script.

    write-host ""  
    write-host "Granting Access to root/servicemodel WMI namespace to built in users group"  
    write-host ""  
    
    # Create the binary representation of the permissions to grant in SDDL  
    $newPermissions = "O:BAG:BAD:P(A;CI;CCDCLCSWRPWPRCWD;;;BA)(A;CI;CC;;;NS)(A;CI;CC;;;LS)(A;CI;CC;;;BU)"  
    $converter = new-object system.management.ManagementClass Win32_SecurityDescriptorHelper  
    $binarySD = $converter.SDDLToBinarySD($newPermissions)  
    $convertedPermissions = ,$binarySD.BinarySD  
    
    # Get the object used to set the permissions  
    $security = gwmi -namespace root/servicemodel -class __SystemSecurity  
    
    # Get and output the current settings  
    $binarySD = @($null)  
    $result = $security.PsBase.InvokeMethod("GetSD",$binarySD)  
    
    $outsddl = $converter.BinarySDToSDDL($binarySD[0])  
    write-host "Previous ACL: "$outsddl.SDDL  
    
    # Change the Access Control List (ACL) using SDDL  
    $result = $security.PsBase.InvokeMethod("SetSD",$convertedPermissions)
    
    # Get and output the current settings  
    $binarySD = @($null)  
    $result = $security.PsBase.InvokeMethod("GetSD",$binarySD)  
    
    $outsddl = $converter.BinarySDToSDDL($binarySD[0])  
    write-host "New ACL:      "$outsddl.SDDL  
    write-host ""  
    

    Este script de PowerShell usa el lenguaje de definición de descriptor de seguridad (SDDL) para conceder al grupo Usuarios integrados acceso al espacio de nombres WMI "root/servicemodel".This PowerShell script uses Security Descriptor Definition Language (SDDL) to grant the Built-In Users group access to the "root/servicemodel" WMI namespace. Especifica las ACL siguientes:It specifies the following ACLs:

    • Cuenta predefinida Administrador (BA) - Ya tenía acceso.Built-In Administrator (BA) - Already Had Access.

    • Servicio de red (NS) - Ya tenía acceso.Network Service (NS) - Already Had Access.

    • Sistema local (LS) - Ya tenía acceso.Local System (LS) - Already Had Access.

    • Usuarios integrado - El grupo al que se va a conceder acceso.Built-In Users - The group to grant access to.

Para conceder acceso de registro de proveedoresTo grant provider registration access

  1. Ejecute el siguiente script de PowerShell.Run the following PowerShell script.

    write-host ""  
    write-host "Granting WCF provider registration access to built in users group"  
    write-host ""  
    # Set security on ServiceModel provider  
    $provider = get-WmiObject -namespace "root\servicemodel" __Win32Provider  
    
    write-host "Previous ACL: "$provider.SecurityDescriptor  
    $result = $provider.SecurityDescriptor = "O:BUG:BUD:(A;;0x1;;;BA)(A;;0x1;;;NS)(A;;0x1;;;LS)(A;;0x1;;;BU)"  
    
    # Commit the changes and display it to the console  
    $result = $provider.Put()  
    write-host "New ACL:      "$provider.SecurityDescriptor  
    write-host ""  
    

Conceder acceso a usuarios o grupos arbitrariosGranting Access to Arbitrary Users or Groups

En el ejemplo de esta sección se conceden privilegios de registro de proveedores WMI a todos los usuarios locales.The example in this section grants WMI Provider registration privileges to all local users. Si desea conceder acceso a un usuario o grupo que no está integrado, debe obtener el identificador de seguridad (SID) de ese usuario o grupo.If you want to grant access to a user or group that is not built in, then you must obtain that user or group's Security Identifier (SID). No hay ninguna forma sencilla de obtener el SID de un usuario arbitrario.There is no simple way to get the SID for an arbitrary user. Un método consiste en iniciar sesión como el usuario deseado y, a continuación, usar el comando shell siguiente.One method is to log on as the desired user and then issue the following shell command.

Whoami /user  

Esto proporciona el SID del usuario actual, pero este método no se puede usar para obtener el SID de un usuario arbitrario.This provides the SID of the current user, but this method cannot be used to get the SID on any arbitrary user. Otro método para obtener el SID es usar la herramienta getsid.exe de las Herramientas del Kit de recursos de Windows 2000 para tareas administrativas.Another method to get the SID is to use the getsid.exe tool from the Windows 2000 Resource Kit Tools for administrative tasks. Esta herramienta compara el SID de dos usuarios (locales o del dominio), y como efecto secundario imprime ambos SID en la línea de comandos.This tool compares the SID of two users (local or domain), and as a side effect prints the two SIDs to the command line. Para obtener más información, consulte SSI conocidos.For more information, see Well Known SIDs.

Acceso a las instancias de objeto de WMI remotasAccessing Remote WMI Object Instances

Si necesita tener acceso a instancias WMI de WCF en un equipo remoto, debe habilitar la privacidad de paquetes en las herramientas que usa para el acceso.If you need to access WCF WMI instances on a remote machine, you must enable packet privacy on the tools that you use for access. La siguiente sección describe cómo conseguirlo mediante CIM Studio de WMI, la Herramienta de comprobación del instrumental de administración de Windows, y .NET SDK 2.0.The following section describes how to achieve these using the WMI CIM Studio, Windows Management Instrumentation Tester, as well as .NET SDK 2.0.

CIM Studio de WMIWMI CIM Studio

Si ha instalado WMI Administrative Tools, puede utilizar WMI CIM Studio para acceder a las instancias de WMI.If you've installed WMI Administrative Tools, you can use the WMI CIM Studio to access WMI instances. Las herramientas se encuentran en la siguiente carpeta:The tools are in the following folder:

%windir%-Archivos de programa-Herramientas WMI\%windir%\Program Files\WMI Tools\

  1. En la ventana Conectar al espacio de nombres:, escriba root-ServiceModel y haga clic en Aceptar.In the Connect to namespace: window, type root\ServiceModel and click OK.

  2. En la ventana de inicio de sesión de WMI CIM Studio, haga clic en el botón ** >>opciones** para expandir la ventana.In the WMI CIM Studio Login window, click the Options >> button to expand the window. Seleccione Privacidad de paquetes para Nivel de autenticacióny haga clic en Aceptar.Select Packet privacy for Authentication level, and click OK.

Herramienta de comprobación del instrumental de administración de WindowsWindows Management Instrumentation Tester

Windows instala esta herramienta.This tool is installed by Windows. Para ejecutarlo, inicie una consola de comandos escribiendo cmd.exe en el cuadro de diálogo Inicio/Ejecutar y haga clic en Aceptar.To run it, launch a command console by typing cmd.exe in the Start/Run dialog box and click OK. A continuación, escriba wbemtest.exe en la ventana de comandos.Then, type wbemtest.exe in the command window. Se inicia la Herramienta de comprobación del instrumental de administración de Windows.The Windows Management Instrumentation Tester tool is then launched.

  1. Haga clic en el botón Conectar en la esquina superior derecha de la ventana.Click the Connect button on the top right corner of the window.

  2. En la nueva ventana, escriba root-ServiceModel para el campo Espacio de nombres y seleccione Privacidad de paquetes para Nivel de autenticación.In the new window, enter root\ServiceModel for the Namespace field, and select Packet privacy for Authentication level. Haga clic en Conectar.Click Connect.

Utilización del código administradoUsing Managed Code

También puede obtener acceso a instancias WMI remotas mediante programación utilizando las clases proporcionadas por el espacio de nombres System.Management.You can also access remote WMI instances programmatically by using classes provided by the System.Management namespace. En el ejemplo de código siguiente se muestra cómo utilizar este recurso.The following code sample demonstrates how to do this.

String wcfNamespace = $@"\\{this.serviceMachineName}\Root\ServiceModel");
  
ConnectionOptions connection = new ConnectionOptions();  
connection.Authentication = AuthenticationLevel.PacketPrivacy;  
ManagementScope scope = new ManagementScope(this.wcfNamespace, connection);