【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 = ;
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()) - ) / ;
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)
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上的帮助文档即可,是不是非常的方便?