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对象也有自己的属性。
SWBemPropertySet的Count属性是属于这个集合的SWbemProperty对象的数量。
在SWbemProperty对象的最重要的属性是Name和Value.匹配在基本的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
浙公网安备 33010602011771号