Freigeben über


Integrieren eines Anbieters in eine Anwendung

Beim Erstellen einer Anwendung, die instrumentiert werden soll, empfiehlt es sich, den Anbieter als Komponente in die Anwendung selbst einzuschließen. In dieser Praxis kann die Windows-Verwaltungsinstrumentation (WMI) direkt und nicht indirekt über die Programm-API mit dem Dienstanbieter interagieren. Durch die Entkoppelung des Anbieters von WMI wird die Anwendung auch in die Kontrolle über die Lebensdauer des Anbieters anstelle von WMI versetzt. Weitere Informationen zum Schreiben eines Anbieters, der im WMI-Prozess ausgeführt wird, finden Sie unter Bereitstellen von Daten an WMI durch Schreiben eines Anbieters. Weitere Informationen zu Hostingmodell- und Sicherheitseinstellungen für den Anbieter finden Sie unter Anbieterhosting und Sicherheit.

Das folgende Diagramm veranschaulicht die Beziehung zwischen WMI, einem entkoppelten Anbieter und einer Anwendung.

Beziehung zwischen wmi, entkoppeltem Anbieter und Anwendung

Weitere Informationen zu entkoppelten Anbietermethoden finden Sie unter IWbemDecoupledRegistrar und IWbemDecoupledBasicEventProvider.

Hinweis

Der entkoppelte Anbieter unterstützt Instanzen, Methoden, Ereignisanbieter und Ereigniskonsumenten. Es unterstützt keine Klassen- und Eigenschaftenanbieter. Weitere Informationen finden Sie unter Schreiben eines Klassenanbieters und Schreiben eines Eigenschaftenanbieters.

 

Die Codebeispiele in diesem Thema erfordern die folgenden Verweise und #include Anweisungen, um ordnungsgemäß zu kompilieren.

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

Im folgenden Verfahren werden C++-Codebeispiele verwendet, um zu beschreiben, wie sie einen entkoppelten Anbieter in Ihre Anwendung integrieren. Die Initialisierungsmethode der Anwendung führt die folgenden Schritte aus, sodass WMI nur mit einem registrierten entkoppelten Anbieter interagiert.

So implementieren Sie einen entkoppelten Anbieter in einer C++-Anwendung

  1. Initialisieren Sie die COM-Bibliothek für die Verwendung durch den aufrufenden Thread.

    Das folgende Codebeispiel zeigt, wie die COM-Bibliothek initialisiert wird.

    HRESULT hr = S_OK ;
    hr = CoInitializeEx (0, COINIT_MULTITHREADED );
    
  2. Legen Sie die Standardmäßige Prozesssicherheitsstufe fest.

    Diese Ebene legt die Sicherheitsstufe fest, die andere Prozesse benötigen, um auf die Informationen des Clientprozesses zuzugreifen. Die Authentifizierungsstufe sollte RPC_C_AUTHN_LEVEL_DEFAULT werden. Weitere Informationen finden Sie unter Verwalten von WMI-Sicherheits-.

    Das folgende Codebeispiel zeigt, wie die Standardsicherheitsstufe festgelegt wird.

    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. Registrieren Sie die entkoppelte Anbieterregistrierungsstelle.

    Das folgende Codebeispiel zeigt, wie sie die entkoppelte Anbieterregistrierungsstelle registrieren.

    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. Registrieren Sie den entkoppelten Ereignisanbieter.

    Im folgenden Codebeispiel wird veranschaulicht, wie der entkoppelte Ereignisanbieter registriert wird.

    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. Führen Sie die Aufrufe an WMI durch, die von der Funktionalität des Anbieters benötigt werden. Weitere Informationen finden Sie unter Bearbeiten von Klassen- und Instanzinformationen. Weitere Informationen dazu, ob der Anbieter eine Anforderung für Daten aus einem Skript oder einer Anwendung bearbeitet, finden Sie unter Identitätswechsel eines Clients.

Unmittelbar vor dem Beenden muss die Anwendung nach sich selbst bereinigt werden. Im folgenden Verfahren wird beschrieben, wie Sie die Registrierung des entkoppelten Anbieters aufheben, damit WMI nicht versucht, ihn nach Informationen abzufragen.

Im folgenden Verfahren wird beschrieben, wie Sie die Registrierung des entkoppelten Anbieters aufheben.

So heben Sie die Registrierung des entkoppelten Anbieters auf

  1. Heben Sie die Registrierung auf, und geben Sie die Registrierungsstelle frei.

    Das folgende Codebeispiel zeigt, wie der Registrar abgemeldet und freigegeben wird.

    myRegistrar->UnRegister();
    myRegistrar->Release();
    
  2. Heben Sie die Registrierung auf, und geben Sie den Ereignisanbieter frei.

    Das folgende Codebeispiel zeigt, wie Sie die Registrierung aufheben und den Ereignisanbieter freigeben.

    myEvtRegistrar->UnRegister();
    myEvtRegistrar->Release();
    
  3. Bereinigen Sie den COM-Server.

    Das folgende Codebeispiel zeigt, wie die COM-Bibliothek nicht initialisiert wird.

    CoUninitialize();
    

Festlegen von Namespacesicherheitsdeskriptoren

Sichern Ihres Anbieters

Entwickeln eines WMI-Anbieters