核心命名空間與參考
- 命名空間:
System.Management
- 需加入參考:
System.Management.dll (專案 → 加入參考 → 組件 → Framework)
- NuGet 替代:
Install-Package System.Management (.NET Core / .NET 5+)
完整實作程式碼
using System;
using System.Management;
public static class HardwareInfo
{
///
/// 取得主機板序號
///
public static string GetMotherboardSerialNumber()
{
try
{
using (var searcher = new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_BaseBoard"))
{
foreach (ManagementObject mo in searcher.Get())
{
string serial = mo["SerialNumber"]?.ToString()?.Trim();
if (!string.IsNullOrEmpty(serial) && serial != "To be filled by O.E.M.")
return serial;
}
}
}
catch (Exception ex)
{
Console.WriteLine($"WMI 查詢失敗:{ex.Message}");
}
return "Unknown";
}
///
/// 列印主機板完整資訊
///
public static void PrintMotherboardInfo()
{
try
{
using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_BaseBoard"))
{
foreach (ManagementObject mo in searcher.Get())
{
Console.WriteLine("=== 主機板資訊 ===");
foreach (PropertyData prop in mo.Properties)
{
Console.WriteLine($"{prop.Name,-25}: {prop.Value}");
}
}
}
}
catch (Exception ex)
{
Console.WriteLine($"查詢失敗:{ex.Message}");
}
}
///
/// 通用 WMI 查詢輔助方法
///
public static string QueryWmi(string wql, string propertyName)
{
try
{
using (var searcher = new ManagementObjectSearcher(wql))
{
foreach (ManagementObject mo in searcher.Get())
{
return mo[propertyName]?.ToString()?.Trim();
}
}
}
catch { }
return null;
}
}
// 使用範例
class Program
{
static void Main()
{
Console.WriteLine("主機板序號:" + HardwareInfo.GetMotherboardSerialNumber());
Console.WriteLine();
HardwareInfo.PrintMotherboardInfo();
// 其他常用查詢
Console.WriteLine($"\nCPU ID:{HardwareInfo.QueryWmi("SELECT ProcessorId FROM Win32_Processor", "ProcessorId")}");
Console.WriteLine($"BIOS 版本:{HardwareInfo.QueryWmi("SELECT SMBIOSBIOSVersion FROM Win32_BIOS", "SMBIOSBIOSVersion")}");
Console.WriteLine($"磁碟序號:{HardwareInfo.QueryWmi("SELECT SerialNumber FROM Win32_DiskDrive", "SerialNumber")}");
Console.ReadKey();
}
}
常用 WMI 查詢類別速查表
| 硬體類別 | WMI Class | 常用屬性 |
| 主機板 | Win32_BaseBoard | SerialNumber, Manufacturer, Product, Version |
| 處理器 | Win32_Processor | ProcessorId, Name, MaxClockSpeed, NumberOfCores |
| BIOS | Win32_BIOS | SMBIOSBIOSVersion, Manufacturer, ReleaseDate |
| 實體記憶體 | Win32_PhysicalMemory | SerialNumber, Capacity, Speed, BankLabel |
| 磁碟機 | Win32_DiskDrive | SerialNumber, Model, Size, InterfaceType |
| 網路介面卡 | Win32_NetworkAdapter | MACAddress, Name, Speed, NetConnectionStatus |
| 作業系統 | Win32_OperatingSystem | Caption, Version, SerialNumber, InstallDate |
權限與相容性注意事項
- 管理員權限:部分 WMI 查詢需要提升權限,建議在 `app.manifest` 設定 ``。
- WMI 服務:目標電腦需啟用 "Windows Management Instrumentation" 服務。
- 防火牆:遠端查詢需開放 DCOM/RPC 埠 (135, 445 及動態高位埠)。
- .NET Core 跨平台:`System.Management` 僅支援 Windows。Linux 需讀取 `/sys/class/dmi/id/` 或使用 `dmidecode` 指令。
- 效能:WMI 查詢較慢 (百毫秒級),避免在熱路徑頻繁呼叫,建議快取結果。
進階:取得不重複機器碼 (結合多項硬體資訊)
public static string GetMachineFingerprint()
{
var parts = new[]
{
HardwareInfo.QueryWmi("SELECT ProcessorId FROM Win32_Processor", "ProcessorId"),
HardwareInfo.QueryWmi("SELECT SerialNumber FROM Win32_BaseBoard", "SerialNumber"),
HardwareInfo.QueryWmi("SELECT SerialNumber FROM Win32_BIOS", "SerialNumber"),
HardwareInfo.QueryWmi("SELECT SerialNumber FROM Win32_DiskDrive WHERE Index=0", "SerialNumber")
};
string combined = string.Join("|", parts.Where(p => !string.IsNullOrEmpty(p)));
return combined.GetHashCode().ToString("X8"); // 簡單雜湊為 8 碼十六進位
}