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

posted @ 2010-08-27 22:47  覆雨翻云  阅读(13237)  评论(0编辑  收藏  举报