Registro de proveedores

Antes de implementar el proveedor debe registrar el proveedor en WMI. Al registro del proveedor define el tipo de proveedor y las clases que el proveedor admite. WMI solo puede acceder a proveedores registrados.

Nota

Para más información sobre cómo registrar un proveedor de MI, consulte Procedimientos para registrar proveedores de MI.

 

Puede escribir el código del proveedor antes de registrar el proveedor. Sin embargo, es muy difícil depurar los proveedores que no están registrados en WMI. La determinación de las interfaces del proveedor también ayuda a describir el propósito y la estructura de un proveedor. Por consiguiente, el registro de un proveedor sirve de ayuda al diseñarlo.

Los administradores son los únicos que pueden registrar o eliminar proveedores.

Los proveedores deben estar registrados para los distintos tipos de funciones de que realizan. Casi todos los proveedores proporcionan instancias de clases que definen, pero también pueden proporcionar datos de propiedad, métodos, eventos o clases. El proveedor también se puede registrar como proveedor de consumidores de eventos o como proveedor de contadores de rendimiento. Se recomienda combinar toda la funcionalidad de proveedor en un proveedor, en lugar de tener muchos proveedores independientes para cada tipo. Un ejemplo es el proveedor del Registro del sistema, que proporciona métodos e instancias, y el proveedor de cuota de disco, que proporciona instancias, métodos y eventos.

Los proveedores deben estar registrados para los distintos tipos de funciones de que realizan. Casi todos los proveedores proporcionan instancias de clases que definen, pero también pueden proporcionar datos de propiedad, métodos, eventos o clases. El proveedor también se puede registrar como proveedor de consumidores de eventos o como proveedor de contadores de rendimiento.

La misma instancia de __Win32Provider se usa para todos los tipos de registro:

Ejemplo: Creación y registro de una instancia de un proveedor

En el ejemplo siguiente se muestra un archivo MOF que crea y registra una instancia del proveedor del Registro del sistema en el espacio de nombres root\cimv2. Asigna el alias $Reg al proveedor para evitar el nombre de ruta de acceso largo necesario en los registros de instancia y método. Para más información, consulte Creación de un alias.

// Place the Registry provider in the root\cimv2 namespace
#pragma namespace("\\\\.\\ROOT\\cimv2")

// Create an instance of __Win32Provider
instance of __Win32Provider as $Reg
{
Name = "RegProv";        
CLSID = "{fe9af5c0-d3b6-11ce-a5b6-00aa00680c3f}";
HostingModel = "NetworkServiceHost:LocalServiceHost";
};

// Register as an instance provider by
// creating an instance
// of __InstanceProviderRegistration
instance of __InstanceProviderRegistration
{
 provider = $Reg;
 SupportsDelete = FALSE;
 SupportsEnumeration = TRUE;
 SupportsGet = TRUE;
 SupportsPut = TRUE;
};

// Register as a method provider by
// creating an instance
// of __MethodProviderRegistration
instance of __MethodProviderRegistration
{
 provider = $Reg;
};

// Define the StdRegProv class
[dynamic: ToInstance, provider("RegProv")]
class StdRegProv
{
[implemented, static] uint32 CreateKey(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName);
[implemented, static] uint32 DeleteKey(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName);
[implemented, static] uint32 EnumKey(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [OUT] string sNames[]);
[implemented, static] uint32 EnumValues(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [OUT] string sNames[], 
 [OUT] sint32 Types[]);
[implemented, static] uint32 DeleteValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName);
 [implemented, static] uint32 SetDWORDValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [IN] uint32 uValue = 3);
[implemented, static] uint32 GetDWORDValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [OUT] uint32 uValue);
[implemented, static] uint32 SetStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [IN] string sValue = "hello");
[implemented, static] uint32 GetStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [in] string sValueName, 
 [OUT] string sValue);
[implemented, static] uint32 SetMultiStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [IN] string sValue[] = {"hello", "there"});
[implemented, static] uint32 GetMultiStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [OUT] string sValue[]);
[implemented, static] uint32 SetExpandedStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [IN] string sValue = "%path%");
[implemented, static] uint32 GetExpandedStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [OUT] string sValue);
[implemented, static] uint32 SetBinaryValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [in] string sValueName, 
 [in] uint8 uValue[] = {1, 2});
[implemented, static] uint32 GetBinaryValue(
 {IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [OUT] uint8 uValue[]);
[implemented, static] uint32 CheckAccess(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] uint32 uRequired = 3, 
 [OUT] boolean bGranted);
};

Ejemplo: registro de un proveedor

En el procedimiento siguiente se describe cómo registrar un proveedor.

Para registrar un proveedor

  1. Registre el proveedor como un servidor COM.

    Si es necesario, es posible que tenga que crear entradas del registro. Este proceso se aplica a todos los servidores COM y no está relacionado con WMI. Para más información, consulte la sección de COM de la documentación del Kit de desarrollo de software (SDK) de Microsoft Windows.

  2. Cree un archivo MOF que contenga instancias de __Win32Provider y una instancia de una clase derivada directa o indirectamente de __ProviderRegistration, como __InstanceProviderRegistration. Los administradores son los únicos pueden registrar o eliminar proveedores mediante la creación de instancias de clases derivadas de __Win32Provider o __ProviderRegistration.

  3. Establezca HostingModel en la instancia de __Win32Provider según los valores de Modelos de hospedaje.

    Nota

    A menos que el proveedor requiera los privilegios elevados de la cuenta LocalSystem, la propiedad __Win32Provider.HostingModel debe establecerse en "NetworkServiceHost". Para más información, consulte Hospedaje y seguridad del proveedor.

     

    En el siguiente ejemplo de MOF del ejemplo completo se muestra el código que crea una instancia de __Win32Provider.

    instance of __Win32Provider as $Reg
    {
    Name = "RegProv";        
    CLSID = "{fe9af5c0-d3b6-11ce-a5b6-00aa00680c3f}";
    HostingModel = "NetworkServiceHost:LocalServiceHost";
    };
    
  4. Una instancia de una clase derivada directa o indirectamente de __ProviderRegistration, para describir la implementación lógica del proveedor. Se pueden registrar distintos proveedores para los diferentes tipos de funcionalidad. En el ejemplo anterior se registra RegProv como proveedor de instancias y métodos. Pero si RegProv admite la funcionalidad, también se podría registrar como proveedor de propiedades o de eventos. En la tabla siguiente se enumeran las clases que registran la funcionalidad del proveedor.

    Clases de registro del proveedor Descripción
    __InstanceProviderRegistration Registra un proveedor de instancias.
    __EventProviderRegistration Registra un proveedor de eventos.
    __EventConsumerProviderRegistration Registra un proveedores de consumidores de eventos.
    __MethodProviderRegistration Registra un proveedor de métodos.
    __PropertyProviderRegistration Registra un proveedor de propiedades.

     

  5. Coloque el archivo MOF en un directorio permanente.

    Normalmente, debe colocar el archivo en el directorio de instalación del proveedor.

  6. Utilice mofcomp o la interfaz de IMofCompiler para compilar el archivo MOF.

    Para más información, consulte Compilar archivos MOF.

    Windows 8 y Windows Server 2012: al instalar proveedores, tanto mofcomp como la interfaz IMofCompiler tratan los calificadores [Key] y [Static] como true si están presentes, independientemente de sus valores reales. Otros calificadores se tratan como false si están presentes pero no se establecen explícitamente en true.

Desarrollo de un proveedor WMI

Establecer descriptores de seguridad del espacio de nombres

Protección del proveedor