程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WMI和WQL學習

WMI和WQL學習

編輯:關於.NET

基礎知識: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下面比較常用的一些類。表格如下:

有了WMI類之後,我們就可以根據自己的需要來寫WQL來查詢系統中的各個數據了,比如我們想知道當前系統中有多少物理磁盤的存在,只需要下面這樣就能返回系統的磁盤實例:

SELECT * FROM Win32_DiskDrive

如果需要進一步了解這些物理磁盤的信息,可以從獲取的參數中去查找,這些參數,你可以查找MSDN上的幫助文檔即可,是不是非常的方便?

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved