Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 Instrumental de administración de Windows (WMI) interactúe directamente con el proveedor de servicios en lugar de indirectamente a través de la API del programa. Desacoplar el proveedor de WMI también permite que la aplicación controle la duración del proveedor, en vez de que lo haga WMI. Para obtener más información sobre cómo escribir un proveedor que se ejecuta en el proceso de WMI, consulte Suministro de datos a WMI mediante la escritura de un proveedor. Para obtener más información sobre el modelo de hospedaje y la configuración de seguridad del proveedor, consulte Hospedaje y seguridad del proveedor.
En el diagrama siguiente se muestra la relación entre WMI, un proveedor desacoplado y una 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 Escribir un proveedor de clases y Escribir un proveedor de propiedades.
Los ejemplos de código de este tema requieren las siguientes referencias y declaraciones #include para compilar 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++
Inicialice la biblioteca COM para que la use el subproceso que realiza la llamada.
En el ejemplo de código siguiente se muestra cómo inicializar la biblioteca COM.
HRESULT hr = S_OK ; hr = CoInitializeEx (0, COINIT_MULTITHREADED );
Establezca el nivel de seguridad de proceso predeterminado.
Este nivel establece el nivel de seguridad necesario para otros procesos para acceder 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, vea Mantener la seguridad de WMI.
En el ejemplo de código siguiente se muestra cómo establecer el nivel de seguridad predeterminado.
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; }
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 () ; } }
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 } } } }
Realice las llamadas a WMI requeridas por la funcionalidad del proveedor. Para obtener más información, vea Manipular la información de clase e instancia. Para obtener más información si el proveedor ofrece una solicitud de datos desde un script o una aplicación, consulte Suplantación de un cliente.
Justo antes de terminar, la aplicación debe realizar una limpieza final. 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
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();
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();
Limpie el servidor COM.
En el ejemplo de código siguiente se muestra cómo anular la inicialización de la biblioteca COM.
CoUninitialize();
Temas relacionados