Membuat Kelas Dasar WMI

Cara yang disarankan untuk membuat kelas dasar WMI baru untuk penyedia WMI adalah dalam file Managed Object Format (MOF). Anda juga dapat membuat kelas dasar menggunakan COM API untuk WMI. Meskipun Anda dapat membuat kelas dasar atau turunan dalam skrip, tanpa penyedia yang menyediakan data ke kelas dan subkelasnya, kelas tidak berguna.

Bagian berikut dibahas dalam topik ini:

Membuat Kelas Dasar Menggunakan MOF

Kelas WMI biasanya mengandalkan warisan. Sebelum membuat kelas dasar, periksa kelas Common Information Model (CIM) yang tersedia dari Distributed Management Task Force (DMTF).

Jika banyak kelas turunan akan menggunakan properti yang sama, letakkan properti dan metode ini di kelas dasar Anda. Jumlah maksimum properti yang dapat Anda tentukan di kelas WMI adalah 1024.

Saat membuat kelas dasar, amati daftar panduan berikut untuk nama kelas:

  • Gunakan huruf besar dan huruf kecil.

  • Mulai nama kelas dengan huruf.

  • Jangan gunakan garis bawah di depan atau di belakang.

  • Tentukan semua karakter yang tersisa sebagai huruf, digit, atau garis bawah.

  • Gunakan konvensi penamaan yang konsisten.

    Meskipun tidak perlu, konvensi penamaan yang baik untuk kelas adalah dua komponen yang bergabung dengan garis bawah. Jika memungkinkan, nama vendor harus membentuk paruh pertama nama, dan nama kelas deskriptif harus menjadi bagian kedua.

Catatan

Kelas tidak dapat diubah selama eksekusi penyedia. Anda harus menghentikan aktivitas, mengubah kelas, lalu memulai ulang layanan Manajemen Windows. Mendeteksi perubahan kelas saat ini tidak dimungkinkan.

 

Di MOF, buat kelas dasar dengan mennamakannya dengan kata kunci kelas , tetapi tidak menunjukkan kelas induk.

Untuk membuat kelas dasar menggunakan kode MOF

  1. Gunakan kata kunci kelas dengan nama kelas baru, diikuti oleh sepasang kurung kurawal dan titik koma. Tambahkan properti dan metode untuk kelas antara kurung kurawal. Contoh kode berikut disediakan.

    Contoh kode berikut menunjukkan bagaimana kelas dasar harus ditentukan.

    class MyClass_BaseDisk
    {
    };
    

    Contoh kode berikut menunjukkan definisi kelas dasar yang salah.

    class MyClass_BaseDisk : CIM_LogicalDisk
    {
    };
    
  2. Tambahkan kualifikasi kelas apa pun sebelum kata kunci kelas untuk memodifikasi cara kelas digunakan. Tempatkan kualifikasi di antara tanda kurung siku. Untuk informasi selengkapnya tentang kualifikasi untuk memodifikasi kelas, lihat Pengualifikasi WMI. Gunakan kualifikasi Abstrak untuk menunjukkan bahwa Anda tidak dapat membuat instans kelas ini secara langsung. Kelas abstrak sering digunakan untuk menentukan properti atau metode yang akan digunakan oleh beberapa kelas turunan. Untuk informasi selengkapnya, lihat Membuat Kelas Turunan.

    Contoh kode berikut mendefinisikan kelas sebagai abstrak dan menentukan penyedia yang akan menyediakan data. Rasa kualifikasi ToSubClass menunjukkan bahwa informasi dalam kualifikasi Penyedia diwariskan oleh kelas turunan.

    [Abstract, Provider("MyProvider") : ToSubClass]
    class MyClass_BaseDisk
    {
    };
    
  3. Tambahkan properti dan metode untuk kelas di dalam kurung siku sebelum nama properti atau metode. Untuk informasi selengkapnya, lihat Menambahkan Properti dan Membuat Metode. Anda dapat memodifikasi properti dan metode ini menggunakan kualifikasi MOF. Untuk informasi selengkapnya, lihat Menambahkan Kualifikasi.

    Contoh kode berikut menunjukkan cara memodifikasi properti dan metode dengan kualifikasi MOF.

    [read : ToSubClass, key : ToSubClass ] string DeviceID;
      [read : ToSubClass] uint32 State;
      [read : ToSubclass, write : ToSubClass] uint64 LimitUsers;
    
  4. Simpan file MOF dengan ekstensi .mof.

  5. Daftarkan kelas dengan WMI dengan menjalankan Mofcomp.exe pada file.

    mofcomp.exenewmof.mof

    Jika Anda tidak menggunakan switch -N atau perintah praprosesor #pragma namespace untuk menentukan namespace, kelas MOF yang dikompilasi akan disimpan di namespace root\default di repositori. Untuk informasi selengkapnya, lihat mofcomp.

