Создание базового класса WMI
Рекомендуемый способ создания базового класса WMI для поставщика WMI находится в файле MOF. Вы также можете создать базовый класс с помощью COM-API для WMI. Хотя вы можете создать базовый или производный класс в скрипте без предоставления данных поставщику для класса и его подклассов, этот класс не полезен.
В этом разделе рассматриваются следующие разделы:
Создание базового класса с помощью MOF
Классы WMI обычно полагаются на наследование. Перед созданием базового класса проверьте классы Common Information Model (CIM), доступные из группы задач распределенного управления (DMTF).
Если многие производные классы будут использовать одни и те же свойства, поместите эти свойства и методы в базовый класс. Максимальное количество свойств, которые можно определить в классе WMI, равно 1024.
При создании базового класса обратите внимание на следующий список рекомендаций по именам классов:
Используйте буквы верхнего и нижнего регистра.
Начните имя класса с буквой.
Не используйте начальный или конечный знак подчеркивания.
Определите все оставшиеся символы как буквы, цифры или символы подчеркивания.
Используйте согласованное соглашение об именовании.
Хотя это не обязательно, хорошее соглашение об именовании для класса является двумя компонентами, присоединенными подчеркиванием. По возможности имя поставщика должно составлять первую половину имени, а описательное имя класса должно быть второй частью.
Примечание.
Классы нельзя изменить во время выполнения поставщиков. Необходимо остановить действие, изменить класс и перезапустить службу управления Windows. Обнаружение изменения класса в настоящее время невозможно.
В MOF создайте базовый класс, именуя его ключевым словом класса , но не указывая родительский класс.
Создание базового класса с помощью кода MOF
Используйте ключевое слово класса с именем нового класса, за которым следует пара фигурных скобок и точка с запятой. Добавьте свойства и методы для класса между фигурными скобками. Ниже приведен пример кода.
В следующем примере кода показано, как следует определить базовый класс.
class MyClass_BaseDisk { };
В следующем примере кода показано неправильное определение базового класса.
class MyClass_BaseDisk : CIM_LogicalDisk { };
Добавьте все квалификаторы классов перед ключевым словом класса, чтобы изменить способ использования класса. Поместите квалификаторы между квадратными скобками. Дополнительные сведения об квалификаторов для изменения классов см. в разделе Квалификаторы WMI. Используйте абстрактный квалификатор, чтобы указать, что невозможно создать экземпляр этого класса напрямую. Абстрактные классы часто используются для определения свойств или методов, которые будут использоваться несколькими производными классами. Дополнительные сведения см. в разделе "Создание производного класса".
В следующем примере кода класс определяется как абстрактный и определяет поставщик, который будет предоставлять данные. Вкус квалификатора ToSubClass указывает, что сведения в квалификаторе поставщика наследуются производными классами.
[Abstract, Provider("MyProvider") : ToSubClass] class MyClass_BaseDisk { };
Добавьте свойства и методы для класса в квадратные скобки перед именем свойства или метода. Дополнительные сведения см. в разделе "Добавление свойства " и "Создание метода". Эти свойства и методы можно изменить с помощью квалификаторов MOF. Дополнительные сведения см. в разделе "Добавление квалификатора".
В следующем примере кода показано, как изменить свойства и методы с помощью квалификаторов MOF.
[read : ToSubClass, key : ToSubClass ] string DeviceID; [read : ToSubClass] uint32 State; [read : ToSubclass, write : ToSubClass] uint64 LimitUsers;
Сохраните MOF-файл с расширением MOF.
Зарегистрируйте класс с помощью WMI, выполнив Mofcomp.exe в файле.
mofcomp.exe newmof.mof
Если вы не используете параметр -N или команду препроцессора #pragma namespace для указания пространства имен, то скомпилированные классы MOF будут храниться в корневом пространстве имен\default в репозитории. Дополнительные сведения см. в mofcomp.
В следующем примере кода объединяются примеры кода MOF, описанные в предыдущей процедуре, и показано, как создать базовый класс в пространстве имен root\cimv2 с помощью 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;
};
Дополнительные сведения см. в разделе "Создание производного класса " для примера динамического класса, производного от этого базового класса.
Создание базового класса с помощью C++
Создание базового класса с помощью API WMI в основном представляет собой ряд команд Put, определяющих класс и регистрирующий класс с помощью WMI. Основной целью этого API является включение клиентских приложений для создания базовых классов. Однако вы также можете использовать этот API для создания базового класса, используя этот API. Например, если вы считаете, что код MOF для поставщика не будет установлен должным образом, можно указать поставщику автоматически создавать правильные классы в репозитории WMI. Дополнительные сведения о поставщиках см. в статье "Написание поставщика классов".
Примечание.
Классы нельзя изменить во время выполнения поставщиков. Необходимо остановить действие, изменить класс и перезапустить службу управления Windows. Обнаружение изменения класса в настоящее время невозможно.
Для правильной компиляции кода требуется следующая ссылка.
#include <wbemidl.h>
Вы можете создать новый базовый класс программным способом с помощью COM-API для WMI.
Создание базового класса с помощью API WMI
Получение определения для нового класса путем вызова метода IWbemServices::GetObject с параметром strObjectPath, заданным значением NULL.
В следующем примере кода показано, как получить определение для нового класса.
IWbemServices* pSvc = 0; IWbemContext* pCtx = 0; IWbemClassObject* pNewClass = 0; IWbemCallResult* pResult = 0; HRESULT hRes = pSvc->GetObject(0, 0, pCtx, &pNewClass, &pResult);
Установите имя класса, задав системное свойство __CLASS с вызовом метода IWbemClassObject::P ut .
В следующем примере кода показано, как присвоить классу имя, задав __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);
Создайте свойство или свойства ключа, вызвав IWbemClassObject::P ut.
В следующем примере кода описывается создание свойства Index , которое помечено как ключевое свойство на шаге 4.
BSTR KeyProp = SysAllocString(L"Index"); pNewClass->Put(KeyProp, 0, NULL, CIM_STRING);
Подключите стандартный квалификатор Key к свойству ключа, сначала вызвав метод IWbemClassObject::GetPropertyQualifierSet, а затем метод IWbemQualifierSet::P ut.
В следующем примере кода показано, как подключить квалификатор key standard к свойству ключа.
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);
Создайте другие свойства класса с помощью IWbemClassObject::P ut.
В следующем примере кода описывается создание дополнительных свойств.
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);
Зарегистрируйте новый класс, вызвав IWbemServices::P utClass.
Так как вы не можете определить ключи и индексы после регистрации нового класса, убедитесь, что вы определили все свойства перед вызовом PutClass.
В следующем примере кода описывается регистрация нового класса.
hRes = pSvc->PutClass(pNewClass, 0, pCtx, &pResult); pNewClass->Release();
В следующем примере кода объединяются примеры кода, описанные в предыдущей процедуре, и показано, как создать базовый класс с помощью API WMI.
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();
}
См. также