任何资源如果要求WMI进行托管,至少需要两个文件:提供程序和托管对象格式 (MOF) 文件。提供程序是一个中间件,通过调用托管资源的本地 API 来响应 WMI 请求。 每一个WMI托管的硬件和软件资源均有一个类来定义,反过来说,一个CIM类就是一个WMI托管资源的模板,而且资源的所有实例都使用这个模板。这些模板是由属性、方法和限定符组成的。这些属性、方法和限定符都定义在MOF文件中。方法和属性是我们经常遇到的,那么什么是限定符呢?限定符是关于类、属性或方法类型的附加修饰符,类是静态的、抽象的、还是关联的,属性是只读的还是可写的,方法的返回参数等,都定义在其中,那么我们如何知道某个类有那些限定符呢?如下代码可以帮助我们方便的获得类的属性、方法和限定符的信息。
Code:strComputer = "."strNameSpace = "root/cimv2"strClass=inputbox("请输入你要查询的类")
Set objClass = GetObject("winmgmts://" & strComputer & _ "/" & strNameSpace & ":" & strClass)
WScript.Echo strClass & " 的类限定信息如下:"WScript.Echo "------------------------------"i = 1For Each objClassQualifier In objClass.Qualifiers_ If VarType(objClassQualifier.Value) = (vbVariant + vbArray) Then '常数 VBVariant 只与 VBArray 一起返回,以表明 VarType 函数的参数是一个 Variant 类型的数组。 strQualifier = i & ". " & objClassQualifier.Name & " = " & _ Join(objClassQualifier.Value, ",") Else strQualifier = i & ". " & objClassQualifier.Name & " = " & _ objClassQualifier.Value End If WScript.Echo strQualifier strQualifier = "" i = i + 1Next
WScript.EchoWScript.Echo strClass & " 类的属性和属性限定信息"WScript.Echo "-------------------------------------------------"i = 1 : j = 1For Each objClassProperty In objClass.Properties_ WScript.Echo i & ". " & objClassProperty.Name For Each objPropertyQualifier In objClassProperty.Qualifiers_ If VarType(objPropertyQualifier.Value) = (vbVariant + vbArray) Then strQualifier = i & "." & j & ". " & _ objPropertyQualifier.Name & " = " & _ Join(objPropertyQualifier.Value, ",") Else strQualifier = i & "." & j & ". " & _ objPropertyQualifier.Name & " = " & _ objPropertyQualifier.Value End If WScript.Echo strQualifier strQualifier = "" j = j + 1 Next WScript.Echo i = i + 1 : j = 1Next
WScript.EchoWScript.Echo strClass & " 类的方法和方法限定信息"WScript.Echo "-------------------------------------------------"i = 1 : j = 1For Each objClassMethod In objClass.Methods_ WScript.Echo i & ". " & objClassMethod.Name For Each objMethodQualifier In objClassMethod.Qualifiers_ If VarType(objMethodQualifier.Value) = (vbVariant + vbArray) Then strQualifier = i & "." & j & ". " & _ objMethodQualifier.Name & " = " & _ Join(objMethodQualifier.Value, ",") Else strQualifier = i & "." & j & ". " & _ objMethodQualifier.Name & " = " & _ objMethodQualifier.Value End If WScript.Echo strQualifier strQualifier = "" j = j + 1 Next WScript.Echo i = i + 1 : j = 1Next如果我们执行上述代码来查找win32_service类的限定符,一般情况下可以得到如下信息:win32_service 的类限定信息如下:------------------------------1. dynamic = True2. Locale = 10333. provider = CIMWin324. SupportsUpdate = True5. UUID = {8502C4D9-5FBB-11D2-AAC1-006008C78BC7}
win32_service 类的属性和属性限定信息------------------------------------------------------1. AcceptPause1.1. CIMTYPE = boolean1.3. read = True……win32_service 类的方法和方法限定信息-------------------------------------------------1. StartService1.1. MappingStrings = Win32API|Service Functions|StartService1.2. Override = StartService1.3. ValueMap = 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,..…… 返回的信息很多,我省略了其中的绝大部分,只保留了一部分典型的来说明我们应该如何读懂类的限定信息。 返回信息的第一部分表明了对于此类的限定信息: 1. dynamic = True Abstract——抽象类,Dynamic——动态类,Association——关联类,表明win32_service类是动态类。 2. Locale = 1033 代表着区域设置或者叫本地化编码,是一组与用户的语言、国家/地区以及文化传统有关的用户首选信息,确定诸如:键盘布局、字母的排序顺序,以及日期、时间、数字、货币等的格式,一般不用管它。 3. provider = CIMWin32 Provider代表的是类的提供程序,说明win32_service类是由CimWin32.dll提供的。 4. SupportsUpdate = True 指出类是否支持实例的修改。 5. UUID = {8502C4D9-5FBB-11D2-AAC1-006008C78BC7} 代表本地计算机上的全球通用唯一的标识符,我不知道有什么用处。 返回信息的第二部分代表了类的属性限定符 1. AcceptPause 这第一行表明检索到的类的属性名是:AcceptPause 1.1. CIMTYPE = boolean CIMType代表属性的数据类型,说明这个属性是布尔型。 1.3. read = True read代表属性可读,而Write则代表属性的值是否可以修改,如果属性没有定义Write限定符,代表什么意思呢?它代表从该类获得的实例的那个属性是不可以改写的,也就是说不能给这个属性赋值。这其实解决了一个困惑我很久的一个问题,为什么我在对很多类的属性进行了赋值后,用Put_方法对修改进行了提交,可是事实上却什么也没有改变。此外还有Key限定符指出该属性是类的键,用于识别在相同资源集合中的托管资源的唯一实例。 返回信息的第三部分代表了类的方法及方法的限定符。现在我们能用到的还不多,就不介绍了,有兴趣的朋友可以参照:http://msdn2.microsoft.com/en-us/library/aa393650.aspx 需要说明的是,不是在每一个类定义或者属性、方法定义中,这所有的限定符都要出现的,可能只出现了其中的一部分。 当然,我们也可以从system32/wbem/cimwin32.mof以及system32/wbem/cimwin32.mfl两个文件中读取整个托管资源的类定义和类描述,以及对每个类的属性、方法和限定符的描述,其中包含的信息很多,也包含了更多的类限定符,阅读起来有一定的难度。将上面的例子的代码和vbsedit中包含的Object Browser联合起来,可以得到我们需要的绝大部分的信息。
