由“如何取得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上的幫助文檔即可,是不是非常的方便?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM