◎WMI轻松入门之二

来源:互联网 发布:乌兹冲锋枪数据 编辑:程序博客网 时间:2024/06/05 02:36

解析类定义

在上一篇文章中我们说过,WMI中用类对托管资源进行抽象定义和和管理,那么,什么是类?

类的定义相信在很多面向对象的计算机教材中都能找到,我的理解是:类,是包含了一组独立功能的模块,这个模块由数据和功能组成,其中数据叫做类的属性,完成功能的部分叫做类的方法。我认为类的优点是:类完全可以由张三进行设计,李四可以拿来直接使用,在使用的时候,李四不需要知道类是如何设计、如何实现的,只要知道:这个类可以实现什么样的功能,这个类包含有什么样的方法和属性就可以了。更加重要的是,类还可以进行继承,就像父亲亡故,儿子继承了父亲所有的财产一样,如果我们发现某个类A已经完成了我们需要的大部分功能,我们再去重新设计一个新类来完成我们所有的功能,未免费时费力,根据类可以继承的特性,我们只要声明一个类继承了类A,然后按照需要添加需要的新的数据元素、扩展现有的功能模块,相信工作会简单很多。我看到很多书里都在说代码重用,我不是程序员,不知道所谓的代码重用具体是如何实现的,但是相信类应该在其中起了很重要的作用。

在微软的教程中,对类从功能和继承关系上进行了详细的说明,我不再赘述,仅仅做一个摘要:

任何资源如果要求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 = 1

For 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 + 1

Next

 

WScript.Echo

WScript.Echo strClass & " 类的属性和属性限定信息"

WScript.Echo "-------------------------------------------------"

i = 1 : j = 1

For 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 = 1

Next

 

WScript.Echo

WScript.Echo strClass & " 类的方法和方法限定信息"

WScript.Echo "-------------------------------------------------"

i = 1 : j = 1

For 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 = 1

Next

如果我们执行上述代码来查找win32_service类的限定符,一般情况下可以得到如下信息:

win32_service 的类限定信息如下:

------------------------------

1. dynamic = True

2. Locale = 1033

3. provider = CIMWin32

4. SupportsUpdate = True

5. UUID = {8502C4D9-5FBB-11D2-AAC1-006008C78BC7}

 

win32_service 类的属性和属性限定信息

------------------------------------------------------

1. AcceptPause

1.1. CIMTYPE = boolean

1.3. read = True

……

win32_service 类的方法和方法限定信息

-------------------------------------------------

1. StartService

1.1. MappingStrings = Win32API|Service Functions|StartService

1.2. Override = StartService

1.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联合起来,可以得到我们需要的绝大部分的信息。