Integrieren eines Anbieters in eine Anwendung
Beim Erstellen einer zu instrumentierenden Anwendung besteht die bewährte Methode darin, den Anbieter als Komponente in die Anwendung selbst einzuschließen. Diese Vorgehensweise ermöglicht es der Windows-Verwaltungsinstrumentation (WMI), direkt mit dem Dienstanbieter zu interagieren anstatt indirekt über die Programm-API. Durch die Entkopplung des Anbieters von der WMI erhält die Anwendung außerdem die Kontrolle über die Lebensdauer des Anbieters, nicht die WMI. Weitere Informationen zum Schreiben eines Anbieters, der im WMI-Prozess ausgeführt wird, finden Sie unter Bereitstellen von Daten für die WMI durch Schreiben eines Anbieters. Weitere Informationen zum Hostingmodell und zu den 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.
Weitere Informationen zu entkoppelten Anbietermethoden finden Sie unter IWbemDecoupledRegistrar und IWbemDecoupledBasicEventProvider.
Hinweis
Der entkoppelte Anbieter unterstützt Instanz-, Methoden- und Ereignisanbieter sowie Ereignisconsumer. Er unterstützt keine Klassen- und Eigenschaftenanbieter. Weitere Informationen finden Sie unter Schreiben eines Klassenanbieters und Schreiben eines Eigenschaftenanbieters.
Für die Codebeispiele in diesem Thema sind die folgenden Verweise und #include-Anweisungen erforderlich, um ordnungsgemäß kompiliert zu werden.
#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, damit WMI nur mit einem registrierten entkoppelten Anbieter interagiert.
So implementieren Sie einen entkoppelten Anbieter in eine C++-Anwendung
Initialisieren Sie die COM-Bibliothek für die Verwendung durch den aufrufenden Thread.
Im folgenden Codebeispiel wird das Initialisieren der COM-Bibliothek veranschaulicht.
HRESULT hr = S_OK ; hr = CoInitializeEx (0, COINIT_MULTITHREADED );
Legen Sie die Standardsicherheitsstufe für Prozesse fest.
Diese Stufe legt die Sicherheitsstufe fest, die von anderen Prozessen für den Zugriff auf die Informationen des Clientprozesses vorausgesetzt wird. Die Authentifizierungsebene sollte RPC_C_AUTHN_LEVEL_DEFAULT sein. Weitere Informationen finden Sie unter Verwalten der WMI-Sicherheit.
Im folgenden Codebeispiel wird das Festlegen der Standardsicherheitsstufe gezeigt.
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; }
Registrieren Sie die entkoppelte Anbieterregistrierungsstelle.
Das folgende Codebeispiel zeigt, wie die entkoppelte Anbieterregistrierungsstelle registriert wird.
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 () ; } }
Registrieren Sie den entkoppelten Ereignisanbieter.
Das folgende Codebeispiel zeigt, 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 } } } }
Führen Sie die Aufrufe von WMI durch, die für die Funktionalität des Anbieters erforderlich sind. Weitere Informationen finden Sie unter Bearbeiten von Klassen- und Instanzinformationen. Weitere Informationen, wenn der Anbieter eine Anforderung von Daten aus einem Skript oder einer Anwendung verarbeitet, finden Sie unter Identitätswechsel eines Clients.
Unmittelbar vor dem Beenden muss die Anwendung hinter sich „aufräumen“. Im folgenden Verfahren wird beschrieben, wie Sie die Registrierung des entkoppelten Anbieters aufheben, damit die WMI nicht versucht, Informationen bei ihm abzufragen.
Im folgenden Verfahren wird beschrieben, wie Sie die Registrierung des entkoppelten Anbieters aufheben.
So heben Sie die Registrierung des entkoppelten Anbieters auf
Heben Sie die Registrierung der Registrierungsstelle auf, und geben Sie sie frei.
Im folgenden Codebeispiel wird gezeigt, wie Sie die Registrierung der Registrierungsstelle aufheben und sie freigeben.
myRegistrar->UnRegister(); myRegistrar->Release();
Heben Sie die Registrierung des Ereignisanbieters auf, und geben Sie ihn frei.
Im folgenden Codebeispiel wird gezeigt, wie Sie die Registrierung des Ereignisanbieters aufheben und ihn freigeben.
myEvtRegistrar->UnRegister(); myEvtRegistrar->Release();
Bereinigen Sie den COM-Server.
Im folgenden Codebeispiel wird das Aufheben der Initialisierung der COM-Bibliothek veranschaulicht.
CoUninitialize();
Zugehörige Themen