Incorporation d’un fournisseur dans une application

Lors de la création d’une application qui doit être instrumentée, la meilleure pratique consiste à inclure le fournisseur en tant que composant dans l’application elle-même. Cette pratique permet à Windows Management Instrumentation (WMI) d’interagir avec le fournisseur de services directement plutôt qu’indirectement via l’API du programme. Le découplage du fournisseur de WMI permet également à l’application de contrôler la durée de vie du fournisseur, au lieu de WMI. Pour plus d’informations sur l’écriture d’un fournisseur qui s’exécute dans le processus WMI, consultez Fournir des données à WMI en écrivant un fournisseur. Pour plus d’informations sur le modèle d’hébergement et les paramètres de sécurité du fournisseur, consultez Hébergement et sécurité du fournisseur.

Le diagramme suivant illustre la relation entre WMI, un fournisseur découplé et une application.

relation entre wmi, fournisseur découplé et application

Pour plus d’informations sur les méthodes de fournisseur découplées, consultez IWbemDecoupledRegistrar et IWbemDecoupledBasicEventProvider.

Notes

Le fournisseur découplé prend en charge les instances, les méthodes, les fournisseurs d’événements et les consommateurs d’événements. Il ne prend pas en charge les fournisseurs de classes et de propriétés. Pour plus d’informations, consultez Écriture d’un fournisseur de classes et Écriture d’un fournisseur de méthodes.

 

Les exemples de code de cette rubrique nécessitent la compilation correcte des références et des instructions #include suivantes.

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

La procédure suivante utilise des exemples de code C++ pour décrire comment incorporer un fournisseur découplé dans votre application. La méthode d’initialisation de l’application effectue les étapes suivantes afin que WMI interagit uniquement avec un fournisseur découplé inscrit.

Pour implémenter un fournisseur découplé dans une application C++

  1. Initialisez la bibliothèque COM pour l’utiliser par le thread appelant.

    L’exemple de code suivant montre comment initialiser la bibliothèque COM.

    HRESULT hr = S_OK ;
    hr = CoInitializeEx (0, COINIT_MULTITHREADED );
    
  2. Définissez le niveau de sécurité du processus par défaut.

    Ce niveau établit le niveau de sécurité requis pour d’autres processus pour accéder aux informations du processus client. Le niveau d’authentification doit être RPC_C_AUTHN_LEVEL_DEFAULT. Pour plus d’informations, consultez Maintenance de la sécurité WMI.

    L'exemple de code suivant montre comment définir le niveau de sécurité par défaut.

    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. Inscrivez le fournisseur découplé.

    L’exemple de code suivant montre comment inscrire le fournisseur découplé.

    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. Inscrivez le fournisseur d’événements découplé.

    L’exemple de code suivant montre comment inscrire le fournisseur d’événements découplé.

    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. Effectuez les appels à WMI requis par les fonctionnalités du fournisseur. Pour plus d’informations, consultez Manipulation des informations sur les classes et les instances. Pour plus d’informations si le fournisseur prend en charge une demande de données à partir d’un script ou d’une application, consultez Emprunt d’identité d’un client.

Juste avant de se terminer, l'application doit faire le ménage. La procédure suivante décrit comment annuler l’inscription du fournisseur découplé afin que WMI ne tente pas de l’interroger pour obtenir des informations.

La procédure suivante explique comment annuler l’inscription du fournisseur découplé.

Pour annuler l’inscription du fournisseur découplé

  1. Annuler l’inscription et libérer le registre.

    L’exemple de code suivant montre comment annuler l’inscription et libérer le registre.

    myRegistrar->UnRegister();
    myRegistrar->Release();
    
  2. Annuler l’inscription et libérer le fournisseur d’événements.

    L’exemple de code suivant montre comment annuler l’inscription et libérer le fournisseur d’événements.

    myEvtRegistrar->UnRegister();
    myEvtRegistrar->Release();
    
  3. Nettoyez le serveur COM.

    L’exemple de code suivant montre comment annuler l’initialisation la bibliothèque COM.

    CoUninitialize();
    

Définition des descripteurs de sécurité d’espace de noms

Sécurisation de votre fournisseur

Développement d’un fournisseur WMI