Share via


Incorporando un provider in un'applicazione

Quando si crea un'applicazione da instrumentare, è consigliabile includere il provider come componente all'interno dell'applicazione stessa. Questa procedura consente a Strumentazione gestione Windows (WMI) di interagire direttamente con il provider di servizi anziché indirettamente tramite l'API del programma. La separazione del provider da WMI consente anche all'applicazione di controllare la durata del provider, anziché WMI. Per altre informazioni sulla scrittura di un provider eseguito nel processo WMI, vedere Fornitura di dati a WMI scrivendo un provider. Per altre informazioni sull'hosting dei modelli e delle impostazioni di sicurezza per il provider, vedere Hosting e sicurezza del provider.

Il diagramma seguente illustra la relazione tra WMI, un provider disaccoppiato e un'applicazione.

relazione tra wmi, provider disaccoppiato e applicazione

Per altre informazioni sui metodi di provider separati, vedere IWbemDecoupledRegistrar e IWbemDecoupledBasicEventProvider.

Nota

Il provider disaccoppiato supporta l'istanza, il metodo, i provider di eventi e i consumer di eventi. Non supporta i provider di classi e proprietà. Per altre informazioni, vedere Scrittura di un provider di classi e scrittura di un provider di proprietà.

 

Gli esempi di codice in questo argomento richiedono i riferimenti e le istruzioni #include seguenti per la compilazione corretta.

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

La procedura seguente usa esempi di codice C++ per descrivere come incorporare un provider disaccoppiato nell'applicazione. Il metodo di inizializzazione dell'applicazione esegue i passaggi seguenti in modo che WMI interagisca solo con un provider disaccoppiato registrato.

Per implementare un provider disaccoppiato in un'applicazione C++

  1. Inizializzare la libreria COM da utilizzare dal thread chiamante.

    Nell'esempio di codice seguente viene illustrato come inizializzare la libreria COM.

    HRESULT hr = S_OK ;
    hr = CoInitializeEx (0, COINIT_MULTITHREADED );
    
  2. Impostare il livello di sicurezza del processo predefinito.

    Questo livello stabilisce il livello di sicurezza richiesto da altri processi per accedere alle informazioni del processo client. Il livello di autenticazione deve essere RPC_C_AUTHN_LEVEL_DEFAULT. Per altre informazioni, vedere Gestione della sicurezza WMI.

    Nell'esempio di codice seguente viene illustrato come impostare il livello di sicurezza predefinito.

    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. Registrare il registrar del provider disaccoppiato.

    Nell'esempio di codice seguente viene illustrato come registrare il registrar del provider disaccoppiato.

    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. Registrare il provider di eventi disaccoppiato.

    Nell'esempio di codice seguente viene illustrato come registrare il provider di eventi disaccoppiato.

    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. Effettuare le chiamate a WMI richieste dalla funzionalità del provider. Per altre informazioni, vedere Modifica delle informazioni sulla classe e sull'istanza. Per altre informazioni se il provider esegue una richiesta di dati da uno script o un'applicazione, vedere Rappresentazione di un client.

Prima di terminare, l'applicazione deve eseguire la pulizia dopo se stessa. La procedura seguente descrive come annullare la registrazione del provider disaccoppiato in modo che WMI non tenti di eseguire una query per informazioni.

La procedura seguente descrive come annullare la registrazione del provider disaccoppiato.

Per annullare la registrazione del provider disaccoppiato

  1. Annullare la registrazione e rilasciare il registrar.

    Nell'esempio di codice seguente viene illustrato come annullare la registrazione e rilasciare il registrar.

    myRegistrar->UnRegister();
    myRegistrar->Release();
    
  2. Annullare la registrazione e rilasciare il provider di eventi.

    Nell'esempio di codice seguente viene illustrato come annullare la registrazione e rilasciare il provider di eventi.

    myEvtRegistrar->UnRegister();
    myEvtRegistrar->Release();
    
  3. Pulire il server COM.

    Nell'esempio di codice seguente viene illustrato come annullare l'inizializzazione della libreria COM.

    CoUninitialize();
    

Impostazione dei descrittori di sicurezza namepace

Protezione del provider

Sviluppo di un provider WMI