Menggabungkan Penyedia dalam Aplikasi

Saat membuat aplikasi yang akan diinstrumentasi, praktik terbaiknya adalah menyertakan penyedia sebagai komponen dalam aplikasi itu sendiri. Praktik ini memungkinkan Instrumentasi Manajemen Windows (WMI) untuk berinteraksi dengan penyedia layanan secara langsung alih-alih secara tidak langsung melalui API program. Memisahkan penyedia dari WMI juga menempatkan aplikasi dalam mengontrol masa pakai penyedia, bukan WMI. Untuk informasi selengkapnya tentang menulis penyedia yang berjalan dalam proses WMI, lihat Menyediakan Data ke WMI dengan Menulis Penyedia. Untuk informasi selengkapnya tentang model hosting dan pengaturan keamanan untuk penyedia, lihat Hosting dan Keamanan Penyedia.

Diagram berikut mengilustrasikan hubungan antara WMI, penyedia yang dipisahkan, dan aplikasi.

hubungan antara wmi, penyedia yang di-decouple, dan aplikasi

Untuk informasi selengkapnya tentang metode penyedia yang dipisahkan, lihat IWbemDecoupledRegistrar dan IWbemDecoupledBasicEventProvider.

Catatan

Penyedia yang di-decouple mendukung instans, metode, penyedia peristiwa, dan konsumen peristiwa. Ini tidak mendukung penyedia kelas dan properti. Untuk informasi selengkapnya, lihat Menulis Penyedia Kelas dan Menulis Penyedia Properti.

 

Contoh kode dalam topik ini memerlukan referensi dan pernyataan #include berikut untuk dikompilasi dengan benar.

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

Prosedur berikut menggunakan contoh kode C++ untuk menjelaskan cara menggabungkan penyedia yang dipisahkan di aplikasi Anda. Metode inisialisasi aplikasi melakukan langkah-langkah berikut sehingga WMI hanya berinteraksi dengan penyedia yang didaftarkan.

Untuk mengimplementasikan penyedia yang di-decoupled dalam aplikasi C++

  1. Inisialisasi pustaka COM untuk digunakan oleh utas panggilan.

    Contoh kode berikut menunjukkan cara menginisialisasi pustaka COM.

    HRESULT hr = S_OK ;
    hr = CoInitializeEx (0, COINIT_MULTITHREADED );
    
  2. Atur tingkat keamanan proses default.

    Tingkat ini menetapkan tingkat keamanan yang diperlukan dari proses lain untuk mengakses informasi proses klien. Tingkat autentikasi harus RPC_C_AUTHN_LEVEL_DEFAULT. Untuk informasi selengkapnya, lihat Mempertahankan Keamanan WMI.

    Contoh kode berikut menunjukkan cara mengatur tingkat keamanan default.

    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. Daftarkan pencatat penyedia yang dipisahkan.

    Contoh kode berikut menunjukkan cara mendaftarkan pencatat penyedia yang dipisahkan.

    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. Daftarkan penyedia peristiwa yang di-decoupled.

    Contoh kode berikut menunjukkan cara mendaftarkan penyedia peristiwa yang dipisahkan.

    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. Lakukan panggilan ke WMI yang diperlukan oleh fungsionalitas penyedia. Untuk informasi selengkapnya, lihat Memanipulasi Informasi Kelas dan Instans. Untuk informasi selengkapnya jika penyedia melayani permintaan data dari skrip atau aplikasi, lihat Meniru Klien.

Tepat sebelum mengakhiri, aplikasi harus dibersihkan setelah itu sendiri. Prosedur berikut ini menjelaskan cara membatalkan pendaftaran penyedia yang didekop sehingga WMI tidak mencoba mengkuerinya untuk informasi.

Prosedur berikut menjelaskan cara membatalkan pendaftaran penyedia yang di-decoupled.

Untuk membatalkan pendaftaran penyedia yang didekop

  1. Batalkan pendaftaran dan lepaskan registrar.

    Contoh kode berikut menunjukkan cara membatalkan pendaftaran dan melepaskan registrar.

    myRegistrar->UnRegister();
    myRegistrar->Release();
    
  2. Batalkan pendaftaran dan rilis penyedia peristiwa.

    Contoh kode berikut menunjukkan cara membatalkan pendaftaran dan merilis penyedia peristiwa.

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

    Contoh kode berikut menunjukkan cara membatalkan menginisialisasi pustaka COM.

    CoUninitialize();
    

Mengatur Deskriptor Keamanan Namepace

Mengamankan Penyedia Anda

Mengembangkan Penyedia WMI