首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 取得主機板序號:使用 WMI 查詢 Win32_BaseBoard 完整範例

     編輯:關於C#

前言

在軟體授權綁定、硬體資產管理或裝置識別等情境中,取得主機板 (Motherboard) 的唯一序號是常見需求。C# 透過 System.Management 命名空間存取 WMI,即可輕鬆查詢 Win32_BaseBoard 類別取得主機板序號。本文提供完整可執行的程式碼範例。

前置準備

  1. 在專案中加入 System.Management.dll 參考 (右鍵專案 → 加入參考 → .NET 組件 → System.Management)
  2. 在程式碼頂端引入命名空間: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;
}

程式碼解析

1. SelectQuery

定義 WQL (WMI Query Language) 查詢語句。Win32_BaseBoard 類別包含主機板的製造商、型號、序號、版本等資訊。

2. ManagementObjectSearcher

執行查詢並回傳符合條件的管理物件集合。

3. ManagementObjectCollection

查詢結果集合,透過 foreach 迴圈逐一檢視每個管理物件。

4. 索引子存取屬性

mo["SerialNumber"] 直接存取屬性值,比 GetPropertyValue() 更簡潔。

Win32_BaseBoard 常用屬性對照表

屬性名稱說明範例值
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;
}

常見問題與注意事項

  • 虛擬機器環境:在 VMware、Hyper-V、VirtualBox 等虛擬機中,序號可能為固定值 (如 "0") 或空白,無法作為唯一識別依據
  • 權限需求:查詢 WMI 需要本機管理員權限或至少具備 WMI 讀取權限
  • 效能考量:WMI 查詢相對較慢 (約 100-500ms),避免在 UI 執行緒頻繁呼叫,建議使用 Task.Run 非同步執行
  • 替代方案:若需更穩定的硬體識別碼,可考慮結合 CPU ID (Win32_Processor.ProcessorId)、BIOS 序號 (Win32_BIOS.SerialNumber)、硬碟序號 (Win32_DiskDrive.SerialNumber) 組合成複合指紋

總結

透過 WMI 的 Win32_BaseBoard 類別,C# 可以輕鬆取得主機板序號與相關資訊。只需加入 System.Management 參考,幾行程式碼即可完成查詢。實務應用時建議加入例外處理、非同步執行與多重硬體識別碼組合,以提升穩定性與唯一性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved