欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

WQL语言简介和WQL测试工具wbemtest.exe使用方法详细介绍

程序员文章站 2023-11-02 13:28:28
wql就是wmi中的查询语言,wql的全称是wmi query language,简称为wql,翻译成中文好像可以成为windows管理规范查询语言。熟悉sql语言的朋友会...

wql就是wmi中的查询语言,wql的全称是wmi query language,简称为wql,翻译成中文好像可以成为windows管理规范查询语言。熟悉sql语言的朋友会感觉它和sql非常相似。

wql其实非常简单,它有如下特点:
1、每个wql语句必须以select开始;
2、select后跟你需要查询的属性名(我刚才对应sql将其称之为字段名了),也可以像sql一样,以*表示返回所有属性值;
3、from关键字;
4、你要查询的类的名字;
5、另外,如果你想精确查询结果还可以加上where条件从句。比如某个类有enable属性,你可以在查询的时候加上where enable=true。

如以下的都是正确的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

在winxp和win2003中有一个自带的wql测试工具,叫wbemtest.exe,用它就能查看有哪些类和类有哪些 属性,使用方法如下:
首先,运行wbemtest.exe,如下图:

WQL语言简介和WQL测试工具wbemtest.exe使用方法详细介绍

点“确定”之后会出现一个“windows管理规范测试器”的窗口,如下图:

WQL语言简介和WQL测试工具wbemtest.exe使用方法详细介绍

点击“连接”会出现一个对话框,我们可以选择连接本地主机或者远程主机,如下图:

WQL语言简介和WQL测试工具wbemtest.exe使用方法详细介绍

如果是本机测试并且是用管理员身份登录,可以不用填写用户名和密码,如果是链接远程主机则需要填写远程主机上的用户名和密码(建议使用远程主机上的管理员身份登录),点击“连接”之后就会回到主界面。注意,只有登录之后才能查看和查询。

点击“查询”按钮,输入我们要查询的wql语句,如"select * from win32_logicaldisk",这是查询系统逻辑驱动器的wql语句,如图:

WQL语言简介和WQL测试工具wbemtest.exe使用方法详细介绍

这是我们多半会得到一个号码为"0x80041010" ,描述为"无效类别"的错误,如下图:

WQL语言简介和WQL测试工具wbemtest.exe使用方法详细介绍


出现这个错误是因为刚开始默认的名称空间为"root/default",这时我们需要更改名称空间。再点击“连接”按钮,将默认的"root/default"更改为"root/cimv2",然后再点"连接"按钮,如下图:

WQL语言简介和WQL测试工具wbemtest.exe使用方法详细介绍

登录成功之后我们就可以查看系统有哪些类,并且还可以执行wql查询了。
点击"枚举类别"按钮,然后在弹出的对话框中输入要查找的类名就可以查询类的属性了。如下图(注意:我没有填写超类别名称,并且选中"递归"单选按钮,这样就是递归列举系统中所有的类):

WQL语言简介和WQL测试工具wbemtest.exe使用方法详细介绍

查询结果如下图:

WQL语言简介和WQL测试工具wbemtest.exe使用方法详细介绍


这些可都是有用的东西哦,如果你细心,你会这个列表里发现我以前所用到的wql语句里设计到的所有的类,如win32_logicaldisk、win32_share等等。需要注意的是,有些还有括号,这些是方法。

下面是一些查询的结果:

WQL语言简介和WQL测试工具wbemtest.exe使用方法详细介绍

WQL语言简介和WQL测试工具wbemtest.exe使用方法详细介绍

WQL语言简介和WQL测试工具wbemtest.exe使用方法详细介绍

我们还可以对其中某一项数据双击查看属性,如下图:

WQL语言简介和WQL测试工具wbemtest.exe使用方法详细介绍

如果我们不习惯这种方式查看,我们还可以点击上面这个窗口中的"显示mof“按钮,下图是我点击"显示mof“按钮的结果:

WQL语言简介和WQL测试工具wbemtest.exe使用方法详细介绍

从上面的图里就能看出这个类有哪些属性及对应的属性值了。

