求知若饥,虚心若愚

由“如何取得CPU的温度与型号”学到的知识延伸WQL

【Base】:WMI是一项核心的 Windows 管理技术;用户可以使用 WMI 管理本地和远程计算机。WQL就是 WMI 中的查询语言,翻译成中文好像可以成为 Windows 管理规范查询语言。

1.如何获取CPU的温度与型号

由于视窗本身并无提供各项硬体温度的监控方式,因此WMI虽然是的Windows提供的管理服务,但仍然需要硬体支援才能得到所需的资讯。

MSAcpi_ThermalZoneTemperature顾名思义是透过Acpi这个共同管理界面来查询,因此您的系统必须具备Acpi热区才有办法问到,而Acpi热区其实是笔记本电脑设计下的产品,在PC系统下并无Acpi热区的设计。

一般在电脑上是使用Win32_TemperatureProbe进行查询,但由于Win32_TemperatureProbe是直接问SMBIOS ,由SMBIOS里面挖出资料,但SMBIOS是否有支援WMI是由主机板厂商决定。也就是说,若主板厂商有支援WMI ,便可以使用Win32_TemperatureProbe的CurrentReading读到CPU溫度。但很不幸的,大多数(几乎可说是全部)的主板厂商都没有支援这项功能。

WMI的Windows管理规范提供系统,装置和应用程式资讯,在.NET中提供的System.Management命名空间取得WMI的讯息,以下介绍如何取得CPU的温度与序号。

使用ManagementObjectSearcher对象类别,使用前必须先将的System.Management加入引用

        private void GetCPUTemperature()
        {
            double CPUtprt = 0;
            System.Management.ManagementObjectSearcher mos
                = new System.Management.ManagementObjectSearcher(@"root\WMI", "Select * From MSAcpi_ThermalZoneTemperature");

            foreach (System.Management.ManagementObject mo in mos.Get())
            {
                CPUtprt = Convert.ToDouble(Convert.ToDouble(mo.GetPropertyValue("CrrentTemperature").ToString()) - 2732) / 10;
                label1.Text = "CPU温度:" + CPUtprt.ToString() + "°C\n";
            }
        }

        private void GetCPUCode()
        {
            ManagementObjectSearcher moSearch = new ManagementObjectSearcher("SELECT * FROM Win32_Processor");

            foreach (ManagementObject mObject in moSearch.Get())
            {
                this.label1.Text+=(mObject["ProcessorId"].ToString());
            }
        }

2.WQL知识

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。

就像这样:

SELECT  字段名  FROM  类名

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

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

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

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

点击“查询”按钮,输入我们要查询的 WQL 语句,如"Select * From Win32_LogicalDisk",这是查询系统逻辑驱动器的 WQL 语句,如图:

 

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

 

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

 

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

 

查询结果如下图:

 

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

下面是一些查询的结果:

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

 

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

 

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

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

相信信息可以参照下面的地址了解:

http://msdn.microsoft.com/zh-cn/library/system.management.managementobjectsearcher(v=vs.100)

http://blog.useasp.net/archive/2013/06/15/the-tutorial-series-of-wql-that-the-sql-in-wmi-chapter-one-keywords.aspx

3.WQL类

那么,在WMI中,我们有多少类可以供WQL查询呢?这个Mitchell倒是没有具体去统计数字,但在普通的操作中,能够涉及到的却并不是十分的多,我们可以用表格的形式列出在Win32下面比较常用的一些类。表格如下:

类名

描述

Win32_Fan

系统风扇

Win32_Keyboard

键盘

Win32_PointingDevice

指示设备,如鼠标

Win32_CDROMDrive

CD-ROM

Win32_DiskDrive

系统的硬盘

Win32_PhysicalMedia

任何存储设备,在一般的机器上,包含CD-ROM,物理硬盘,软驱,磁带机等

Win32_BIOS

系统BIOS

Win32_CacheMemory

系统的Cache内存

Win32_MemoryDevice

内存,含相关联的映射地址

Win32_PhysicalMemory

物理内存

Win32_Processor

CPU

Win32_NetworkAdapter

网络适配器,含物理网卡

Win32_NetworkAdapterConfiguration

网络适配器配置

Win32_NetworkAdapterSetting

网络适配器以及其相关设定

Win32_Printer

打印/传真设备

Win32_DesktopMonitor

显示设备

Win32_DisplayConfiguration

显示设备配置

Win32_Desktop

桌面

Win32_Environment

系统环境

Win32_Directory

文件目录,所有的目录

Win32_DiskPartition

磁盘分区

Win32_LogicalDisk

逻辑磁盘

Win32_Process

进程信息

Win32_Account

账户信息

Win32_PerfFormattedData

格式化后的性能数据

Win32_Service

系统服务

   有了WMI类之后,我们就可以根据自己的需要来写WQL来查询系统中的各个数据了,比如我们想知道当前系统中有多少物理磁盘的存在,只需要下面这样就能返回系统的磁盘实例:

SELECT * FROM Win32_DiskDrive

  如果需要进一步了解这些物理磁盘的信息,可以从获取的参数中去查找,这些参数,你可以查找MSDN上的帮助文档即可,是不是非常的方便?

posted @ 2014-01-16 17:12  初行  阅读(3681)  评论(2编辑  收藏  举报