Windows Management Instrumentation (WMI) 提供統一介面查詢系統軟硬體資訊。本文示範使用 Delphi 透過 SWbemLocator 連線 WMI,查詢 Win32_USBHub 類別取得 USB 裝置的 PID (Product ID) 與 VID (Vendor ID),並列出常用 WMI 查詢類別速查表。
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ActiveX, ComObj; // 必須引用 ActiveX, ComObj
procedure TForm1.Button2Click(Sender: TObject);
var
Locator: OleVariant;
WMI: OleVariant;
Ret: OleVariant;
Enum: IEnumVariant;
Item: OleVariant;
Value: Cardinal;
begin
// 1. 建立 WMI 定位器
Locator := CreateOleObject('WbemScripting.SWbemLocator');
// 2. 連線本機 WMI 命名空間 (root\cimv2)
WMI := Locator.ConnectServer('.', 'root\cimv2', '', '');
// 3. 執行 WQL 查詢:所有 USB Hub 裝置
Ret := WMI.ExecQuery('SELECT * FROM Win32_USBHub');
// 4. 列舉結果集 (需介面轉型)
Enum := IUnknown(Ret._NewEnum) as IEnumVariant;
// 5. 逐項處理
while Enum.Next(1, Item, Value) = S_OK do
begin
// 篩選大量儲存裝置 (隨身碟、外接硬碟)
if VarToStr(Item.Name) = 'USB Mass Storage Device' then
begin
// PNPDeviceID 格式: "USB\VID_XXXX&PID_YYYY\SERIAL"
ShowMessage('此 USB 裝置硬體 ID: ' + VarToStr(Item.PNPDeviceID));
// 解析 VID/PID (可選)
// VID_0781&PID_5567 → VID=0781, PID=5567
end;
Item := Unassigned; // 釋放 Variant 參考
end;
end;
| 屬性 | 說明 | 範例 |
|---|---|---|
DeviceID | WMI 內部裝置識別碼 | USB\VID_0781&PID_5567\1234567890 |
PNPDeviceID | 即插即用裝置 ID (含 VID/PID) | USB\VID_0781&PID_5567\1234567890 |
Name | 裝置友善名稱 | USB Mass Storage Device |
Description | 裝置描述 | 大量儲存裝置 |
Status | 狀態 | OK, Error |
Availability | 可用性 | 3 (Running/Full Power) |
uses RegularExpressions;
procedure ParseVIDPID(const PNPDeviceID: string; out VID, PID: string);
var
Match: TMatch;
begin
VID := ''; PID := '';
Match := TRegEx.Match(PNPDeviceID, 'VID_([0-9A-F]{4})&PID_([0-9A-F]{4})', [roIgnoreCase]);
if Match.Success then
begin
VID := Match.Groups[1].Value;
PID := Match.Groups[2].Value;
end;
end;
// 使用
var VID, PID: string;
ParseVIDPID(VarToStr(Item.PNPDeviceID), VID, PID);
ShowMessage(Format('VID=%s, PID=%s', [VID, PID]));
| 類別 | 用途 | 關鍵屬性 |
|---|---|---|
Win32_Processor | CPU 資訊 | Name, MaxClockSpeed, NumberOfCores, LoadPercentage |
Win32_BaseBoard | 主機板 | Manufacturer, Product, SerialNumber |
Win32_BIOS | BIOS | Version, Manufacturer, ReleaseDate |
Win32_PhysicalMemory | 實體記憶體模組 | Capacity, Speed, Manufacturer, PartNumber |
Win32_LogicalDisk | 邏輯磁碟機 | DeviceID, Size, FreeSpace, FileSystem, VolumeName |
Win32_DiskDrive | 實體磁碟機 | Model, Size, InterfaceType, SerialNumber |
Win32_NetworkAdapter | 網路介面卡 | Name, MACAddress, Speed, NetConnectionStatus |
Win32_NetworkAdapterConfiguration | 網路設定 | IPAddress, IPSubnet, DefaultIPGateway, DNSServerSearchOrder |
Win32_VideoController | 顯示卡 | Name, AdapterRAM, DriverVersion, VideoModeDescription |
Win32_OperatingSystem | 作業系統 | Caption, Version, BuildNumber, TotalVisibleMemorySize |
Win32_Process | 執行中程序 | ProcessId, Name, ExecutablePath, CommandLine |
Win32_Service | Windows 服務 | Name, DisplayName, State, StartMode |
Win32_Printer | 印表機 | Name, PortName, DriverName, WorkOffline |
Win32_Battery | 電池 (筆電) | EstimatedChargeRemaining, BatteryStatus, Chemistry |
Win32_TemperatureProbe | 溫度感測器 (需硬體支援) | CurrentReading |
// 條件過濾
WMI.ExecQuery('SELECT * FROM Win32_LogicalDisk WHERE DriveType = 3'); // 固定磁碟
WMI.ExecQuery('SELECT * FROM Win32_Process WHERE Name = "notepad.exe"');
WMI.ExecQuery('SELECT * FROM Win32_Service WHERE State = "Running"');
// 關聯查詢 (ASSOCIATORS OF)
WMI.ExecQuery('ASSOCIATORS OF {Win32_LogicalDisk.DeviceID="C:"} WHERE ResultClass=Win32_DiskDrive');
// 事件通知 (非同步)
WMI.ExecNotificationQuery('SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA "Win32_USBHub"');
Application.Initialize 時已呼叫,若在執行緒中使用需自行 CoInitialize(nil)/CoUninitializeItem := Unassigned 釋放 COM 參考計數,避免洩漏TTask.Run 背景執行Win32_Service 修改操作)WMI 是 Windows 系統資訊的「通用資料庫」。掌握 SWbemLocator → ConnectServer → ExecQuery → IEnumVariant 這套標準流程,即可輕鬆查詢 USB PID/VID、CPU 溫度、磁碟健康度、網路設定等數百種資訊。善用 WQL WHERE 子句過濾,能大幅提升查詢效率。