WMI (Windows管理規範)與WQL(WMI 查詢語言)

WMI(Windows Management Instrumentation,Windows 管理規範)是微軟提供的一套標準化架構,

WMI 提供了一個資料模型,將系統中的各種資訊(例如 CPU、記憶體、服務、磁碟)封裝為物件(Object)

與類別(Class)。

讓程式開發人員在 Windows 系統中存取與管理硬體與軟體資訊。

  • WMI:一個架構(API)用來存取、管理 Windows 系統中的硬體與軟體資訊。
  • WQL: 一種語言,用來查詢 WMI 中的資料,語法類似 SQL。


WMI 的主要作用

  1. 系統資訊查詢:查詢電腦的硬體(如 CPU、記憶體、硬碟)與軟體(如作業系統版本、安裝的程式、服務等)資訊。
  2. 遠端管理:系統管理員可以透過網路遠端存取其他電腦的系統資訊與資源設定,進行管理工作。
  3. 系統監控與事件偵測:監控系統事件,例如:磁碟空間變化、程式啟動或終止、USB 裝置插拔等。
  4. 自動化腳本支援(如 PowerShell):編寫腳本自動化管理任務,例如關閉防火牆、重啟服務、查詢登入紀錄。
  5. 硬體與驅動程式資訊管理:讀取 BIOS、電池狀態、風扇速度、裝置驅動程式版本等詳細資訊。
  6. 應用程式整合:第三方系統管理工具(如 SCCM、監控系統)常利用 WMI 做資料蒐集與執行命令。

一、用工具分類

  1. PowerShell
  2. 使用 Get-WmiObject(舊方式)或 Get-CimInstance(新方式)。

    搭配 WMI Class

    Win32_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"
    

  3. WMIC(命令提示字元CMD,已過時但仍可用)
  4. 例如:wmic cpu get name

    wmic bios get serialnumber
    

  5. C#
  6. 透過 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"
    
  • 用 PowerShell與 WQL查詢邏輯磁碟空間
  • Get-WmiObject -Query "SELECT * FROM Win32_LogicalDisk WHERE DriveType = 3"
    

範例對比二 (Win32_Battery):

  • 用WMI Class查詢系統的電池
  • Get-WmiObject -Class Win32_Battery
    
  • 用WQL查詢系統的電池
  • Get-WmiObject -Query "SELECT * FROM Win32_Battery"
    
  • 只查詢電池剩余電量和狀態
  • Get-CimInstance -Query "SELECT EstimatedChargeRemaining, BatteryStatus FROM Win32_Battery"
    

二、查詢類別分類(常用 WMI Class)

WMI 常用類別分類
WMI 查詢類別分類(常用 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

留言