Megosztás a következőn keresztül:


WMI alaposztály létrehozása

Egy WMI-szolgáltató új WMI alaposztályának létrehozásának ajánlott módja egy felügyelt objektumformátumú (MOF) fájl. Alaposztályt is létrehozhat a WMI COM API használatával. Bár létrehozhat egy alap- vagy származtatott osztályt a szkriptben, anélkül, hogy egy szolgáltató adatokat szolgáltat az osztálynak és annak alosztályainak, az osztály nem hasznos.

A következő szakaszokat tárgyaljuk ebben a témakörben:

Alaposztály létrehozása MOF használatával

A WMI-osztályok általában az öröklésre támaszkodnak. Alaposztály létrehozása előtt ellenőrizze az Elosztott felügyeleti munkacsoport (DMTF) által elérhető Common Information Model (CIM) osztályokat.

Ha sok származtatott osztály ugyanazt a tulajdonságot fogja használni, helyezze ezeket a tulajdonságokat és metódusokat az alaposztályba. A WMI-osztályban definiálható tulajdonságok maximális száma 1024.

Alaposztály létrehozásakor tekintse meg az osztálynevekre vonatkozó irányelvek alábbi listáját:

  • Használjon nagybetűket és kisbetűket is.

  • Kezdje el az osztály nevét egy betűvel.

  • Ne használjon kezdő vagy záró aláhúzást.

  • A fennmaradó karaktereket betűk, számjegyek vagy aláhúzásjelekként definiálhatja.

  • Konzisztens elnevezési konvenciók használata.

    Bár nem szükséges, egy osztály jó elnevezési konvenciója két összetevő, amelyeket aláhúzással illesztenek össze. Ha lehetséges, a gyártó nevének a név első felét kell alkotnia, a leíró osztálynévnek pedig a második résznek kell lennie.

Jegyzet

A szolgáltatók végrehajtása során az osztályok nem módosíthatók. Le kell állítania a tevékenységet, módosítania kell az osztályt, majd újra kell indítania a Windows Management szolgáltatást. Az osztályváltozás észlelése jelenleg nem lehetséges.

 

Az MOF-ban hozzon létre egy alaposztályt a osztály kulcsszóval való elnevezésével, de ne jelezve a szülőosztályt.

Alaposztály létrehozása MOF-kóddal

  1. Használja a osztály kulcsszót az új osztály nevével, majd egy pár kapcsos zárójelet és egy pontosvesszőt. Adjon hozzá tulajdonságokat és metódusokat az osztályhoz a kapcsos zárójelek között. A következő példakód található.

    Az alábbi példakód bemutatja, hogyan kell definiálni egy alaposztályt.

    class MyClass_BaseDisk
    {
    };
    

    Az alábbi példakód egy alaposztály helytelen definícióját mutatja be.

    class MyClass_BaseDisk : CIM_LogicalDisk
    {
    };
    
  2. Adjon hozzá minden osztály minősítőt az osztály kulcsszója előtt az osztály felhasználási módjának módosításához. Tegyük a minősítőket szögletes zárójelek közé. Az osztályok módosításához szükséges minősítőkről további információt a WMI-minősítőkcímű témakörben talál. Használja az Absztrakt jelzőt annak jelzésére, hogy ennek az osztálynak a példánya nem hozható létre közvetlenül. Az absztrakt osztályokat gyakran használják olyan tulajdonságok vagy metódusok meghatározására, amelyeket több származtatott osztály fog használni. További információ: Származtatott osztály létrehozása.

    Az alábbi kód példa absztraktként definiálja az osztályt, és meghatározza az adatokat ellátó szolgáltatót. A ToSubClass minősítő jellemző jelzi, hogy a Szolgáltató minősítőben szereplő információkat származtatott osztályok öröklik.

    [Abstract, Provider("MyProvider") : ToSubClass]
    class MyClass_BaseDisk
    {
    };
    
  3. Adja hozzá az osztály tulajdonságait és metódusait szögletes zárójelekben a tulajdonság vagy a metódus neve előtt. További információ: Tulajdonság hozzáadása és Metódus létrehozása. Ezeket a tulajdonságokat és metódusokat MOF-minősítők használatával módosíthatja. További információért lásd: Minősítőhozzáadása.

    Az alábbi példakód bemutatja, hogyan módosíthatja a tulajdonságokat és a metódusokat az MOF-minősítőkkel.

    [read : ToSubClass, key : ToSubClass ] string DeviceID;
      [read : ToSubClass] uint32 State;
      [read : ToSubclass, write : ToSubClass] uint64 LimitUsers;
    
  4. Mentse az MOF-fájlt .mof kiterjesztéssel.

  5. Regisztrálja az osztályt a WMI-vel a fájl Mofcomp.exe futtatásával.

    mofcomp.exenewmof.mof

    Ha nem használja az -N kapcsolót vagy az előfeldolgozási parancsot #pragma névtér a névtér megadásához, a lefordított MOF-osztályok az adattár gyökér\alapértelmezett névterében lesznek tárolva. További információ: mofcomp.

