C# WMI 技術專貼

C# WMI 技術專貼

1 什麼是WMI?

Windows Management Instrumentation (WMI)是可伸縮的系統管理結構,該規範採用一個統一、基於標準且可擴展的面向對象接口。它提供與系統管理員信息和基礎WMI API交互的標準方法,主要由系統管理應用程序開發人員和系統管理員用來訪問和操作系統管理信息;它可用來生成組織和管理系統信息的工具,使系統管理人員能夠更密切的監視系統活動。
WMI提供了一套內置在Microsoft Windows操作系統中的豐富的系統管理服務,可以在有大量的應用程序、服務和設備的系統中提供全方位的管理功能。它允許應用程序的開發者,使用簡單的、一致的機制,去查詢企業中的任一臺計算機上的信息,或是進行系統配置。

通過WMI接口可以獲得的信息量是驚人的,包括硬件設置,狀態信息,驅動器配置,BIOS信息,應用程序的設置,事件記錄信息,以及其他。WMI通過一組API來獲得信息,但它表徵的是一種通過一個簡單,工業標準對象管理模式來獲取信息的函數。這使得應用程序的開發者不必學習Windows的每一個API的具體細節。

.Net FrameWork SDK對WMI提供了全面的支持,.Net FrameWork SDK爲Visual C#能夠操作WMI提供了一個專門的命名空間"System.Management"。在命名空間"System.Management"中提供了大量用以處理和WMI相關的類、接口和枚舉。在使用WMI之前,必須在工程中添加對System.Management.dll的引用,然後聲明。



2 使用WMI連接遠程計算機

系統管理員可以通過目標機器的機器名(或者IP地址),用戶名以及密碼去查詢遠程計算機的狀態和信息,以及利用腳本執行一些管理工作。利用WMI連接遠程計算機是很方便的,可以參考下面的格式


複製代碼
連接遠程計算機示例代碼

1 ManagementObjectSearcher query;
2 ManagementObjectCollection queryCollection;
3 System.Management.ObjectQuery oq;
4
5 string machineName = "110.119.110.1"; //連接的目標機的IP地址或者機器名
6 co.Username = "YourName"; //連接需要的用戶名
7 co.Password = "YourPassword"; //連接需要的密碼
8 string connectString = "SELECT * FROM Win32_PnPSignedDriver"; //查詢字符串
9
10 System.Management.ManagementScope ms = new System.Management.ManagementScope("\\\\" + machineName + "\\root\\cimv2", co);
11 oq = new System.Management.ObjectQuery( connectString );
12 query = new ManagementObjectSearcher( ms, oq );
13 queryCollection = query.Get();

複製代碼

通過IP地址,用戶名和密碼就建立了一個可以查詢Win32_PnPSignedDrvier這個類(關於這個類的詳細信息請查詢MSDN)所有信息的連接。現在我們就可以遠程獲取目標機器上的所有Pnp驅動的信息了。是不是很方便?在得到所有的信息後,我們可以通過下面的兩種方式來獲取我們需要的屬性


複製代碼
讀取上一代碼獲得的內容

1 foreach ( ManagementObject mo in queryCollection)
2 {
3 // string hardwareID = mo["HardwareID"]); //直接根據屬性名得到屬性的值
4
5 //遍歷所有屬性,得到所有屬性的值
6 PropertyDataCollection searcherProperties = mo.Properties;
7 foreach (PropertyData sp in searcherProperties)
8 {
9 Console.WriteLine("Name = {0, -20}, Value = {1, -20}", sp.Name,sp.Value);
10 }
11 }

複製代碼









3 使用WMI連接本地計算機

使用WMI連接本地計算機也是非常方便的,我們只需要稍微修改一下上面的代碼就可以了。




1 string machineName = "localhost";
2 co.Username = "";
3 co.Password = "";
4





也可以用比較簡單的格式,直接使用查詢語句。




複製代碼
簡單連接本地代碼

1 string connectString = "SELECT * FROM Win32_PnPSignedDriver";
2
3 SelectQuery selectQuery = new SelectQuery( connectString );
4 ManagementObjectSearcher searcher = new ManagementObjectSearcher( selectQuery );
5
6 foreach (ManagementObject mo in searcher.Get())
7 {
8 PropertyDataCollection searcherProperties = mo.Properties;
9 foreach (PropertyData sp in searcherProperties)
10 {
11 Console.WriteLine(sp.Name + " " + sp.Value);
12 }
13 }

複製代碼





4 查詢語句的格式

上面的連接字符串connectString其實有很多種格式。對於WMI來說,使用WQL查詢所需要的信息。WQL繼承了SQL的一些語法。但是並不是說所有SQL的語句都可以用於WQL。常用的格式有如下幾種。

(1)查詢系統中類中所有對象的所有屬性
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結尾
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結尾,而且之間只有一個任意的字符
connectString = "SELECT HardwareID, DriverVersion FROM Win32_PnPSignedDriver WHERE HardwareID like 'Monitor_IBM254D'"

