利用C#操作WMI指南
1 什么是WMI?
Windows Management Instrumentation (WMI)是可伸縮的系統(tǒng)管理結(jié)構(gòu),該規(guī)范采用一個統(tǒng)一、基于標(biāo)準(zhǔn)且可擴(kuò)展的面向?qū)ο蠼涌凇K峁┡c系統(tǒng)管理員信息和基礎(chǔ)WMI API交互的標(biāo)準(zhǔn)方法,主要由系統(tǒng)管理應(yīng)用程序開發(fā)人員和系統(tǒng)管理員用來訪問和操作系統(tǒng)管理信息;它可用來生成組織和管理系統(tǒng)信息的工具,使系統(tǒng)管理人員能夠更密切的監(jiān)視系統(tǒng)活動。
WMI提供了一套內(nèi)置在Microsoft Windows操作系統(tǒng)中的豐富的系統(tǒng)管理服務(wù),可以在有大量的應(yīng)用程序、服務(wù)和設(shè)備的系統(tǒng)中提供全方位的管理功能。它允許應(yīng)用程序的開發(fā)者,使用簡單的、一致的機(jī)制,去查詢企業(yè)中的任一臺計(jì)算機(jī)上的信息,或是進(jìn)行系統(tǒng)配置。
通過WMI接口可以獲得的信息量是驚人的,包括硬件設(shè)置,狀態(tài)信息,驅(qū)動器配置,BIOS信息,應(yīng)用程序的設(shè)置,事件記錄信息,以及其他。WMI通過一組API來獲得信息,但它表征的是一種通過一個簡單,工業(yè)標(biāo)準(zhǔn)對象管理模式來獲取信息的函數(shù)。這使得應(yīng)用程序的開發(fā)者不必學(xué)習(xí)Windows的每一個API的具體細(xì)節(jié)。
.Net FrameWork SDK對WMI提供了全面的支持,.Net FrameWork SDK為Visual C#能夠操作WMI提供了一個專門的命名空間"System.Management"。在命名空間"System.Management"中提供了大量用以處理和WMI相關(guān)的類、接口和枚舉。在使用WMI之前,必須在工程中添加對System.Management.dll的引用,然后聲明
using System.Management;
2 使用WMI連接遠(yuǎn)程計(jì)算機(jī)
系統(tǒng)管理員可以通過目標(biāo)機(jī)器的機(jī)器名(或者IP地址),用戶名以及密碼去查詢遠(yuǎn)程計(jì)算機(jī)的狀態(tài)和信息,以及利用腳本執(zhí)行一些管理工作。利用WMI連接遠(yuǎn)程計(jì)算機(jī)是很方便的,可以參考下面的格式
ManagementObjectSearcher query; ManagementObjectCollection queryCollection; System.Management.ObjectQuery oq; string machineName = "110.119.110.1"; //連接的目標(biāo)機(jī)的IP地址或者機(jī)器名 co.Username = "YourName"; //連接需要的用戶名 co.Password = "YourPassword"; //連接需要的密碼 string connectString = "SELECT * FROM Win32_PnPSignedDriver"; //查詢字符串 System.Management.ManagementScope ms = new System.Management.ManagementScope("\\\\" + machineName + "\\root\\cimv2", co); oq = new System.Management.ObjectQuery( connectString ); query = new ManagementObjectSearcher( ms, oq ); queryCollection = query.Get();
通過IP地址,用戶名和密碼就建立了一個可以查詢Win32_PnPSignedDrvier這個類(關(guān)于這個類的詳細(xì)信息請查詢MSDN)所有信息的連接?,F(xiàn)在我們就可以遠(yuǎn)程獲取目標(biāo)機(jī)器上的所有Pnp驅(qū)動的信息了。是不是很方便?在得到所有的信息后,我們可以通過下面的兩種方式來獲取我們需要的屬性
foreach ( ManagementObject mo in queryCollection) { // string hardwareID = mo["HardwareID"]); //直接根據(jù)屬性名得到屬性的值 //遍歷所有屬性,得到所有屬性的值 PropertyDataCollection searcherProperties = mo.Properties; foreach (PropertyData sp in searcherProperties) { Console.WriteLine("Name = {0, -20}, Value = {1, -20}", sp.Name,sp.Value); } }
3 使用WMI連接本地計(jì)算機(jī)
使用WMI連接本地計(jì)算機(jī)也是非常方便的,我們只需要稍微修改一下上面的代碼就可以了。
string machineName = "localhost"; co.Username = ""; co.Password = "";
也可以用比較簡單的格式,直接使用查詢語句。
string connectString = "SELECT * FROM Win32_PnPSignedDriver"; SelectQuery selectQuery = new SelectQuery( connectString ); ManagementObjectSearcher searcher = new ManagementObjectSearcher( selectQuery ); foreach (ManagementObject mo in searcher.Get()) { PropertyDataCollection searcherProperties = mo.Properties; foreach (PropertyData sp in searcherProperties) { Console.WriteLine(sp.Name + " " + sp.Value); } }
4 查詢語句的格式
上面的連接字符串connectString其實(shí)有很多種格式。對于WMI來說,使用WQL查詢所需要的信息。WQL繼承了SQL的一些語法。但是并不是說所有SQL的語句都可以用于WQL。常用的格式有如下幾種。
(1)查詢系統(tǒng)中類中所有對象的所有屬性
connectString = "SELECT * FROM Win32_PnPSignedDriver"
(2)查詢類中所有對象的HardwareID屬性
connectString = "SELECT HardwareID FROM Win32_PnPSignedDriver"
(3)查詢類中所有對象的HardwareID和DriverVersion屬性
connectString = "SELECT HardwareID, DriverVersion FROM Win32_PnPSignedDriver"
(4)查詢類中所有對象的HardwareID和DriverVersion屬性,并且對象的HardwareID必須以IBM254D結(jié)尾
connectString = "SELECT HardwareID, DriverVersion FROM Win32_PnPSignedDriver WHERE HardwareID like '%IBM254D'"
(5)查詢類中所有對象的HardwareID和DriverVersion屬性,并且對象的HardwareID必須以Monitor開頭
connectString = "SELECT HardwareID, DriverVersion FROM Win32_PnPSignedDriver WHERE HardwareID like 'Monitor%'"
(6)查詢類中所有對象的HardwareID和DriverVersion屬性,并且對象的HardwareID必須是以Monitor開頭,以IBM254D結(jié)尾,而且之間只有一個任意的字符
connectString = "SELECT HardwareID, DriverVersion FROM Win32_PnPSignedDriver WHERE HardwareID like 'Monitor_IBM254D'"
(7)查詢類中所有對象的HardwareID和DriverVersion屬性,并且對象的HardwareID必須是以Monitor開頭,以IBM254D結(jié)尾,而且之間只有一個任意的字符,還要滿足InfName必須是oem18.inf
connectString = "SELECT HardwareID, DriverVersion FROM Win32_PnPSignedDriver WHERE HardwareID like 'Monitor_IBM254D' AND InfName='oem18.inf'"
(8)查詢類中所有對象的HardwareID和DriverVersion屬性,并且對象的HardwareID必須是以Monitor開頭,以IBM254D結(jié)尾,而且之間只有一個任意的字符,或者滿足InfName是oem18.inf
connectString = "SELECT HardwareID, DriverVersion FROM Win32_PnPSignedDriver WHERE HardwareID like 'Monitor_IBM254D' OR InfName='oem18.inf'"
5 參考資料和工具
WMI Reference:http://msdn2.microsoft.com/en-us/library/aa394572.aspx
WMI Tools:http://www.microsoft.com/downloads/details.aspx?familyid=6430f853-1120-48db-8cc5-f2abdc3ed314&displaylang=en
WQL Query:http://www.microsoft.com/china/technet/community/scriptcenter/topics/win2003/like.mspx#EIB
上一篇:C#登入實(shí)例
欄 目:C#教程
下一篇:C#在MySQL大量數(shù)據(jù)下的高效讀取、寫入詳解
本文標(biāo)題:利用C#操作WMI指南
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6165.html
您可能感興趣的文章
- 01-10C#實(shí)現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已安裝軟件變化的方法
- 01-10C#實(shí)現(xiàn)判斷當(dāng)前操作用戶管理角色的方法
- 01-10C#中DataGridView常用操作實(shí)例小結(jié)
- 01-10C#操作ftp類完整實(shí)例
- 01-10asp.net中XML如何做增刪改查操作
- 01-10C#利用反射技術(shù)實(shí)現(xiàn)去掉按鈕選中時的邊框效果
- 01-10C#路徑,文件,目錄及IO常見操作匯總
- 01-10C#操作IIS方法集合
- 01-10C#操作數(shù)據(jù)庫中存取圖片文件的方法
- 01-10C#操作 JSON方法匯總


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery