Hospedaje y seguridad del proveedor

La propiedad HostingModel de la instancia __Win32Provider que representa al proveedor especifica el modelo de hospedaje del proveedor. Establecer esta propiedad hace que el proveedor se cargue en un proceso de hospedaje compartido que tenga un nivel de privilegio especificado.

Proceso de hospedaje del proveedor compartido

WMI reside en un host de servicio compartido con otros servicios. Para evitar detener todos los servicios cuando se produce un error en un proveedor, los proveedores se cargan en un proceso de hospedaje independiente denominado "Wmiprvse.exe". Se puede ejecutar más de un proceso con este nombre. Cada una de ellas se puede ejecutar en una cuenta diferente con una seguridad variable. Tenga en cuenta que, a partir de Windows Vista, use el comando winmgmt para ejecutar WMI en un proceso independiente mediante un puerto fijo. Para obtener más información, vea Conexión remota a WMI a partir de Vista.

El host compartido se puede ejecutar en una de las siguientes cuentas del sistema en un proceso de host de Wmiprvse.exe:

Un proveedor también puede ser un servidor COM local (.exe) o autohospedado, que no requiere un host de proveedor WMI.

Establecer el modelo de hospedaje

Dado que LocalSystem es una cuenta con privilegios, se recomienda establecer HostingModel en NetworkServiceHost cuando un proveedor se ejecuta en un proceso de Wmiprvse.exe. La cuenta networkServiceHost es para los servicios que no requieren privilegios extensos, pero que necesitan comunicarse de forma remota con otros sistemas.

Si no establece un valor para la propiedad HostingModel, WMI establecerá un valor predeterminado de NetworkServiceHostOrSelfHost. Si el valor de HostingModel se establece en LocalSystemHost, WMI usa el seguimiento para generar eventos 5603 y 5604 en el registro de eventos de Windows. Dado que la cuenta LocalSystem local tiene privilegios elevados, no se recomienda esta configuración. Puede ver estos eventos en el Visor de eventos. Para obtener más información, vea Seguimiento de la actividad de WMI.

Establezca la propiedad HostingModel para los proveedores desacoplados como "Desacopled:Com". Los proveedores creados mediante la incorporación de clases de instrumentación de Microsoft.Management.Infrastructure en .NET Framework son proveedores desacoplados. (System.Management.Instrumentation ya no se admite). Para obtener más información sobre cómo crear un proveedor desacoplado, consulte Incorporación de un proveedor en una aplicación.

El modelo de hospedaje se especifica en la propiedad HostingModel de la instancia __Win32Provider que representa el proveedor.

Para establecer el modelo de hospedaje de un proveedor

  1. En el archivo MOF que define el proveedor, cree una instancia __Win32Provider.

  2. Asigne un nombre al proveedor en la propiedad Name y asigne el identificador de clase (CLSID) del objeto COM del proveedor a la propiedad Clsid.

    En el ejemplo de código siguiente se asigna un nombre a la propiedad Name y al CSLID del objeto COM del proveedor a la propiedad Clsid.

    Instance of __Win32Provider as $NewProvider
    {
        Name = "MyProvider";
        Clsid = "{.......}";
    }
    
  3. Asigne el valor de host compartido adecuado a la propiedad HostingModel. Los valores de host compartidos como "NetworkServiceHost" se definen en la propiedad HostingSpecification de la clase MSFT_Providers.

    En el ejemplo de código siguiente se asigna un valor de host compartido a la propiedad HostingModel.

    HostingModel = "NetworkServiceHost";
    

En el ejemplo de código siguiente se muestra cómo registrar un proveedor en NetworkServiceHost.

Instance of __Win32Provider as $NewProvider
{
    Name = "MyProvider";
    Clsid = "{.......}";
    HostingModel = "NetworkServiceHost";
}

Si tiene varios proveedores, puede agruparlos en un host de servicio específico registrando el proveedor para que resida en la instancia específica.

En el ejemplo de código siguiente también se registra un proveedor en NetworkServiceHost. La clase MSFT_Providers define valores para los dos valores que se combinan para crear la propiedad HostingModel de __Win32Provider. En el ejemplo, el valor "NetworkServiceHost" procede de la propiedad HostingSpecification de MSFT_Providers y "LocalServiceHost" procede de la propiedad HostingGroup.

Instance of __Win32Provider as $NewProvider
{
    Name = "MyProvider";
    Clsid = "{.......}";
    HostingModel = "NetworkServiceHost:MySharedHost";
}

Existen problemas de desarrollo especiales para proveedores que no están desacoplados y se hospedan en el proceso wmiprvse. Para obtener más información, vea Proveedores de depuración.

Si está escribiendo un proveedor que contiene el registro del proveedor de propiedades o clases, no todos los modelos de subprocesos funcionan. Para obtener más información, vea Elegir el registro correcto.

Valores de HostingModel para proveedores de In-Process

En la lista siguiente se enumeran los valores del modelo de hospedaje del proveedor que se van a usar en la instancia __Win32Provider para los proveedores que se ejecutan en un proceso de Wmiprvse.exe.

Valor en __Win32Provider.HostingModel Descripción
SelfHost El proveedor comienza a usar la implementación del servidor local en lugar de en proceso. El contexto de seguridad del proceso en el que se ejecuta el proveedor determina el contexto de seguridad del proveedor.
LocalSystemHost El proveedor, si se implementa como en proceso, se carga en un host de proveedor compartido que se ejecuta en el contexto LocalSystem. A partir de Windows Vista, LocalSystemHost ya no es el modelo de hospedaje predeterminado si el HostingModel de un proveedor WMI (propiedad __Win32Provider.HostingModel) no está especificado. Para obtener más información, consulte Seguridad de los modelos de hospedaje.
LocalSystemHostOrSelfHost El proveedor se hospeda automáticamente o se carga en el proceso de Wmiprvse.exe que se ejecuta en la cuenta LocalSystem. Dado que LocalSystem es una cuenta con privilegios elevados, se genera una entrada en el registro de eventos de Security NT para notificar a los administradores de un proveedor que se ejecuta en este estado de confianza.
NetworkServiceHost El proveedor, si se implementa como en proceso, se carga en el proceso de Wmiprvse.exe que se ejecuta en la cuenta NetworkService. A partir de Windows Vista, este es el modelo de hospedaje predeterminado si no se especifica el HostingModel de un proveedor WMI (propiedad __Win32Provider.HostingModel). Para obtener más información, consulte Seguridad de los modelos de hospedaje.
NetworkServiceHost tiene privilegios limitados y, por tanto, reduce la posibilidad de un ataque de elevación de privilegios. Si el proveedor solo funciona en el equipo local, establezca la propiedad HostingModel en LocalServiceHost.
NetworkServiceHostOrSelfHost El proveedor se hospeda automáticamente o se carga en el proceso de WmiPrvse.exe que se ejecuta en la cuenta NetworkService. NetworkServiceHostOrSelfHost es la configuración predeterminada cuando la propiedad HostingModel de __Win32Provider es NULL. Dado que NetworkServiceHostOrSelfHost es el valor predeterminado, los proveedores de sistemas operativos anteriores pueden seguir funcionando en Windows Vista, Windows Server 2008 y sistemas operativos posteriores.
LocalServiceHost El proveedor, si se implementa como en proceso, se carga en el proceso de Wmiprvse.exe que se ejecuta en la cuenta LocalService. Este es el modelo de hospedaje recomendado para los servicios porque LocalService tiene privilegios limitados.

Valores de HostingModel para proveedores desacoplados

En la lista siguiente se enumeran los valores del modelo de hospedaje del proveedor para los proveedores desacoplados.

Decoupled:Com

El proveedor es un proveedor desacoplado hospedado en un proceso independiente que es un cliente de WMI.

En el ejemplo siguiente se muestra el especificador FoldIdentity para la propiedad HostingModel establecida en FALSE, lo que permite al proveedor suplantar al cliente.

Decoupled:Com:FoldIdentity(FALSE)

Si no se especifica FoldIdentity, el valor FoldIdentity se establece en TRUE de forma predeterminada. Por motivos de seguridad, se recomienda no especificar FoldIdentity(FALSE), ya que una aplicación no autorizada con suplantación de Delegado puede afectar a todo un dominio.

En el ejemplo siguiente se muestra la propiedad HostingModel establecida de la manera recomendada que equivale a establecer FoldIdentity(TRUE).

Decoupled:Com

Decoupled:Noncom

Solo para uso interno. No compatible.

Seguridad de los modelos de hospedaje

En la mayoría de las situaciones, LocalSystem no es necesario y el contexto NetworkServiceHost es más adecuado. La mayoría de los proveedores WMI deben suplantar el contexto de seguridad del cliente para realizar operaciones solicitadas en nombre del cliente WMI. A partir de Windows Vista, un proveedor WMI que carece de una definición de modelo de hospedaje y se ejecuta como si se ejecutase en LocalSystem no se ejecutará correctamente. Para corregir esta situación, cambie el modelo de hospedaje esperado y asegúrese de que el código del proveedor WMI realiza las operaciones en el contexto de seguridad del cliente suplantando al cliente WMI. LocalSystem rara vez es un requisito. Si el proveedor debe tener ese nivel de privilegio, especifique el modelo de hospedaje con la siguiente instrucción en el archivo MOF.

HostingModel=LocalSystemHost

Elección del registro correcto

Acceso a espacios de nombres WMI

Protección de espacios de nombres de WMI

Clases de configuración y solución de problemas del proveedor

MSFT_Providers

Mantenimiento de la seguridad de WMI