WMI(Windows Management Instrumentation,Windows 管理規範)是微軟提供的一套標準化架構,
WMI 提供了一個資料模型,將系統中的各種資訊(例如 CPU、記憶體、服務、磁碟)封裝為物件(Object)
與類別(Class)。
讓程式開發人員在 Windows 系統中存取與管理硬體與軟體資訊。
- WMI:一個架構(API)用來存取、管理 Windows 系統中的硬體與軟體資訊。
- WQL: 一種語言,用來查詢 WMI 中的資料,語法類似 SQL。
WMI 的主要作用
- 系統資訊查詢:查詢電腦的硬體(如 CPU、記憶體、硬碟)與軟體(如作業系統版本、安裝的程式、服務等)資訊。
- 遠端管理:系統管理員可以透過網路遠端存取其他電腦的系統資訊與資源設定,進行管理工作。
- 系統監控與事件偵測:監控系統事件,例如:磁碟空間變化、程式啟動或終止、USB 裝置插拔等。
- 自動化腳本支援(如 PowerShell):編寫腳本自動化管理任務,例如關閉防火牆、重啟服務、查詢登入紀錄。
- 硬體與驅動程式資訊管理:讀取 BIOS、電池狀態、風扇速度、裝置驅動程式版本等詳細資訊。
- 應用程式整合:第三方系統管理工具(如 SCCM、監控系統)常利用 WMI 做資料蒐集與執行命令。
一、用工具分類
- PowerShell
- WMIC(命令提示字元CMD,已過時但仍可用)
- C#
使用 Get-WmiObject(舊方式)或 Get-CimInstance(新方式)。
搭配 WMI ClassWin32_BIOS查詢BIOS資訊, -ClassName 可以不用加
Get-CimInstance -ClassName Win32_BIOS
-Class 可以不用加
Get-WmiObject -Class Win32_BIOS
搭配 WQL查詢
搭配 Where-Object、Select-Object 等管道進行過濾與顯示。
Get-WmiObject -Query "SELECT * FROM Win32_LogicalDisk WHERE DriveType=3"
例如:wmic cpu get name
wmic bios get serialnumber
透過 COM 介面來呼叫 WMI API。
project專案的References要記得加入 System.Management.dll
文件顶部添加
using System.Management;
使用Win32_Processor查詢CPU的資訊
using System; using System.Management; // 引用 System.Management.dll class Program { static void Main() { // WQL 查询语句 string query = "SELECT * FROM Win32_Processor"; // 创建一个 WMI 查询对象 ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); // 执行查询并遍历结果 foreach (ManagementObject obj in searcher.Get()) { Console.WriteLine("名称: " + obj["Name"]); Console.WriteLine("核心数: " + obj["NumberOfCores"]); Console.WriteLine("线程数: " + obj["NumberOfLogicalProcessors"]); Console.WriteLine("制造商: " + obj["Manufacturer"]); Console.WriteLine("--------------------------------------"); } } }
範例對比一:
- 用 PowerShell與 WMI Class查詢邏輯磁碟空間
Get-WmiObject Win32_LogicalDisk -Filter "DriveType = 3"
Get-WmiObject -Query "SELECT * FROM Win32_LogicalDisk WHERE DriveType = 3"
範例對比二 (Win32_Battery):
- 用WMI Class查詢系統的電池
Get-WmiObject -Class Win32_Battery
Get-WmiObject -Query "SELECT * FROM Win32_Battery"
Get-CimInstance -Query "SELECT EstimatedChargeRemaining, BatteryStatus FROM Win32_Battery"
二、查詢類別分類(常用 WMI Class)
分類 | 常用類別(Class) | 說明 |
---|---|---|
硬體 | Win32_Processor, Win32_PhysicalMemory | 查詢 CPU、記憶體、主機板等 |
磁碟/存儲 | Win32_LogicalDisk, Win32_DiskDrive | 查詢磁碟空間與硬碟資訊 |
系統 | Win32_OperatingSystem, Win32_BIOS | 查詢作業系統與 BIOS |
網路 | Win32_NetworkAdapterConfiguration | 查詢網路卡與 IP 設定 |
程式與服務 | Win32_Service, Win32_Product | 查詢正在執行的服務或安裝程式 |
使用者帳戶 | Win32_UserAccount, Win32_Group | 查詢本機帳戶、群組資訊 |
開機與進程 | Win32_StartupCommand, Win32_Process | 查詢自動啟動項目與執行中程序 |
電源 | Win32_Battery, Win32_PowerPlan | 查詢電池與電源管理設定 |
WQL 語法總覽
1. 基本語法結構
SELECT <屬性清單> FROM [WHERE <條件>] [ORDER BY <屬性>]
2. 常見語法要素
🔹SELECT
選擇要查詢的屬性,可以是*或列出多個欄位
SELECT * FROM Win32_OperatingSystem SELECT Name, ProcessId FROM Win32_Process
🔹FROM
指定 WMI 類別(WMI Class),例如:
- Win32_OperatingSystem
- Win32_Processor
- Win32_LogicalDisk
🔹WHERE
過濾資料的條件(支援基本比較運算符):
SELECT * FROM Win32_Process WHERE Name = 'notepad.exe' SELECT * FROM Win32_LogicalDisk WHERE DriveType = 3 AND FreeSpace < 1000000000
支援的比較運算符:
- =, !=, <, <=, >, >=
AND
,OR
,NOT
🔹ORDER BY
可選的排序條件:
SELECT Name, ProcessId FROM Win32_Process ORDER BY Name
3. 範例總結
-- 查詢所有邏輯磁碟資訊 SELECT DeviceID, FileSystem, FreeSpace FROM Win32_LogicalDisk -- 查詢 CPU 名稱與核心數,若核心數大於 4 SELECT Name, NumberOfCores FROM Win32_Processor WHERE NumberOfCores > 4 -- 查詢所有記憶體條 SELECT Capacity, Speed FROM Win32_PhysicalMemory ORDER BY Speed DESC
留言
張貼留言