WMI教程-WMI查询(WQL语言初步)
一、WQL简介
WQL就是WMI中的查询语言,WQL的全称是WMI Query Language,简称为WQL,翻译成中文好像可以成为Windows管理规范查询语言。
WQL其实非常简单,它有如下特点:
- 每个WQL语句必须以 SELECT 开始;
- SELECT 后跟你需要查询的属性名(我刚才对应SQL将其称之为字段名了),也可以像SQL一样,以*表示返回所有属性值;
- FROM关键字;
- 你要查询的类的名字;
- 另外,如果你想精确查询结果还可以加上WHERE条件从句。比如某个类有Enable属性,你可以在查询的时候加上WHERE ENABLE=true。
二、详述
1、语法
- SELECT properties[,properties] FROM class [where clause]
2、参数
- SELECT 必选项。代表WQL语句的开始,
- properties 必选项。代表想查询的属性名字。可以是多个属性名,也可查询所有属性值,用*代替。
- FROM 必选项。跟在properties的后面。
- Class 必选项。代表想要查询的类的名称。
- where clause 可选项。where 从句和相关条件语句,用来缩小查询范围。
3、逻辑运算
- AND运算符,连接两个逻辑运算,当同时满足条件时通过。
- OR运算符,连接两个逻辑运算,当至少一个满足条件时通过。
例子:
SELECT * FROM Win32_LogicalDisk WHERE (DriveType = 2) OR (DriveType = 3 AND FreeSpace < 1000000)
4、比较运算
- = 等于
- > 大于
- < 小于
- <= 小于等于
- >= 大于等于
- <> 或 != 不等于
- Is [not] [不]是,仅仅用于比较NULL的时候
例子:
SELECT * FROM Win32_LogicalDisk WHERE FileSystem IS NULL
SELECT * FROM Win32_LogicalDisk WHERE FileSystem IS NOT NULL
SELECT * FROM Win32_LogicalDisk WHERE DriveType IS 5
SELECT * FROM Win32_LogicalDisk WHERE FileSystem IS NOT "NTFS"
5、Like运算符
描述:模糊匹配查询的条件
通配符
- "%"代表一个或者多个字符。例如,%Office%可代表"My Offices," "Office VPN,"或"Office." Office%可代表"Offices"或"Office VPN,"但是不能代表"My Offices,"
- "[ ]”返回参数范围.例如"[A-Z]ars"可代替"Mars," "Wars," and "Tars,"但是不鞥代替"Stars."
- "^"取范围的反面。例如"[^A-M]ars"可代替"Wars"和"Tars,"但是不能代替"Mars"因为"M"不再指定范围内。
- "_"代替单个字符。"M_rs"可代替"Mars," "M3rs,"
6、判断运算
描述:有的类的属性只有TRUE和FALSE两种状态,这个时候可以使用TRUE和FALSE来判断,记住这个时候不能使用is TRUE来判断,因为他只适用于判断NULL。
例子:
SELECT * FROM Win32_NetworkAdapterConfiguration WHERE DHCPEnabled = TRUE
7、相关查询
描述:检索与指定内容相关的所有实例并且返回查询结果。
语法:ASSOCIATORS OF
参数:
ASSOCIATORS OF {描述}
ASSOCIATORS OF {ObjectPath}
说明:
假设有四个实例,A,B,X和Y,其中A与X相关,B与Y相关
执行ASSOCIATORS OF {A}仅仅会返回一个X,如果还有其他的关系,也许会返回两个或者以上的实例。
例子:
Query:
ASSOCIATORS OF {Win32_LogicalDisk.DeviceID="C:"}
Results:
Win32_Directory.Name="C:\\"
Win32_ComputerSystem.Name="mycomputer"
Win32_DiskPartition.DeviceID="Disk #0, Partition #0"
如以下的都是正确的WQL语句:
SELECT * FROM Win32_LogicalDisk where drivetype=3
SELECT * FROM Win32_share
SELECT * FROM Win32_NetworkAdapterConfiguration WHERE DHCPEnabled=TRUE
SELECT Description FROM Win32_Account WHERE Name='Administrator'
SELECT Freespace,DeviceID FROM Win32_LogicalDisk
三、例子
使用 WQL 来创建有目标的查询,即做下列事情的查询:
- 只返回托管资源所有实例的选定的属性。
"SELECT DisplayName, State, StartMode FROM Win32_Service" - 返回一个类的选定的实例的所有属性。
"SELECT * FROM Win32_Service WHERE State = 'Stopped'" - 返回一个类的选定实例的选定属性。
"SELECT DisplayName,State,StartMode FROM Win32_Service WHERE State='Stopped'"
创建有目标的查询有时会显著地提高数据返回的速度。
例如,只返回那些在应用程序事件日志中含有 EventCode 0 的事件要比返回所有事件日志中的所有事件快的多。有目标的查询也让对返回的数据的工作变得更轻松。
相反,InstancesOf 将返回所有事件,而且您将不得不单独地检查每个事件并确定它是否:1. 来自应用程序事件日志并且,2. 带有 EventCode 0。虽然这可以完成,但是这太低效了而且对您来说需要额外的工作。
有目标的查询还可以减少返回的数据的数量,对在网络上运行的脚本来说这是个重要的考虑。表 1 展示了一些不同查询类型的相关数字。如您所见,通过各种查询类型返回的数据的数量是有相当大的差别的。
方法/WQL 查询 |
返回的字节 |
objSWbemServices.InstancesOf("Win32_Service") |
157,398 |
objSWbemServices.ExecQuery("SELECT * FROM Win32_Service") |
156,222 |
objSWbemServices.ExecQuery("SELECT Name FROM Win32_Service") |
86,294 |
objSWbemServices.ExecQuery("SELECT StartMode FROM Win32_Service") |
88,116 |
objSWbemServices.ExecQuery("SELECT StartMode FROM Win32_Service WHERE State='Running'") |
52,546 |
objSWbemServices.ExecQuery("SELECT StartMode, State FROM Win32_Service WHERE State='Running'") |
56,314 |
objSWbemServices.ExecQuery("SELECT * FROM Win32_Service WHERE Name='WinMgmt'") |
27,852 |
objSWbemServices.Get("Win32_Service.Name='WinMgmt'") |
14,860 |
表 1. 比较不同的 WMI 实例检索方法和查询
来源:http://hi.baidu.com/escortmnm/blog/item/d6e840133ad0f1ddf6039e6e.html