Az alábbi példakód az előző eljárásban tárgyalt MOF-kód példákat egyesíti, és bemutatja, hogyan hozhat létre alaposztályt a root\cimv2 névtérben az MOF használatával.

#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;
};

További információért tekintse meg a Származtatott osztály létrehozása részt, amely példát mutat be egy ebből az alaposztályból származtatott dinamikus osztályra.

Alaposztály létrehozása a C++ használatával

Az alaposztály WMI API-val történő létrehozása elsősorban put parancsok sorozata, amelyek meghatározzák az osztályt, és regisztrálják az osztályt a WMI-vel. Ennek az API-nak a fő célja, hogy lehetővé tegye az ügyfélalkalmazások számára az alaposztályok létrehozását. Azonban egy szolgáltató is használhatja ezt az API-t egy alaposztály létrehozásához. Ha például úgy véli, hogy a szolgáltató MOF-kódja nem lesz megfelelően telepítve, utasíthatja a szolgáltatót, hogy automatikusan hozza létre a megfelelő osztályokat a WMI-adattárban. További információkért a szolgáltatókról nézze meg az Osztályszolgáltató írásarészt.

Jegyzet

A szolgáltatók végrehajtása során az osztályok nem módosíthatók. Le kell állítania a tevékenységet, módosítania kell az osztályt, majd újra kell indítania a Windows Management szolgáltatást. Az osztályváltozás észlelése jelenleg nem lehetséges.

 

A kód helyes fordításához a következő hivatkozásra van szükség.

#include <wbemidl.h>

A WMI COM API használatával programozott módon hozhat létre új alaposztályt.

Új alaposztály létrehozása a WMI API-

  1. Az új osztály definíciójának lekéréséhez hívja meg a IWbemServices::GetObject metódust a strObjectPath paraméterrel, amely egy null értékre van beállítva.

    Az alábbi példakód bemutatja, hogyan kérhető le egy definíció egy új osztályhoz.

    IWbemServices* pSvc = 0;
    IWbemContext* pCtx = 0;
    IWbemClassObject* pNewClass = 0;
    IWbemCallResult* pResult = 0;
    HRESULT hRes = pSvc->GetObject(0, 0, pCtx, &pNewClass, &pResult);
    
  2. Az osztály nevét úgy állíthatja be, hogy a __CLASS rendszertulajdonságot az IWbemClassObject::Put metódus hívásával állítja be.

    Az alábbi példakód bemutatja, hogyan nevezheti el az osztályt a __CLASS rendszertulajdonság beállításával.

    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. Hozza létre a kulcstulajdonságot vagy tulajdonságokat IWbemClassObject::Putmeghívásával.

    Az alábbi példakód bemutatja, hogyan hozható létre az Index tulajdonság, amely a 4. lépésben kulcstulajdonságként van megjelölve.

      BSTR KeyProp = SysAllocString(L"Index");
      pNewClass->Put(KeyProp, 0, NULL, CIM_STRING);
    
  4. Csatolja a Key standard minősítőt a kulcs tulajdonsághoz, először hívja meg a IWbemClassObject::GetPropertyQualifierSet metódust, majd az IWbemQualifierSet::Put metódust.

    Az alábbi példakód bemutatja, hogyan csatolhatja a Key standard minősítőt a kulcstulajdonsághoz.

      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. Hozza létre az osztály egyéb tulajdonságait az IWbemClassObject::Putsegítségével.

    Az alábbi példakód bemutatja, hogyan hozhat létre további tulajdonságokat.

      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. Regisztrálja az új osztályt az IWbemServices::PutClassmeghívásával.

    Mivel az új osztály regisztrálása után nem definiálhat kulcsokat és indexeket, a PutClass hívása előtt győződjön meg arról, hogy az összes tulajdonságot meghatározta.

    Az alábbi példakód bemutatja, hogyan regisztrálhat új osztályt.

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

Az alábbi példakód az előző eljárásban tárgyalt kód példákat egyesíti, és bemutatja, hogyan hozhat létre alaposztályt a WMI API használatával.

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();
}

Osztály létrehozása