在軟體授權、資產管理或硬體綁定場景中,常需要讀取電腦的唯一硬體識別碼。C# 透過 System.Management 命名空間的 WMI(Windows Management Instrumentation)查詢,可輕鬆取得 CPU 處理器 ID、硬碟型號/序號、網卡 MAC 位址等資訊。本文提供完整可用的程式碼範例。
專案需加入 System.Management.dll 參考,並引用命名空間:
using System.Management;
public string GetCpuId()
{
string cpuId = string.Empty;
using (var searcher = new ManagementObjectSearcher("SELECT ProcessorId FROM Win32_Processor"))
{
foreach (ManagementObject obj in searcher.Get())
{
cpuId = obj["ProcessorId"]?.ToString() ?? string.Empty;
break; // 通常只取第一顆實體 CPU
}
}
return cpuId;
}
public string GetDiskId()
{
string diskId = string.Empty;
using (var searcher = new ManagementObjectSearcher("SELECT Model, SerialNumber FROM Win32_DiskDrive"))
{
foreach (ManagementObject obj in searcher.Get())
{
// 組合型號與序號作為唯一識別
string model = obj["Model"]?.ToString()?.Trim() ?? string.Empty;
string serial = obj["SerialNumber"]?.ToString()?.Trim() ?? string.Empty;
diskId = $"{model}_{serial}";
break; // 取第一顆實體硬碟
}
}
return diskId;
}
public string GetMacAddress()
{
string mac = string.Empty;
using (var searcher = new ManagementObjectSearcher("SELECT MACAddress FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = TRUE"))
{
foreach (ManagementObject obj in searcher.Get())
{
mac = obj["MACAddress"]?.ToString()?.Replace(":", "") ?? string.Empty;
if (!string.IsNullOrEmpty(mac))
break; // 取第一張啟用 IP 的網卡
}
}
return mac;
}
public void DisplayHardwareInfo()
{
Console.WriteLine($"CPU ID: {GetCpuId()}");
Console.WriteLine($"Disk ID: {GetDiskId()}");
Console.WriteLine($"MAC Address: {GetMacAddress()}");
}
透過 System.Management 與 WMI 查詢,C# 可輕鬆存取底層硬體識別資訊。本文提供的方法可直接整合至授權驗證、資產掃描等系統中,並建議搭配快取與權限處理以提升穩定度。