在軟體授權綁定、硬體資產管理或裝置識別等情境中,取得主機板 (Motherboard) 的唯一序號是常見需求。C# 透過 System.Management 命名空間存取 WMI,即可輕鬆查詢 Win32_BaseBoard 類別取得主機板序號。本文提供完整可執行的程式碼範例。
System.Management.dll 參考 (右鍵專案 → 加入參考 → .NET 組件 → System.Management)using System.Management;using System;
using System.Management;
using System.Windows.Forms;
public class MotherboardInfo
{
///
/// 取得主機板序號
///
/// 主機板序號字串,若查詢失敗回傳空字串
public static string GetMotherboardSerialNumber()
{
try
{
// 建立 WMI 查詢:選取 Win32_BaseBoard 所有屬性
SelectQuery query = new SelectQuery("SELECT * FROM Win32_BaseBoard");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection collection = searcher.Get();
// 通常只有一個主機板,取第一筆即可
foreach (ManagementObject mo in collection)
{
// SerialNumber 為主機板序號屬性
object serial = mo["SerialNumber"];
if (serial != null)
{
return serial.ToString().Trim();
}
}
}
catch (Exception ex)
{
// 實務上建議記錄日誌而非直接顯示
MessageBox.Show("查詢主機板序號失敗:" + ex.Message);
}
return string.Empty;
}
}
// 使用範例 (按鈕點擊事件)
private void btnGetSerial_Click(object sender, EventArgs e)
{
string serial = MotherboardInfo.GetMotherboardSerialNumber();
txtSerialNumber.Text = serial;
}
定義 WQL (WMI Query Language) 查詢語句。Win32_BaseBoard 類別包含主機板的製造商、型號、序號、版本等資訊。
執行查詢並回傳符合條件的管理物件集合。
查詢結果集合,透過 foreach 迴圈逐一檢視每個管理物件。
mo["SerialNumber"] 直接存取屬性值,比 GetPropertyValue() 更簡潔。
| 屬性名稱 | 說明 | 範例值 |
|---|---|---|
| SerialNumber | 主機板序號 (唯一識別碼) | 1234567890ABCDEF |
| Manufacturer | 製造商 | ASUSTeK COMPUTER INC. |
| Product | 產品型號 | PRIME Z690-A |
| Version | 版本/修訂號 | Rev 1.xx |
| PartNumber | 零件號 | 90-MXxxxxxx |
public static Dictionary<string, string> GetFullMotherboardInfo()
{
var info = new Dictionary<string, string>();
string[] properties = { "SerialNumber", "Manufacturer", "Product", "Version", "PartNumber" };
try
{
SelectQuery query = new SelectQuery("SELECT * FROM Win32_BaseBoard");
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query))
{
foreach (ManagementObject mo in searcher.Get())
{
foreach (string prop in properties)
{
info[prop] = mo[prop]?.ToString() ?? "N/A";
}
break; // 只取第一張主機板
}
}
}
catch (Exception ex)
{
// 處理例外
}
return info;
}
Task.Run 非同步執行Win32_Processor.ProcessorId)、BIOS 序號 (Win32_BIOS.SerialNumber)、硬碟序號 (Win32_DiskDrive.SerialNumber) 組合成複合指紋透過 WMI 的 Win32_BaseBoard 類別,C# 可以輕鬆取得主機板序號與相關資訊。只需加入 System.Management 參考,幾行程式碼即可完成查詢。實務應用時建議加入例外處理、非同步執行與多重硬體識別碼組合,以提升穩定性與唯一性。