(7)查詢類中所有對象的HardwareID和DriverVersion屬性,並且對象的HardwareID必須是以Monitor開頭,以IBM254D結尾,而且之間只有一個任意的字符,還要滿足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結尾,而且之間只有一個任意的字符,或者滿足InfName是oem18.inf
connectString = "SELECT HardwareID, DriverVersion FROM Win32_PnPSignedDriver WHERE HardwareID like 'Monitor_IBM254D' OR InfName='oem18.inf'"

4.1常用WMI列表

// 硬件
Win32_Processor, // CPU 處理器
Win32_PhysicalMemory, // 物理內存條
Win32_Keyboard, // 鍵盤
Win32_PointingDevice, // 點輸入設備,包括鼠標。
Win32_FloppyDrive, // 軟盤驅動器
Win32_DiskDrive, // 硬盤驅動器
Win32_CDROMDrive, // 光盤驅動器
Win32_BaseBoard, // 主板
Win32_BIOS, // BIOS 芯片
Win32_ParallelPort, // 並口
Win32_SerialPort, // 串口
Win32_SerialPortConfiguration, // 串口配置
Win32_SoundDevice, // 多媒體設置,一般指聲卡。
Win32_SystemSlot, // 主板插槽 (ISA & PCI & AGP)
Win32_USBController, // USB 控制器
Win32_NetworkAdapter, // 網絡適配器
Win32_NetworkAdapterConfiguration, // 網絡適配器設置
Win32_Printer, // 打印機
Win32_PrinterConfiguration, // 打印機設置
Win32_PrintJob, // 打印機任務
Win32_TCPIPPrinterPort, // 打印機端口
Win32_POTSModem, // MODEM
Win32_POTSModemToSerialPort, // MODEM 端口
Win32_DesktopMonitor, // 顯示器
Win32_DisplayConfiguration, // 顯卡
Win32_DisplayControllerConfiguration, // 顯卡設置
Win32_VideoController, // 顯卡細節。
Win32_VideoSettings, // 顯卡支持的顯示模式。

// 操作系統
Win32_TimeZone, // 時區
Win32_SystemDriver, // 驅動程序
Win32_DiskPartition, // 磁盤分區
Win32_LogicalDisk, // 邏輯磁盤
Win32_LogicalDiskToPartition, // 邏輯磁盤所在分區及始末位置。
Win32_LogicalMemoryConfiguration, // 邏輯內存配置
Win32_PageFile, // 系統頁文件信息
Win32_PageFileSetting, // 頁文件設置
Win32_BootConfiguration, // 系統啓動配置
Win32_ComputerSystem, // 計算機信息簡要
Win32_OperatingSystem, // 操作系統信息
Win32_StartupCommand, // 系統自動啓動程序
Win32_Service, // 系統安裝的服務
Win32_Group, // 系統管理組
Win32_GroupUser, // 系統組帳號
Win32_UserAccount, // 用戶帳號
Win32_Process, // 系統進程
Win32_Thread, // 系統線程
Win32_Share, // 共享
Win32_NetworkClient, // 已安裝的網絡客戶端
Win32_NetworkProtocol, // 已安裝的網絡協議



Win32_USBHub
Win32_1394Controller
Win32_BaseBoard
Win32_Battery
Win32_BIOS
Win32_Bus
Win32_CacheMemory
Win32_CDROMDrive
Win32_CurrentProbe
Win32_DesktopMonitor
Win32_DeviceMemoryAddress
Win32_DiskDrive
Win32_DisplayConfiguration
Win32_DisplayControllerConfiguration
Win32_DMAChannel
Win32_Fan
Win32_FloppyController
Win32_FloppyDrive
Win32_HeatPipe
Win32_IDEController
Win32_InfraredDevice
Win32_IRQResource
Win32_Keyboard
Win32_MemoryArray
Win32_MemoryDevice
Win32_MotherboardDevice
Win32_NetworkAdapter
Win32_NetworkAdapterConfiguration
Win32_OnBoardDevice
Win32_ParallelPort
Win32_PCMCIAController
Win32_PhysicalMemory
Win32_PhysicalMemoryArray
Win32_PnPEntity
Win32_PointingDevice
Win32_PortableBattery
Win32_PortConnector
Win32_PortResource
Win32_POTSModem
Win32_PowerManagementEvent
Win32_Printer
Win32_PrinterConfiguration
Win32_PrintJob
Win32_Processor
Win32_Refrigeration
Win32_SerialPort
Win32_SerialPortConfiguration
Win32_SMBIOSMemory
Win32_SoundDevice
Win32_SystemEnclosure
Win32_SystemMemoryResource
Win32_SystemSlot
Win32_TapeDrive
Win32_TemperatureProbe
Win32_UninterruptiblePowerSupply
Win32_USBController
Win32_VideoConfiguration
Win32_VideoController
Win32_VoltageProbe





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

發佈了18 篇原創文章 · 獲贊 37 · 訪問量 98萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章