Compartir a través de


Incorporación de un proveedor en una aplicación

Al crear una aplicación que se va a instrumentar, el procedimiento recomendado es incluir el proveedor como componente dentro de la propia aplicación. Esta práctica permite que Windows Management Instrumentation (WMI) interactúe directamente con el proveedor de servicios en lugar de indirectamente mediante la API del programa. Desacoplar el proveedor de WMI también coloca la aplicación en control de la duración del proveedor, en lugar de WMI. Para obtener más información sobre cómo escribir un proveedor que se ejecuta en el proceso WMI, vea Proporcionar datos a WMI escribiendo un proveedor. Para obtener más información sobre el modelo de hospedaje y la configuración de seguridad del proveedor, vea Hospedaje y seguridad del proveedor.

En el diagrama siguiente se muestra la relación entre WMI, un proveedor desacoplado y una aplicación.

relación entre wmi, proveedor desacoplado y aplicación

Para obtener más información sobre los métodos de proveedor desacoplados, vea IWbemDecoupledRegistrar e IWbemDecoupledBasicEventProvider.

Nota

El proveedor desacoplado admite instancias, métodos, proveedores de eventos y consumidores de eventos. No admite proveedores de clases y propiedades. Para obtener más información, vea Escritura de un proveedor de clases y Escritura de un proveedor de propiedades.

 

Los ejemplos de código de este tema requieren las siguientes referencias e incluye instrucciones para compilarse correctamente.

#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>
#include <wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")

En el procedimiento siguiente se usan ejemplos de código de C++ para describir cómo incorporar un proveedor desacoplado en la aplicación. El método de inicialización de la aplicación realiza los pasos siguientes para que WMI solo interactúe con un proveedor desacoplado registrado.

Para implementar un proveedor desacoplado en una aplicación de C++

  1. Inicialice la biblioteca COM para que la use el subproceso que realiza la llamada.

    En el siguiente ejemplo de código se muestra cómo inicializar la biblioteca COM.

    HRESULT hr = S_OK ;
    hr = CoInitializeEx (0, COINIT_MULTITHREADED );
    
  2. Establezca el nivel de seguridad de proceso predeterminado.

    Este nivel establece el nivel de seguridad necesario para que otros procesos accedan a la información del proceso de cliente. El nivel de autenticación debe ser RPC_C_AUTHN_LEVEL_DEFAULT. Para obtener más información, consulte Mantener la seguridad de WMI.

    El siguiente ejemplo de código muestra cómo establecer el nivel de seguridad por defecto.

    hr = CoInitializeSecurity (NULL, 
        -1, 
        NULL, 
        NULL,
        RPC_C_AUTHN_LEVEL_DEFAULT,
        RPC_C_IMP_LEVEL_IMPERSONATE,
        NULL, 
        EOAC_DYNAMIC_CLOAKING, 
        NULL);
    
    if (FAILED(hr))
    {
      CoUninitialize();
      cout << "Failed to initialize security. Error code = 0x"
           << hex << hr << endl;
      return;
    }
    
  3. Registre el registrador de proveedores desacoplado.

    En el ejemplo de código siguiente se muestra cómo registrar el registrador de proveedores desacoplado.

    CLSID CLSID_WbemDecoupledRegistrar;
    IID IID_IWbemDecoupledRegistrar;
    IWbemDecoupledRegistrar *myRegistrar = NULL;
    
    hr = CoCreateInstance(CLSID_WbemDecoupledRegistrar,
                          NULL,
                          CLSCTX_INPROC_SERVER,
                          IID_IWbemDecoupledRegistrar,
                          (void**)&myRegistrar);
    if (SUCCEEDED(hr))
    {
        IUnknown *pIUnknown = NULL;
        // CMyProv is the class added for WMI instance / event provider
        HRESULT hr = CMyProv::CreateInstance(NULL,&pIUnknown);
        if ( SUCCEEDED(hr))
        {
            hr = myRegistrar->Register(0,
                NULL,
                NULL,
                NULL,
                L"root\\cimv2",
                L"DecoupledInstanceProvider",
                pIUnknown);
    
                pIUnknown->Release();
        }
    }
    
    if (FAILED (hr))
    {
        if ( myRegistrar )
        {
            myRegistrar->Release () ;
        }
    }
    
  4. Registre el proveedor de eventos desacoplado.

    En el ejemplo de código siguiente se muestra cómo registrar el proveedor de eventos desacoplado.

    IWbemDecoupledBasicEventProvider *myEvtRegistrar;
    
    // -- Create an instance of IWbemDecoupledEventProvider
    hr = CoCreateInstance(CLSID_WbemDecoupledBasicEventProvider,
                          NULL,
                          CLSCTX_INPROC_SERVER,
                          IID_IWbemDecoupledBasicEventProvider,
                          (void**)&myEvtRegistrar);
    
    if (SUCCEEDED(hr))
    {
       // -- Register the DecoupledEventProvider
       hr = myEvtRegistrar->Register(0,
                                     NULL,
                                     NULL,
                                     L"root\\cimv2",
                                     L"DecoupledEventProvider",
                                     NULL, NULL);
       if (SUCCEEDED(hr))
       {
          IWbemServices *pService = NULL;
          hr = myEvtRegistrar->GetService (0, NULL, &pService);
          if (SUCCEEDED(hr))
          {
             IWbemObjectSink *pSink = NULL;
             hr = myEvtRegistrar->GetSink ( 0, NULL, &pSink );
             if (SUCCEEDED(hr))
             {
                // Provide events
             }
          }
       } 
    }
    
  5. Realice las llamadas a WMI requeridas por la función del proveedor. Para obtener más información, consulte Manipular información de clase e instancia. Para obtener más información si el proveedor ofrece una solicitud de datos de un script o una aplicación, consulte Suplantación de un cliente.

Justo antes de finalizar, la aplicación debe limpiarse después de sí misma. En el procedimiento siguiente se describe cómo anular el registro del proveedor desacoplado para que WMI no intente consultarlo para obtener información.

En el procedimiento siguiente se describe cómo anular el registro del proveedor desacoplado.

Para anular el registro del proveedor desacoplado

  1. Anule el registro y libere el registrador.

    En el ejemplo de código siguiente se muestra cómo anular el registro y liberar el registrador.

    myRegistrar->UnRegister();
    myRegistrar->Release();
    
  2. Anule el registro y libere el proveedor de eventos.

    En el ejemplo de código siguiente se muestra cómo anular el registro y liberar el proveedor de eventos.

    myEvtRegistrar->UnRegister();
    myEvtRegistrar->Release();
    
  3. Limpie el servidor COM.

    En el siguiente ejemplo de código se muestra cómo desinicializar la biblioteca COM.

    CoUninitialize();
    

Establecer descriptores de seguridad del espacio de nombres

Protección del proveedor

Desarrollo de un proveedor WMI