今天的内容看起来似乎和.net没有什么联系,但是只有了解并且熟悉了wql才能使我们快速和顺利地编写.net代码。

wmi 测试器 (wbemtest.exe) 演练

现在,您对可用于浏览和查看 cim 的工具已经有了一些认识,让我们使用 wmi 测试器 (wbemtest.exe) 来检查win32_process 类定义并修改清单 2,以便从在您的本地计算机上运行的进程检索一些属性。

打开一个命令提示,键入 c:\>wbemtest.exe,按下 enter 来开始 wmi 测试器工具。请注意,大部分按钮在主 wmi 测试器窗口上是被禁用的,这说明此时您没有连接到 wmi。

单击 connect? 连接到本地或远程计算机上的 wmi 服务。显示“连接”对话框,它提供一个标记为namespace 的文本输入区域,该区域默认值为 root\default。将 namespace 区域的值更改为root\cimv2,单击“连接”对话框的 connect 按钮返回到主 wmi 测试器窗口。

主窗口中左上角的命名空间标识符应该显示为 root\cimv2。请注意,所有的按钮现在都已启用,这说明在当前凭据环境下,您已经成功连接到本地主机上的 wmi。单击 enum classes? 打开“超类信息”对话框。

在“超类信息”对话框中,不要填写 enter superclass name 区域,单击 recursive 选项,单击 ok 以枚举 root\cimv2 名称空间中定义的所有 cim 类。

此时,您可能应该正在查看一个列出了数百个类定义的“查询结果”对话框。类的数量主要取决于您正在运行的 windows 的版本。例如,如果使用 windows 2000,则您应该会看到大约 600 个类定义。如果运行 windows xp,则您应该会看到大约 900 个类定义。

请注意,列于“查询结果”对话框顶部的类是以两个下划线为开头的。这些是系统类。系统类是预定义的 cim 类,支持内部 wmi 配置与操作,例如提供程序注册、命名空间安全性及事件通知等。现在,忽略系统类,向下滚动“查询结果”对话框直至看到以 cim_ 开头的类。

名称以 cim_ 开头的类是由 dmtf 维护的核心与公共基类。继续向下滚动直至到达以 win32_ 开头的类。

名称以 win32_ 开头的类是 microsoft 扩展类,表示 windows 特定的托管资源。如果这是您第一次检查root\cimv2 命名空间,您可能希望熟悉 root\cimv2 命名空间中的类的完整集合,尤其是有 win32_ 前缀的类。

向下滚动“查询结果”对话框直至到达 win32_process 类,双击该类名打开 win32_process 对话框的对象编辑器。

“对象编辑器”对话框显示被选定类的定义和实现的详细信息(属性和方法)。回忆一下我们之前讨论的内容 — 类定义是 wmi 可管理资源的蓝图。

选择 hide system properties 复选框隐藏系统属性。剩余的 win32_process 属性表示您可以从在本地或远程计算机上运行的进程检索的信息。

要完成您的 wmi 脚本练习,尝试去检索 namehandle 和 processid 属性。使用前面的三个清单之一作为模板,试着在进行到第 7 步之前运行脚本。

 要在本地计算机上运行脚本,将 strcomputer 变量的值设置为“.”(引号内的一个单点)。

在运行新创建的 getprocesses.vbs 脚本之后,您可以用 wimi 测试器验证脚本的结果。在 win32_process 对话框的对象编辑器中,单击 instances。产生的查询结果对话框列出在计算机上运行的进程的实例。双击一个指定的进程实例,查看该实例的详细信息。

 软件下载地址:

wmi 测试器演练的答案

复制代码 代码如下:

strcomputer = "." ' dot (.) equals local computer in wmi
set wbemservices = getobject("winmgmts:\\" & strcomputer)
set wbemobjectset = wbemservices.instancesof("win32_process")
for each wbemobject in wbemobjectset
wscript.echo "name: " & wbemobject.name & vbcrlf & _
" handle: " & wbemobject.handle & vbcrlf & _
" process id: " & wbemobject.processidnext