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

留言

2025

05-27C# 多執行緒程(Multithreading)【五】task
05-21C# 多執行緒程(Multithreading)【四】ThreadPool
05-19C# 多執行緒程(Multithreading)【三】UI操作
05-19C# 多執行緒程(Multithreading)【二】Thread
05-12C# 多執行緒程(Multithreading)【一】
05-05WMI (Windows管理規範)與WQL(WMI 查詢語言)
04-30WndProc 視窗處理函數【三】USB裝置插入/移除偵測
04-29WndProc 視窗處理函數【二】Windows Messages (WM_*) 分類清單
04-29WndProc 視窗處理函數【一】

2024

11-27SPI Flash 操作 (Read/Write/Erase)
11-19Rotary Encoder Switch 旋轉編碼開關
11-14Command Line Interface - CLI via UART
11-14【STM32】USB HID - Volume Control
11-13【STM32】USB Custom HID
11-12【STM32】USB HID Keyboard + Mouse
11-12【STM32】USB HID Keyboard
11-12【STM32】USB HID Mouse
10-15SSD1306 128x64 OLED 【五】Wokwi Animator
09-2432F429IDISCOVERY - - LTDC [3] + FMC (SDRAM) + FatFS
09-2432F429IDISCOVERY - - LTDC [2] + FMC (SDRAM)
09-20STM32 + FatFs + SD card via SPI【三】FatFS指令操作II
09-19STM32 + FatFs + SD card via SPI【二】FatFS指令操作
09-18STM32 + FatFs + SD card via SPI【一】移植FatFS
09-0232F429IDISCOVERY - - LTDC [1]
04-17SSD1306 128x64 OLED 【四】Adafruit / GFX Library
04-17Arduino - Serial Plotter繪圖儀
04-16SSD1306 128x64 OLED 【三】
04-15SSD1306 128x64 OLED 【二】 Datasheet
04-12SSD1306 128x64 OLED 【一】I2C版本
03-20【freeRTOS】vTaskDelay 與 vTaskDelayUntil 的差異
03-19【freeRTOS】API功能列表
03-18【freeRTOS】Day1
03-08MBR和Blank project的差別
03-05刪除註冊檔registry的資料
02-27DFU over Bluetooth Low Energy
02-27nRF Util - 使用手冊
02-26nRF Command Line Tools
02-20建立BootLoader settings
02-19Secure DFU packet (ZIP) build 建立含袐鑰的Zip檔
02-19Secure DFU via BLE
02-19Secure DFU via UART
02-16nRF Util 安裝
01-16nRF52840 ic升級成nRF52840 Dongle的程式

2023

11-21[ SEGGER Embedded Studio ] 新增header files
11-21[ SEGGER Embedded Studio ] 編譯nRF52840時遇到的問題
11-07Arduino Nano ESP32 - Debugging除錯模式
11-03Git快速入手 - 使用Git GUI
10-30Git快速入手 - 使用Git Bash
10-12程式碼高亮顯示 -- google-code-prettify

2022

11-30[EZ-PD] CCG6DF CCG6SF的Host SDK遇到編譯錯誤(一)

2019

05-27[ Eagle PCB ] 合板成品
05-23#CASE_001_USB_TOOL_RL78_G12
05-22[ Eagle PCB ] 初次洗板
05-21[ Eagle PCB ] Panelize 併板
05-20[ Eagle PCB ] 建立自己的Library及元件
05-20[ Eagle PCB ] 添加library及元件
05-20[ Eagle PCB ] Introduce

2018

04-25[ TCP test Tool ] 好用的TCP Server/Client工具
01-16RZ/A1H -[0]- Renesas RZ/A1H YR0K77210S009BE BSP環境架設

2017

12-11EZ USB Suit使用JLink online debug FX3
10-20RL78 -[12]- CS+_CACX_Lab5_LowPower mode
10-16RL78 -[11]- CS+_CACX_Lab4_ADC_溫度感測
10-13RL78 -[10]- CS+_CACX_Lab4_ADC_內部參考電壓
10-13RL78 -[9]- CS+_Lab3_I2C + MPU6050
10-13RL78 -[8]- CS+_Lab2_Uart transmit
10-12RL78 -[7]- Renesas Flash Programmer 獨立燒錄軟體
10-12RL78 -[6]- CS+_雜記
10-12RL78 -[5]- CS+_tracking variables on debug mode
10-12RL78 -[4]- CS+_顯示ROM與RAM的使用size
10-12RL78 -[3]- CS+_Lab1_Led blinking
10-12RL78 -[2]- CS+專案建立
10-12RL78 -[1]- 開發環境介紹
10-06ESP-01 -[0]- 硬體設置
10-06LinkIt 7688 program Renesas RL78/G12 by 1-wire
10-06LinkIt Smart 7688 -[3]- Build the firmware from source codes
10-06LinkIt Smart 7688 -[2]- 使用UART進入bootloader / kernel console
10-06LinkIt Smart 7688 -[1]- 使用SSH連接kernel console
10-06LinkIt Smart 7688 -[0]- 初次使用
07-14LinkIt Smart 7688 -[9]- Using MRAA SPI in Python
07-13LinkIt Smart 7688 -[8]- Using MRAA UART in Python
07-12LinkIt Smart 7688 -[7]- Using MRAA I2C in Python
07-12LinkIt Smart 7688 -[6]- Using MRAA PWM in Python
07-12LinkIt Smart 7688 -[5]- Using MRAA GPIO in Python
07-10LinkIt Smart 7688 -[4]- 雜記
06-29輕乳酪蛋糕 Cotton Cheesecake
06-26VirtualBox 的 Ubuntu與Windows 共用資料夾

2015

04-29偵測USB PnP