WMI的层次结构

一生二,二生三,三生万物

 

  WMI的体系结构,很多人都解释不清,这是因为本质上讲,连接到WMI的脚本都很标准化,也不困难,所以大家往往不深究它内在的体系结构。导致很多人在写了很多脚本后,对WMI的层次结构还是不了解,所以,我抛砖引玉,尝试着来砍砍这个结构。

   首先,WMI是一个分类系统,被管理对象依类形被划分。比如win32_share类用于共享对象。而任何类,都是由父类导出的,这样我们朝上回溯,就可以看到一个“太初原子”,所有的WMI的其它类都是由它生出

   我们为了更清晰的看到这种层次结构,我们用脚本Locator的方法来连接到WMI,这个连接方法在大多数的脚本中都不会采用,因为它相比于moniker的连接方法稍显繁琐。

   首先我们看到的是一个locator对象,我们可以通过vbscript来创建出这个对象:

  Set objLocator = CreateObject("wbemScripting.SwbemLocator")

  好了,现在有了第一个“太初原子”了

   我们观察一下,第一个太初原子有什么方法和属性,天哪!它太简单了,它只有一个方法,connectserver方法,和一个叫security_的属性。不要怀疑,一切太初的东西必定是很简单的。第一个生命体也是超简单的。

  接下来,细胞开始分裂了,ConnectServer方法被用来为特定服务器和名称空间提交一个SWbemServices对象,在这个过程中要提交相应的安全信息。

语法如下:

Set object = LocatorObjects.ConnectServer _

(ServerName, Namespace, UserAccount, UserPassword,_

Locale, Authority, SecurityFlags, NamedValueSet)

 

你可以看到上图,我的例子要简单得多,就是一个

Set objsvc = objlocator.ConnectServer()

这代表什么含义呢?代表为本地计算机和默认名称空间创建一个SWbemServices类对象。我们再来看看这个由SWBemLocator派生出来的SWbemServices类对象的特征。

 

~~~~,多了好多方法啊,共17个,属性也还只有一个,Security_。(至于Security_属性的含义,容开专题再议)。利用这个类对象的get方法,细胞又可以分裂了。

当一个合法的SWbemService对象被创建,你可以使用Get方法或InstancesOf方法来来检索任何在CIM中的类或实例模型。我们可以使用SWbemServics.Get方法来创建SWbemObject ,如下:

 

set objdisk_c = objsvc.Get("Win32_LogicalDisk.DeviceID='C:'")

 

  通过Get方法返回的这个对象是SWbemObject对象,在前面的示例中,这个对象代表一个WMI对象,而这反过来代表一个可管理对象:“逻辑磁盘C”。

     这里特别要注意的是,SWbemObject对象有它自己的属性和方法。这些都和WMI对象不同。如下图:

 

  SWbemObject对象的Properties_属性是一个嵌入对象,这个对象是一个SWBemPropertySet对象,并且有自己的属性和方法,是一个SWbemProperty对象的个体的集合。SWbemProperty对象也有自己的属性。

  SWBemPropertySetCount属性是属于这个集合的SWbemProperty对象的数量。

  在SWbemProperty对象的最重要的属性是NameValue.匹配在基本的WMI对象的属性名上,并相关到相应的值。

  比如,要确定逻辑磁盘C的空闲空间,你必须首先通过Obj.properties_属性检索表明SWbemPropertySet对象,在下面的例子里,包含了逻辑磁盘的所有属性,是一个集合。然后,你通过这个集合来检索SWbemProperty对象,来找到name属性等于FreeSpace 。一旦这一目标已被确定,你就能阅读被称为SWbemProperty.Value的的相关属性信息了。

这个过程如果用代码来表示,可以反映在下面的脚本中:

 

Set objSvc = GetObject("WinMgmts:")

Set obj = objSvc.Get("Win32_LogicalDisk.DeviceID=’C:’")

For each objProperty in obj.properties_

If objProperty.name = "FreeSpace" Then

vFreeSpace = "The " & objProperty.Name & " is " & _

objProperty.value & " Bytes"

End If

Next

MsgBox vFreeSpace, vbInformation, "Free Space on C:"

 

检索WMI对象使用的SWbemObject的属性,你也可以通过SwbemPropertySet对象的Item方法,来阅读特定的属性的值。下面是示例:

 

Set objSvc = GetObject("WinMgmts:")

Set obj = objSvc.Get("Win32_LogicalDisk.DeviceID=’C:’")

vFreeSpace = _

obj.Properties_.Item("FreeSpace").Value & " Bytes"

MsgBox vFreeSpace, vbInformation, "Free Space on C:"

 

好了,到此,我们已经摸到了WMI的门槛了!

来源:http://itecn.net/blogs/qiqinghua/archive/2010/08/09/wmi.aspx

posted @ 2010-08-28 00:32  覆雨翻云  阅读(625)  评论(0)    收藏  举报