zoukankan      html  css  js  c++  java
  • 由“如何取得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(@"rootWMI", "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
    ";
                }
            }
    
            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" ,描述为"无效类别"的错误,如下图:

     

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

     

    登录成功之后我们就可以查看系统有哪些类,并且还可以执行 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中,我们有多少类可以供查询呢?这个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上的帮助文档即可,是不是非常的方便?

  • 相关阅读:
    大型站点技术架构PDF阅读笔记(一):
    【大话QT之十三】系统软件自己主动部署实现方案
    VS编译duilib项目时候的错误解决方法整理
    Missing iOS Distribution signing identity for …, 在打包的时候发现证书过期了。
    Django项目国际化
    Codeforces Round #297 (Div. 2) 525D Arthur and Walls(dfs)
    BZOJ 2209: [Jsoi2011]括号序列 [splay 括号]
    NOIP2016DAY1题解
    清北学堂入学测试P4751 H’s problem(h)
    BZOJ 3173: [Tjoi2013]最长上升子序列 [splay DP]
  • 原文地址:https://www.cnblogs.com/zxlovenet/p/3522847.html
Copyright © 2011-2022 走看看