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
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 { };
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 { };
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;
Mentse az MOF-fájlt .mof kiterjesztéssel.
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-
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);
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);
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);
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);
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);
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();
}
Kapcsolódó témakörök