Införliva en provider i ett program
När du skapar ett program som ska instrumenteras är bästa praxis att inkludera providern som en komponent i själva programmet. Med den här metoden kan Windows Management Instrumentation (WMI) interagera direkt med tjänstleverantören i stället för indirekt via program-API:et. Genom att koppla loss leverantören från WMI får programmet också kontroll över leverantörens livslängd, istället för WMI. Mer information om hur du skriver en provider som körs i WMI-processen finns i Tillhandahålla data till WMI genom att skriva en provider. Mer information om värdmodell och säkerhetsinställningar för providern finns i Provider Hosting and Security.
Följande diagram illustrerar relationen mellan WMI, en frikopplad provider och ett program.
Mer information om frikopplade providermetoder finns i IWbemDecoupledRegistrar och IWbemDecoupledBasicEventProvider.
Not
Den frikopplade providern har stöd för instanser, metoder, händelseleverantörer och händelsekonsumenter. Den stöder inte klass- och egenskapsleverantörer. Mer information hänvisas till Skriva en klassleverantör och Skriva en egenskapsleverantör.
Kodexemplen i det här avsnittet kräver följande referenser och #include-instruktioner för att kompilera korrekt.
#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>
#include <wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
Följande procedur använder C++-kodexempel för att beskriva hur du införlivar en frikopplad provider i ditt program. Initieringsmetoden för programmet utför följande steg så att WMI endast interagerar med en registrerad frikopplad provider.
Implementera en frikopplad provider i ett C++-program
Initiera COM-biblioteket för användning av den anropande tråden.
I följande kodexempel visas hur du initierar COM-biblioteket.
HRESULT hr = S_OK ; hr = CoInitializeEx (0, COINIT_MULTITHREADED );
Ange standardnivån för processsäkerhet.
På den här nivån fastställs den säkerhetsnivå som krävs för andra processer för att få åtkomst till klientprocessens information. Autentiseringsnivån ska vara RPC_C_AUTHN_LEVEL_DEFAULT. För mer information, se Underhåll av WMI-säkerhet.
I följande kodexempel visas hur du anger standardsäkerhetsnivån.
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; }
Registrera den frikopplade providerregistratorn.
I följande kodexempel visas hur du registrerar den frikopplade providerregistratorn.
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 () ; } }
Registrera den frikopplade händelseleverantören.
I följande kodexempel visas hur du registrerar den frikopplade händelseprovidern.
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 } } } }
Gör de anrop till WMI som krävs för leverantörens funktionalitet. Mer information finns i Manipulera klass- och instansinformation. Mer information om providern skickar en begäran om data från ett skript eller program finns i Personifiera en klient.
Precis innan programmet avslutas måste det städa upp efter sig. I följande procedur beskrivs hur du avregistrerar den frikopplade providern så att WMI inte försöker fråga efter information.
Följande procedur beskriver hur du avregistrerar den frikopplade providern.
Om du vill avregistrera den frikopplade providern
Avregistrera och släpp registratorn.
I följande kodexempel visas hur du avregistrerar och släpper registratorn.
myRegistrar->UnRegister(); myRegistrar->Release();
Avregistrera och släpp händelseprovidern.
I följande kodexempel visas hur du avregistrerar och släpper händelseprovidern.
myEvtRegistrar->UnRegister(); myEvtRegistrar->Release();
Rensa COM-servern.
I följande kodexempel visas hur du uninitialiserar COM-biblioteket.
CoUninitialize();
Relaterade ämnen