在C#开发中,获取电脑的BIOS序列号和主板ID是常见的硬件信息采集需求,这类信息通常用于软件授权校验、设备唯一性识别等场景,通过WMI(Windows Management Instrumentation)可以高效实现这类信息的查询。

实现前的准备
使用WMI查询硬件信息需要引用System.Management命名空间,该命名空间提供了访问WMI基础设施的类。如果是.NET Framework项目,默认已经包含该命名空间的引用,如果是.NET Core或.NET 5及以上项目,需要手动安装System.Management NuGet包。
获取BIOS序列号
BIOS序列号存储在Win32_BIOS类的SerialNumber属性中,我们可以通过WMI查询该类实例来获取对应的值。
实现代码
using System;
using System.Management;
namespace HardwareInfoDemo
{
class Program
{
static void Main(string[] args)
{
string biosSerialNumber = GetBiosSerialNumber();
Console.WriteLine($"BIOS序列号:{biosSerialNumber}");
}
/// <summary>
/// 获取BIOS序列号
/// </summary>
/// <returns>BIOS序列号字符串,获取失败返回空</returns>
static string GetBiosSerialNumber()
{
try
{
// 创建WMI查询对象,查询Win32_BIOS类
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_BIOS");
// 遍历查询结果
foreach (ManagementObject obj in searcher.Get())
{
// 返回SerialNumber属性的值
return obj["SerialNumber"]?.ToString();
}
}
catch (Exception ex)
{
Console.WriteLine($"获取BIOS序列号失败:{ex.Message}");
}
return string.Empty;
}
}
}
通过WMI读取主板ID
主板ID通常对应Win32_BaseBoard类的SerialNumber属性,部分设备的主板唯一标识也可能存储在Product属性中,我们可以同时查询这两个属性来适配更多设备。
实现代码
using System;
using System.Management;
namespace HardwareInfoDemo
{
class Program
{
static void Main(string[] args)
{
string baseBoardId = GetBaseBoardId();
Console.WriteLine($"主板ID:{baseBoardId}");
}
/// <summary>
/// 获取主板ID
/// </summary>
/// <returns>主板ID字符串,获取失败返回空</returns>
static string GetBaseBoardId()
{
try
{
// 查询Win32_BaseBoard类的SerialNumber和Product属性
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT SerialNumber, Product FROM Win32_BaseBoard");
foreach (ManagementObject obj in searcher.Get())
{
// 优先返回SerialNumber,为空则返回Product
string serialNumber = obj["SerialNumber"]?.ToString();
if (!string.IsNullOrEmpty(serialNumber))
{
return serialNumber;
}
return obj["Product"]?.ToString();
}
}
catch (Exception ex)
{
Console.WriteLine($"获取主板ID失败:{ex.Message}");
}
return string.Empty;
}
}
}
注意事项
- 部分设备的BIOS序列号或主板ID可能为空,或者返回默认值,这种情况下需要结合其他硬件信息做补充校验。
- 运行程序时需要保证有足够的系统权限,部分精简版系统可能会禁用WMI服务,需要先开启WMI服务才能正常查询。
- 不同厂商的主板对WMI属性的支持程度不同,实际使用时建议先测试目标设备的返回结果是否符合预期。
完整整合示例
如果需要同时获取BIOS序列号和主板ID,可以将两个方法整合到同一个类中,方便统一调用。
using System;
using System.Management;
namespace HardwareInfoDemo
{
public class HardwareInfoHelper
{
/// <summary>
/// 获取BIOS序列号
/// </summary>
public static string GetBiosSerialNumber()
{
try
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_BIOS");
foreach (ManagementObject obj in searcher.Get())
{
return obj["SerialNumber"]?.ToString();
}
}
catch (Exception ex)
{
Console.WriteLine($"获取BIOS序列号异常:{ex.Message}");
}
return string.Empty;
}
/// <summary>
/// 获取主板ID
/// </summary>
public static string GetBaseBoardId()
{
try
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT SerialNumber, Product FROM Win32_BaseBoard");
foreach (ManagementObject obj in searcher.Get())
{
string serialNumber = obj["SerialNumber"]?.ToString();
if (!string.IsNullOrEmpty(serialNumber))
{
return serialNumber;
}
return obj["Product"]?.ToString();
}
}
catch (Exception ex)
{
Console.WriteLine($"获取主板ID异常:{ex.Message}");
}
return string.Empty;
}
}
}
调用时只需要直接使用HardwareInfoHelper.GetBiosSerialNumber()和HardwareInfoHelper.GetBaseBoardId()即可获取对应的硬件信息,代码复用性更高。
C#WMIBIOS序列号主板IDSystem_Management修改时间:2026-06-14 23:57:25