透過 WMI (System.Management) 與 Win32 API (kernel32.dll) 取得電腦唯一識別資訊,常用於軟體授權綁定、資產管理。
HardInfoClass info = new HardInfoClass();
txtCpuId.Text = info.GetCpuID();
txtDiskId.Text = info.GetHardDiskID();
txtMac.Text = info.GetNetCardMac();
txtIp.Text = info.GetNetCardIP();
txtHostName.Text = info.GetHostName();
txtVolD.Text = info.GetVolOf("D"); // 磁碟機序號
using System;
using System.Management;
using System.Net;
using System.Runtime.InteropServices;
public class HardInfoClass
{
// 取得 CPU ID
public string GetCpuID()
{
try
{
using (ManagementClass mc = new ManagementClass("Win32_Processor"))
using (ManagementObjectCollection moc = mc.GetInstances())
{
foreach (ManagementObject mo in moc)
return mo.Properties["ProcessorId"].Value?.ToString() ?? "";
}
}
catch { return ""; }
return "";
}
// 取得第一顆實體硬碟序號
public string GetHardDiskID()
{
try
{
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia"))
{
foreach (ManagementObject mo in searcher.Get())
return mo["SerialNumber"]?.ToString().Trim() ?? "";
}
}
catch { return ""; }
return "";
}
// 取得啟用網卡的 MAC 位址
public string GetNetCardMac()
{
try
{
using (ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"))
using (ManagementObjectCollection moc = mc.GetInstances())
{
foreach (ManagementObject mo in moc)
{
if ((bool)mo["IPEnabled"])
return mo["MacAddress"]?.ToString() ?? "";
}
}
}
catch { return ""; }
return "";
}
// 取得啟用網卡的第一個 IPv4 位址
public string GetNetCardIP()
{
try
{
using (ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"))
using (ManagementObjectCollection moc = mc.GetInstances())
{
foreach (ManagementObject mo in moc)
{
if ((bool)mo["IPEnabled"])
{
string[] ips = (string[])mo["IPAddress"];
if (ips.Length > 0) return ips[0];
}
}
}
}
catch { return ""; }
return "";
}
// 取得主機名稱
public string GetHostName() => Dns.GetHostName();
// 取得磁碟機序號 (Win32 API)
[DllImport("kernel32.dll")]
private static extern int GetVolumeInformation(
string lpRootPathName, string lpVolumeNameBuffer, int nVolumeNameSize,
ref int lpVolumeSerialNumber, int lpMaximumComponentLength,
int lpFileSystemFlags, string lpFileSystemNameBuffer, int nFileSystemNameSize);
public string GetVolOf(string driveLetter)
{
try
{
int serial = 0;
GetVolumeInformation(driveLetter + @":\", null, 0, ref serial, 0, 0, null, 0);
return serial.ToString("X"); // 16 進位顯示
}
catch { return ""; }
}
}
System.Management.dll。
應用場景: 軟體授權綁定、硬體資產掃描、裝置指紋辨識。