Nota
O acceso a esta páxina require autorización. Pode tentar iniciar sesión ou modificar os directorios.
O acceso a esta páxina require autorización. Pode tentar modificar os directorios.
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.
Habilitación de WMI
WMI es la implementación de Microsoft del estándar Web-Based Enterprise Management (WBEM). Para obtener más información sobre el SDK de WMI, consulte Instrumental de administración de Windows. WBEM es un estándar del sector para cómo las aplicaciones exponen la instrumentación de administración a herramientas de administración externas.
Un proveedor WMI es un componente que expone la instrumentación en tiempo de ejecución a través de una interfaz compatible con WBEM. Consta de un conjunto de objetos WMI que tienen pares de atributo y valor. Los pares pueden ser de varios tipos simples. Las herramientas de administración pueden conectarse a los servicios a través de la interfaz en tiempo de ejecución. WCF expone atributos de servicios como direcciones, enlaces, comportamientos y agentes de escucha.
El proveedor WMI integrado se puede activar en el archivo de configuración de la aplicación. Esto se hace a través del wmiProviderEnabled atributo de los <diagnósticos> en la <sección system.serviceModel> , como se muestra en la siguiente configuración de ejemplo.
<system.serviceModel>
…
<diagnostics wmiProviderEnabled="true" />
…
</system.serviceModel>
Esta entrada de configuración expone una interfaz WMI. Las aplicaciones de administración ahora se pueden conectar a través de esta interfaz y acceder a la instrumentación de administración de la aplicación.
Acceso a los datos de WMI
Se puede acceder a los datos WMI de muchas maneras diferentes. Microsoft proporciona API de WMI para scripts, aplicaciones de Visual Basic, aplicaciones de C++ y .NET Framework. Para obtener más información, vea Using WMI.
Precaución
Si usa los métodos proporcionados por .NET Framework para acceder mediante programación a los datos de WMI, debe tener en cuenta que dichos métodos pueden producir excepciones cuando se establece la conexión. La conexión no se establece durante la construcción de la ManagementObject instancia, sino en la primera solicitud que implica el intercambio real de datos. Por lo tanto, debe usar un try..catch bloque para detectar las posibles excepciones.
Puede cambiar el nivel de registro de mensajes y seguimiento, así como las opciones de registro de mensajes para el origen de System.ServiceModel seguimiento en WMI. Esto se puede hacer accediendo a la instancia de AppDomainInfo , que expone estas propiedades booleanas: LogMessagesAtServiceLevel, LogMessagesAtTransportLevel, LogMalformedMessages, y TraceLevel. Por lo tanto, si configura un agente de escucha de seguimiento para el registro de mensajes, pero establece estas opciones false en la configuración, puede cambiarlas más adelante a true cuando se ejecuta la aplicación. Esto habilitará eficazmente el registro de mensajes en tiempo de ejecución. Del mismo modo, si habilita el registro de mensajes en el archivo de configuración, puede deshabilitarlo en 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 seguimiento para el registro de mensajes para el registro de mensajes, o no se especifica ningún System.ServiceModel agente de escucha de seguimiento para el seguimiento, ninguno de los cambios se lleva a efecto, aunque WMI acepte los cambios. 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. El nivel de seguimiento de todos los demás orígenes de seguimiento especificados por la configuración es efectivo cuando se inicia la aplicación y no se puede cambiar.
WCF expone un GetOperationCounterInstanceName método para la creación de scripts. Este método devuelve un nombre de instancia de contador de rendimiento si se le proporciona un nombre de operación. Sin embargo, no valida su entrada. Por lo tanto, si proporciona un nombre de operación incorrecto, se devuelve un nombre de contador incorrecto.
La OutgoingChannel propiedad de la Service instancia no cuenta los canales abiertos por un servicio para conectarse a otro servicio, si el cliente WCF del servicio de destino no se ha creado dentro del Service método.
Cautela WMI solo admite un TimeSpan valor de hasta 3 decimales. Por ejemplo, si el servicio establece una de sus propiedades en MaxValue, su valor se trunca después de 3 decimales cuando se ve a través de WMI.
Seguridad
Dado que el proveedor WMI de WCF permite la detección de servicios en un entorno, debe tener mucho cuidado al conceder acceso a él. Si relaja el acceso predeterminado solo para administradores, puede permitir que las partes menos confiables accedan a los datos confidenciales de su entorno. En concreto, si afloja los permisos en el acceso remoto a WMI, se pueden producir ataques de inundación. Si un proceso se ve inundado por un exceso de solicitudes WMI, su rendimiento puede degradarse.
Además, si relaja los permisos de acceso para el archivo MOF, las partes de menor confianza pueden manipular el comportamiento de WMI y modificar los objetos que se cargan en el esquema WMI. Por ejemplo, los campos se pueden eliminar de manera que los datos críticos se oculten al administrador o que los campos que no se rellenen o provoquen excepciones se agreguen al archivo.
De forma predeterminada, el proveedor WMI de WCF concede el permiso "método de ejecución", "escritura del proveedor" y "habilitar cuenta" para el administrador, y el permiso "habilitar cuenta" para ASP.NET, servicio local y servicio de red. En concreto, en plataformas que no son de Windows Vista, la cuenta de ASP.NET tiene 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 WMI (está deshabilitado de forma predeterminada) o deshabilitar el acceso para el grupo de usuarios específico.
Además, al intentar habilitar WMI a través de la configuración, es posible que WMI no esté habilitado debido a privilegios de usuario insuficientes. Sin embargo, no se escribe ningún evento en el registro de eventos para registrar este error.
Para modificar los niveles de privilegios de usuario, siga estos pasos.
Haga clic en Inicio y, a continuación, en Ejecutar y escriba compmgmt.msc.
Haga clic con el botón secundario en Servicios y controles de aplicación/WMI para seleccionar Propiedades.
Seleccione la pestaña Seguridad y navegue hasta el espacio de nombres Root/ServiceModel . Haga clic en el botón Seguridad.
Seleccione el grupo o usuario específico al que desea controlar el acceso y utilice la casilla de verificación Permitir o Denegar para configurar los permisos.
Concesión de permisos de registro WMI de WCF a usuarios adicionales
WCF expone los datos de administración a WMI. Para ello, hospeda un proveedor WMI en proceso, a veces denominado "proveedor desacoplado". Para que los datos de administración queden expuestos, la cuenta que registra este proveedor debe tener los permisos adecuados. En Windows, solo un pequeño conjunto de cuentas con privilegios puede registrar proveedores desacoplados de forma predeterminada. Se trata de un problema porque los usuarios suelen querer exponer datos de WMI de un servicio WCF que se ejecuta en una cuenta que no está en el conjunto predeterminado.
Para proporcionar este acceso, un administrador debe conceder los siguientes permisos a la cuenta adicional en el siguiente orden:
Permiso para acceder al espacio de nombres WMI de WCF.
Permiso para registrar el proveedor WMI desacoplado de WCF.
Para conceder permiso de acceso al espacio de nombres WMI
Ejecute el siguiente script de PowerShell.
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 descriptores de seguridad (SDDL) para conceder al grupo de usuarios Built-In acceso al espacio de nombres WMI "root/servicemodel". Especifica las siguientes ACL:
Built-In Administrador (BA): ya tenía acceso.
Servicio de red (NS): ya tenía acceso.
Sistema local (LS): ya tenía acceso.
Built-In usuarios: el grupo al que se va a conceder acceso.
Para conceder acceso al registro de proveedores
Ejecute el siguiente script de PowerShell.
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 arbitrarios
En el ejemplo de esta sección se conceden privilegios de registro del proveedor WMI a todos los usuarios locales. 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. No hay una manera sencilla de obtener el SID para un usuario arbitrario. Un método es iniciar sesión como el usuario deseado y, a continuación, ejecutar el siguiente comando de shell.
Whoami /user
Para obtener más información, consulte SID conocidos.
Acceso a instancias de objetos WMI remotas
Si necesita acceder a las instancias WMI de WCF en un equipo remoto, debe habilitar la privacidad de paquetes en las herramientas que usa para el acceso. En la sección siguiente se describe cómo lograr estos problemas mediante WMI CIM Studio, el Probador de Instrumental de administración de Windows y el SDK de .NET 2.0.
CIM Studio de WMI
Si ha instalado WMI Administrative Tools, puede usar WMI CIM Studio para acceder a las instancias de WMI. Las herramientas se encuentran en la siguiente carpeta:
%windir%\Archivos de programa\Herramientas WMI\
En la ventana Conectar al espacio de nombres: , escriba root\ServiceModel y haga clic en Aceptar.
En la ventana de inicio de sesión de WMI CIM Studio , haga clic en el botón Opciones >> para expandir la ventana. Seleccione Privacidad de paquetes en Nivel de autenticación y haga clic en Aceptar.
Probador de Instrumental de administración de Windows
Esta herramienta es instalada por Windows. Para ejecutarlo, inicie una consola de comandos escribiendo cmd.exe en el cuadro de diálogo Inicio/Ejecución y haga clic en Aceptar. A continuación, escriba wbemtest.exe en la ventana de comandos. A continuación, se inicia la herramienta Probador de Instrumental de administración de Windows.
Haga clic en el botón Conectar en la esquina superior derecha de la ventana.
En la nueva ventana, escriba root\ServiceModel en el campo Espacio de nombres y seleccione Privacidad de paquetes en Nivel de autenticación. Haga clic en Conectar.
Uso de código administrado
También puede acceder a instancias remotas de WMI mediante programación mediante clases proporcionadas por el espacio de System.Management nombres. En el siguiente ejemplo de código se muestra cómo hacerlo.
String wcfNamespace = $@"\\{this.serviceMachineName}\Root\ServiceModel");
ConnectionOptions connection = new ConnectionOptions();
connection.Authentication = AuthenticationLevel.PacketPrivacy;
ManagementScope scope = new ManagementScope(this.wcfNamespace, connection);