Contoh kode berikut menggabungkan contoh kode MOF yang dibahas dalam prosedur sebelumnya dan menunjukkan cara membuat kelas dasar di namespace root\cimv2 menggunakan MOF.

#pragma namespace("\\\\.\\Root\\cimv2")

[Abstract, Provider("MyProvider") : ToSubClass]
class MyClass_BaseDisk
{
  [read : ToSubClass, key : ToSubClass ] string DeviceID;
  [read : ToSubClass] uint32 State;
  [read : ToSubClass, write : ToSubClass] uint64 LimitUsers;
};

Untuk informasi selengkapnya, lihat Membuat Kelas Turunan untuk contoh kelas dinamis yang berasal dari kelas dasar ini.

Membuat Kelas Dasar dengan C++

Membuat kelas dasar menggunakan WMI API terutama merupakan serangkaian perintah Put yang menentukan kelas dan mendaftarkan kelas dengan WMI. Tujuan utama API ini adalah untuk memungkinkan aplikasi klien membuat kelas dasar. Namun, Anda juga dapat meminta penyedia menggunakan API ini untuk membuat kelas dasar. Misalnya, jika Anda yakin bahwa kode MOF untuk penyedia Anda tidak akan diinstal dengan benar, Anda dapat menginstruksikan penyedia Anda untuk secara otomatis membuat kelas yang benar di repositori WMI. Untuk informasi selengkapnya tentang penyedia, lihat Menulis Penyedia Kelas.

Catatan

Kelas tidak dapat diubah selama eksekusi penyedia. Anda harus menghentikan aktivitas, mengubah kelas, lalu memulai ulang layanan Manajemen Windows. Mendeteksi perubahan kelas saat ini tidak dimungkinkan.

 

Kode memerlukan referensi berikut untuk mengkompilasi dengan benar.

#include <wbemidl.h>

Anda dapat membuat kelas dasar baru secara terprogram menggunakan COM API untuk WMI.

