WMI的WQL简明教程系列的前四篇文章[1,2,3,4]完全介绍WQL的各个基本知识,相信对于WMI的WQL的开发来说,这些知识已经足够我们步入WMI的世界,并能准确的驾驭WQL中的各个使用细节了。这些掌控的所有细节,自然只有在实战中进行发挥,才能体现我们学习WMI的WQL的作用。在实际中使用,我们还需要一些辅助的工具来进行开发。WMI的基本知识就像是武功修练中的内功心法,我们练得非常的醇厚,自然可以徒手独步武林,但在我们还没有练到随心所欲,化腐朽为神奇的境界,选择个武器共创天地也不失是个好主意,同样的道理,在全然彻底的了解WMI中的方方面面的时候,工具神码都是浮云,而在我们未能做到这个之前,选择一些工具来帮助我们就显得非常重要了。
由于MitchellChu也是初涉WMI不久,在WMI中的工具可能涉及不够全面,因此如果有不正确的地方,请各位不吝赐教。下面是用过的一些工具,以表格方式放出:
工具名称
描述
...
WMI的WQL简明教程系列的前三篇文章[1,2,3]分别介绍WQL中的关键字,运算符和WMI中的类,由这三个东西,理论上已经能够完成WQL语句的编写了,不过也仅是理论上。就好比盖房子,理论上有水泥,钢筋和砖头是可以盖的,但实际上,并不是一定能盖出好房子的,甚至房子盖不成的也有,要盖好房子,还需要一个设计图纸,相对应的,咱们的WQL也同样,只有了一些基础的配件,有的时候并不一定能够装配出能正常运行的WQL语句。为了能够让我们能够组装出能够运行的WQL语句,就需要WQL的设计图纸——语法。
从WQL关键字篇我们能够看到,WQL并没有UPDATE,INSERT这类SQL中的语句,因此我们能够想象的到,WMI的WQL最主要的功能就是为了查询系统数据,因此我们学习WQL语法的时候,首先只要能够了解到查询数据的语法,基本上就能够应付大部分情况了,怎么样,还是相当的简单吧?那让我们开始吧,先看看下面的WQL:
SELECT * FROM Device
WHERE __CLASS = "Modem" OR __CLASS = "Keyboard"
从上面的语句中我们能够看到WQL的基本语法结构,其和SQL语法类似,但WQL中多处了ASSOCIATORS OF和 REFERENCES OF两个查询结构,具体的WQL查询分为Schema,Data和Event查询,他们的区别:
数据查询:用于获取类实例,它返回特定类的所有实例,包括各自的请求属性集
Schema查询:获取类定义,使用的基本语法的形式与其他类型的查询一样
事件查询:用于过滤出一个特定事件通知的属性。事件表征被管理环境的变更。
每个查询允许添加一些附加的操作符,如:
WITHIN:指定轮询
GROUP:分组相同的事件
HAVING:过滤WITHIN和GROUP子句收集事件的通知。一般与NumberofEvents属性(收集事件数量)一起。这样可以侦测何时特定事件的数量超过了时间间隔中设置的极限。
下面是Schema和Data查询的语法结构:
; -----------------------------------
; http://blog.useasp.net/
; MitchellChu's Blog
; WQL tutorial
; WQL schema and data 查询的语法结构
; -----------------------------------
DATA-WQL =
("SELECT" <PROPERTY-LIST> "FROM" <CLASS-NAME>
<OPTIONAL-SEL-WHERE>)/
("SELECT" ASTERISK "FROM" <CLASS-NAME> <OPTIONAL-SEL-WHERE>)/
("SELECT" ASTERISK "FROM META_CLASS" <OPTIONAL-META-WHERE>)/
("ASSOCIATORS OF {" <OBJECT-REL-PATH> "}"
<OPTIONAL-ASSOC-WHERE>)/
("REFERENCES OF {" <OBJECT-REL-PATH> "}" <OPTIONAL-REF-WHERE>)
;========================================
; PROPERTY-LIST:属性列表
; 属性列表有属性名组成,多个属性名使用逗号分隔
; 如果奥全部选择,可以直接使用*(星号)代替
;========================================
PROPERTY-LIST = <PROPERTY-NAME> <PROPERTY-LIST2>
PROPERTY-LIST2 = [COMMA...
系列1和系列2两篇文章比较简单的介绍了下WMI中WQL的关键字和运算符,有这两样东西我们就能够按照WQL的语法规则来写WQL语句了,等等,我们的WQL要操作的是什么?没错,我们会发现,在WQL语句中还缺少一个要操作的对象,这就是本文要说的,WMI中最重要的一个组成部分——类。用过SQL语句的都应该清楚,无论是在MS SQL 还是MySQL中,我们如果要从数据库中查询数据,必须需要在SQL语句中指定查询的对象——表。在WQL中类的作用就相当于表,我们需要的数据会在不同的类中,而要将数据取出来,就要去找到各种对应的类。
如果我们把WQL比作SQL的话,WMI你就可以粗略的看作是数据库了,而WMI中的类,就是数据库中的表了,而类中返回的各种实例对象,可看作是表中的数据了。这个类比不完全正确,当深入会发现,每当要查询数据的时候,我们需要连接到指定的命名空间下,连接成功后,才能进行类的操作。现在暂时不去细究,初步有个概念就好,等具体操作的时候我们就能够明白了。
那么,在WMI中,我们有多少类可以供WQL查询呢?这个Mitchell倒是没有具体去统计数字,但在普通的操作中,能够涉及到的却并不是十分的多,我们可以用表格的形式列出在Win32下面比较常用的一些类。表格如下:
类名
描述
Win32_Fan
系统风扇
...
系列1中我们已经介绍了WMI的查询语言WQL中的关键字,相信在看完关键字之后,对于WQL的语句肯定不会那么陌生了,然而,有了关键字,自然还是不够的,至少在使用WHEE子句的时候,我们需要用到一些条件不是,而这些条件自然而然的就需要使用到本文说到的东西——运算符。虽然可以看作是SQL的一个子集,但是关键字会有些不同(前面已经有说过),运算符也会有些诧异。那么让我们看看在WQL中有哪些运算符。
既然WQL是SQL的一个自己,可以预见的是WQL中的运算符和SQL中的运算符应该差别也不是很大,在前面将关键字的时候,我们给出的WQL语句中就有部分运算符在使用了,而在关键字列表中,我们也给出了部分的运算符。先给个例子:
SELECT * FROM Win32_NetworkAdapterConfiguration
WHERE IPEnabled=TRUE
在上面例子中我们在WHERE子句中就使用了=运算符,TRUE运算符。进入主题,WQL的基本运算符有以下这些:
WQL运算符
WQL运算符描述
使用类型
=
等于
...
WMI(Windows Management Instrumentation, Windows 管理规范)是一项核心的 Windows 管理技术;用户可以使用 WMI 管理本地和远程计算机。WMI 通过编程和脚本语言为日常管理提供了一条连续一致的途径。而要在编程或者脚本语言中使用WMI,那自然不可或缺的就是WMI的查询语言(WQL,WMI Query Language),WQL是在美国国家标准研究所结构查询语言(ANSI SQL)的一个子集,并在此基础上作出稍许语义变化。WQL非常类似与通常使用的SQL语句,却没有SQL语句那么的复杂多变,算起来也可以说只是SQL语句的一个小子集。
要了解和使用WQL,WQL中使用的关键字是不可或缺的一环,像下面这些语句,你了解多少呢?
SELECT * FROM Win32_NetworkAdapterConfiguration
WHERE IPEnabled = True
SELECT * FROM Meta_Class
WHERE __Class LIKE "%Win32%"
ASSOCIATORS OF {Win32_LogicalDisk.DeviceID="C:"}
WHERE RequiredQualifier = Locale
看不懂? 没关系,本文就是本着看懂WQL语句的目的而来的。下面这个表格就是WQL会用到的关键字列表,而且后面还有对关键字的解释,相信你在看完MitchellChu整理翻译的这张表之后,上面这些语句应该不在话下了——至少知道他们大概是干什么的了。
WQL 关键字
关键字解释
AND
...