在很多情况下,你通过WMI得到的信息也可以通过其他方式从操作系统获得。比如说,假设你想知道计算机的名字,那么你可以在注册表里查找。如果你想知道C:驱空闲磁盘空间的大小,那么你不妨利用API函数。但是采用以上这些方法获取信息都是比较困难的方式,在用Visual Basic开发应用程序的情况下尤其如此。而WMI则能让你利用良好格式化的对象模型、SQL风格的查询获取系统信息,所需代码不但量比较少而且易于阅读。
现在让我们考察以下三个课题:查询WMI、获取WMI信息和调用WMI方法。这里给出的示例都是用Visual Basic编写的。要了解更多的有关信息请参看MSDN上的WMI文档。
查询WMI通常采用两种方式:获得整个WMI对象或者采用SQL风格的查询。此外,因为我们访问的是系统信息甚至可能是通过网络查询这些信息,所以在查询WMI的时候我们还必须提供安全信息。首先,我们需要在Visual
Basic 中打开Project – References 并选中Microsoft WMI Scripting Library给WMI类型库增加一条引用。创建WMI类型库的引用之后我们可以如下所示使用WMI:
Dim oWMI as SWBEMObjectSet
Set oWMI =
GetObject("Winmgmts:").InstancesOf("Win32_LogicalDisk")
让我们分析下以上代码。首先,我们声明了一个SWBEMObjectSet类型的变量,这是标准的WMI集合类。接着,我们用一条比较长的语句对oWMI变量实例化。首先注意到的是对Winmgmts的引用。该对象提供者是WMI的标准引用。下一部分,也就是
则用我们要查询系统的安全性。按照以上定义,我们要采用运行该程序的用户的信任关系。WMI文档中定义了若干种安全级别和认证方法。InstancesOf是一种WMI方法,该方法获得被请求WMI对象的所有实例。最后,我们规定了想获取的对象Win32_LogicalDisk,该对象包含了计算机上所有磁盘驱动器的信息。执行以上语句之后,oWMI就拥有了一组WMI对象,它们带有各个磁盘驱动器的信息。接下来我们再考察如何获取这些信息。
刚才我提到可以用SQL风格的语句WQL(WMI查询语言)查询WMI。WQL是一种只读的SQL语言,支持有限的SQL词汇。如果我们用WQL查询WMI则可以用ExecQuery方法代替InstancesOf。为了演示WQL的工作原来,我们把以上的查询修改为只获取本地(非网络)磁盘驱动器的信息:
Set oWMI = GetObject("winmgmts: ").ExecQuery("select
* from Win32_LogicalDisk where DriveType=3")