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

C# 透過 WMI 取得主機板序號與硬體資訊完整教學

     編輯:關於C#

核心命名空間與參考

  • 命名空間: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_BaseBoardSerialNumber, Manufacturer, Product, Version
處理器Win32_ProcessorProcessorId, Name, MaxClockSpeed, NumberOfCores
BIOSWin32_BIOSSMBIOSBIOSVersion, Manufacturer, ReleaseDate
實體記憶體Win32_PhysicalMemorySerialNumber, Capacity, Speed, BankLabel
磁碟機Win32_DiskDriveSerialNumber, Model, Size, InterfaceType
網路介面卡Win32_NetworkAdapterMACAddress, Name, Speed, NetConnectionStatus
作業系統Win32_OperatingSystemCaption, Version, SerialNumber, InstallDate

權限與相容性注意事項

  1. 管理員權限:部分 WMI 查詢需要提升權限,建議在 `app.manifest` 設定 ``。
  2. WMI 服務:目標電腦需啟用 "Windows Management Instrumentation" 服務。
  3. 防火牆:遠端查詢需開放 DCOM/RPC 埠 (135, 445 及動態高位埠)。
  4. .NET Core 跨平台:`System.Management` 僅支援 Windows。Linux 需讀取 `/sys/class/dmi/id/` 或使用 `dmidecode` 指令。
  5. 效能: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 碼十六進位
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved