建立 WMI 基類
為 WMI 提供者建立新 WMI 基類的建議方式是在 Managed 物件格式 (MOF) 檔案中。 您也可以使用適用於 WMI 的 COM API 來建立基類。 雖然您可以在腳本中建立基底或衍生類別,但沒有提供者將數據提供給類別及其子類別,但 類別並不有用。
本主題將討論下列各節:
使用MOF建立基類
WMI 類別通常依賴繼承。 建立基類之前,請先檢查分散式管理工作組 (DMTF) 中可用的 Common Information Model (CIM) 類別。
如果許多衍生類別會使用相同的屬性,請將這些屬性和方法放在基類中。 您可以在 WMI 類別中定義的屬性數目上限為 1024。
建立基類時,請觀察下列類別名稱的指導方針清單:
使用大寫和小寫字母。
以字母開始類別名稱。
請勿使用前置或尾端底線。
將所有剩餘字元定義為字母、數位或底線。
使用一致的命名慣例。
雖然並非必要,但類別的良好命名慣例是兩個元件,由底線聯結。 可能的話,廠商名稱應該構成名稱的前半部,而描述性類別名稱應該是第二個部分。
注意
在提供者執行期間,無法變更類別。 您必須停止活動、變更 類別,然後重新啟動 Windows 管理服務。 目前無法偵測類別變更。
在MOF中,使用 class 關鍵詞命名基類來建立基類,但不會指出父類別。
使用MOF程式代碼建立基類
使用 class 關鍵詞搭配新類別的名稱,後面接著一對大括弧和分號。 在大括弧之間新增 類別的屬性和方法。 提供下列程式代碼範例。
下列程式代碼範例示範如何定義基類。
class MyClass_BaseDisk { };
下列程式代碼範例顯示基類的定義不正確。
class MyClass_BaseDisk : CIM_LogicalDisk { };
在 class 關鍵詞之前新增任何類別 限定符 ,以修改類別的使用方式。 將限定元放在方括弧之間。 如需修改類別之限定符的詳細資訊,請參閱 WMI 限定符。 使用 Abstract 限定符表示您無法直接建立這個類別的實例。 抽象類通常用來定義數個衍生類別將使用的屬性或方法。 如需詳細資訊,請參閱 建立衍生類別。
下列程式代碼範例會將 類別定義為抽象,並定義將提供數據的提供者。 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檔案。
在檔案上執行 Mofcomp.exe ,以向 WMI 註冊 類別。
mofcomp.exe newmof.mof
如果您未使用 -N 參數或預處理器命令 #pragma 命名空間來指定命名空間,編譯的MOF類別將會儲存在存放庫中的root\default 命名空間中。 如需詳細資訊,請參閱mofcomp。
下列程式代碼範例結合上一個程式中討論的MOF程式代碼範例,並示範如何使用MOF在root\cimv2 命名空間中建立基類。
#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++ 建立基類
使用 WMI API 建立基類主要是一系列 Put 命令,這些命令會定義類別,並使用 WMI 註冊類別。 此 API 的主要目的是讓用戶端應用程式建立基類。 不過,您也可以讓提供者使用此 API 來建立基類。 例如,如果您認為提供者的MOF程式碼不會正確安裝,您可以指示提供者在WMI存放庫中自動建立正確的類別。 如需提供者的詳細資訊,請參閱 撰寫類別提供者。
注意
在提供者執行期間,無法變更類別。 您必須停止活動、變更 類別,然後重新啟動 Windows 管理服務。 目前無法偵測類別變更。
程序代碼需要下列參考才能正確編譯。
#include <wbemidl.h>
您可以使用適用於 WMI 的 COM API,以程式設計方式建立新的基類。
使用 WMI API 建立新的基類
呼叫 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);
使用 IWbemClassObject::P ut 方法的呼叫來設定__CLASS系統屬性,以建立 類別的名稱。
下列程式代碼範例示範如何藉由設定 __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);
先呼叫 IWbemClassObject::GetPropertyQualifierSet 方法,再呼叫 IWbemQualifierSet::P ut 方法,將 Key 標準限定符附加至 key 屬性。
下列程式代碼範例示範如何將Key標準限定符附加至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);
使用 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();
下列程式代碼範例結合了上一個程式中討論的程式代碼範例,並示範如何使用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();
}
相關主題