Untuk membuat kelas dasar baru dengan API WMI

  1. Ambil definisi untuk kelas baru dengan memanggil metode IWbemServices::GetObject dengan parameter strObjectPath yang diatur ke nilai null .

    Contoh kode berikut menunjukkan cara mengambil definisi untuk kelas baru.

    IWbemServices* pSvc = 0;
    IWbemContext* pCtx = 0;
    IWbemClassObject* pNewClass = 0;
    IWbemCallResult* pResult = 0;
    HRESULT hRes = pSvc->GetObject(0, 0, pCtx, &pNewClass, &pResult);
    
  2. Buat nama untuk kelas dengan mengatur properti sistem __CLASS dengan panggilan ke metode IWbemClassObject::P ut .

    Contoh kode berikut menunjukkan cara memberi nama kelas dengan mengatur properti sistem __CLASS .

    VARIANT v;
    VariantInit(&v);
    V_VT(&v) = VT_BSTR;
    
    V_BSTR(&v) = SysAllocString(L"Example");
    BSTR Class = SysAllocString(L"__CLASS");
    pNewClass->Put(Class, 0, &v, 0);
    SysFreeString(Class);
    VariantClear(&v);
    
  3. Buat properti atau properti kunci dengan memanggil IWbemClassObject::P ut.

    Contoh kode berikut menjelaskan cara membuat properti Indeks , yang dilabeli sebagai properti kunci di Langkah 4.

      BSTR KeyProp = SysAllocString(L"Index");
      pNewClass->Put(KeyProp, 0, NULL, CIM_STRING);
    
  4. Lampirkan kualifikasi standar Kunci ke properti kunci dengan terlebih dahulu memanggil metode IWbemClassObject::GetPropertyQualifierSet lalu metode IWbemQualifierSet::P ut .

    Contoh kode berikut menunjukkan cara melampirkan kualifikasi standar Kunci ke properti kunci.

      IWbemQualifierSet *pQual = 0;
      pNewClass->GetPropertyQualifierSet(KeyProp, &pQual);
      SysFreeString(KeyProp);
    
      V_VT(&v) = VT_BOOL;
      V_BOOL(&v) = VARIANT_TRUE;
      BSTR Key = SysAllocString(L"Key");
    
      pQual->Put(Key, &v, 0);   // Flavors not required for Key 
      SysFreeString(Key);
    
      // No longer need the qualifier set for "Index"
      pQual->Release();   
      VariantClear(&v);
    
  5. Buat properti lain dari kelas dengan IWbemClassObject::P ut.

    Contoh kode berikut menjelaskan cara membuat properti tambahan.

      V_VT(&v) = VT_BSTR;
      V_BSTR(&v) = SysAllocString(L"<default>");
      BSTR OtherProp = SysAllocString(L"OtherInfo");
      pNewClass->Put(OtherProp, 0, &v, CIM_STRING);
      SysFreeString(OtherProp);
      VariantClear(&v);
    
      OtherProp = SysAllocString(L"IntVal");
      pNewClass->Put(OtherProp, 0, NULL, CIM_SINT32); // NULL is default
      SysFreeString(OtherProp);
    
  6. Daftarkan kelas baru dengan memanggil IWbemServices::P utClass.

    Karena Anda tidak dapat menentukan kunci dan indeks setelah mendaftarkan kelas baru, pastikan Anda telah menentukan semua properti sebelum memanggil PutClass.

    Contoh kode berikut menjelaskan cara mendaftarkan kelas baru.

      hRes = pSvc->PutClass(pNewClass, 0, pCtx, &pResult);
      pNewClass->Release();
    

Contoh kode berikut menggabungkan contoh kode yang dibahas dalam prosedur sebelumnya dan menunjukkan cara membuat kelas dasar menggunakan WMI API.

void CreateClass(IWbemServices *pSvc)
{
  IWbemClassObject *pNewClass = 0;
  IWbemContext *pCtx = 0;
  IWbemCallResult *pResult = 0;

  // Get a class definition. 
  // ============================
  HRESULT hRes = pSvc->GetObject(0, 0, pCtx, &pNewClass, &pResult);
  VARIANT v;
  VariantInit(&v);

  // Create the class name.
  // ============================
  V_VT(&v) = VT_BSTR;
  V_BSTR(&v) = SysAllocString(L"Example");
  BSTR Class = SysAllocString(L"__CLASS");
  pNewClass->Put(Class, 0, &v, 0);
  SysFreeString(Class);
  VariantClear(&v);

  // Create the key property. 
  // ============================
  BSTR KeyProp = SysAllocString(L"Index");
  pNewClass->Put(KeyProp, 0, NULL, CIM_STRING);

  // Attach Key qualifier to mark the "Index" property as the key.
  // ============================
  IWbemQualifierSet *pQual = 0;
  pNewClass->GetPropertyQualifierSet(KeyProp, &pQual);
  SysFreeString(KeyProp);

  V_VT(&v) = VT_BOOL;
  V_BOOL(&v) = VARIANT_TRUE;
  BSTR Key = SysAllocString(L"Key");

  pQual->Put(Key, &v, 0);   // Flavors not required for Key 
  SysFreeString(Key);

  // No longer need the qualifier set for "Index"
  pQual->Release();     
  VariantClear(&v);

  // Create other properties.
  // ============================
  V_VT(&v) = VT_BSTR;
  V_BSTR(&v) = SysAllocString(L"<default>");
  BSTR OtherProp = SysAllocString(L"OtherInfo");
  pNewClass->Put(OtherProp, 0, &v, CIM_STRING);
  SysFreeString(OtherProp);
  VariantClear(&v);

  OtherProp = SysAllocString(L"IntVal");
  pNewClass->Put(OtherProp, 0, NULL, CIM_SINT32); // NULL is default
  SysFreeString(OtherProp);
  
  // Register the class with WMI
  // ============================
  hRes = pSvc->PutClass(pNewClass, 0, pCtx, &pResult);
  pNewClass->Release();
}

Membuat Kelas