导读:本期聚焦于小伙伴创作的《C#怎么获取主板序列号?如何通过WMI读取底层硬件ID》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#怎么获取主板序列号?如何通过WMI读取底层硬件ID》有用,将其分享出去将是对创作者最好的鼓励。

在C#开发过程中,获取主板序列号这类底层硬件信息常用于软件授权绑定、设备资产管理等场景,WMI(Windows Management Instrumentation)是Windows系统内置的管理框架,提供了统一的接口来查询硬件、系统等各类信息,是实现该需求的高效方式。

C#怎么获取主板序列号?如何通过WMI读取底层硬件ID

WMI基础概念

WMI是Windows系统提供的管理技术,允许应用程序查询和监控系统的配置、状态等信息,它基于通用信息模型(CIM)标准,将系统资源抽象为可查询的对象。在C#中,我们可以通过System.Management命名空间下的类来调用WMI接口,实现硬件信息的读取。

获取主板序列号的实现步骤

1. 添加命名空间引用

首先需要引入System.Management命名空间,该命名空间包含了WMI查询相关的核心类,如果项目默认没有引用对应的程序集,需要手动添加引用。

using System;
using System.Management; // 引入WMI相关命名空间

2. 编写查询主板序列号的代码

主板的相关信息存储在WMI的Win32_BaseBoard类中,其中SerialNumber属性就是我们需要的主板序列号,通过ManagementObjectSearcher类执行WMI查询即可获取对应信息。

public string GetMainBoardSerialNumber()
{
    string serialNumber = "";
    try
    {
        // 创建WMI查询,查询Win32_BaseBoard类的所有实例
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_BaseBoard");
        // 遍历查询结果
        foreach (ManagementObject obj in searcher.Get())
        {
            // 获取SerialNumber属性的值
            serialNumber = obj["SerialNumber"]?.ToString();
            break; // 通常只有一个主板实例,获取后跳出循环
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("获取主板序列号失败:" + ex.Message);
    }
    return serialNumber;
}

3. 代码调用示例

在控制台程序中调用上述方法,即可输出主板序列号:

class Program
{
    static void Main(string[] args)
    {
        Program p = new Program();
        string mainBoardSerial = p.GetMainBoardSerialNumber();
        Console.WriteLine("主板序列号为:" + mainBoardSerial);
        Console.ReadLine();
    }

    public string GetMainBoardSerialNumber()
    {
        string serialNumber = "";
        try
        {
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_BaseBoard");
            foreach (ManagementObject obj in searcher.Get())
            {
                serialNumber = obj["SerialNumber"]?.ToString();
                break;
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("获取主板序列号失败:" + ex.Message);
        }
        return serialNumber;
    }
}

通过WMI读取其他底层硬件ID

除了主板序列号,我们还可以通过WMI读取其他硬件的ID信息,不同的硬件对应不同的WMI类,以下是常见硬件的查询类和属性对照表:

硬件类型WMI类对应ID属性
CPUWin32_ProcessorProcessorId
硬盘Win32_DiskDriveSerialNumber
网卡Win32_NetworkAdapterMACAddress
BIOSWin32_BIOSSerialNumber

读取CPU ID示例

以下是读取CPU ID的代码示例,逻辑和获取主板序列号类似,只是查询的WMI类和属性不同:

public string GetCpuId()
{
    string cpuId = "";
    try
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT ProcessorId FROM Win32_Processor");
        foreach (ManagementObject obj in searcher.Get())
        {
            cpuId = obj["ProcessorId"]?.ToString();
            break;
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("获取CPU ID失败:" + ex.Message);
    }
    return cpuId;
}

注意事项

  • WMI查询需要程序具有对应的系统权限,部分场景下可能需要以管理员身份运行程序才能正常获取信息。
  • 不同厂商的主板可能会存在序列号为空或者返回默认值的情况,实际使用中需要做好异常处理。
  • 频繁调用WMI查询可能会影响程序性能,建议将获取到的硬件信息缓存起来,避免重复查询。
  • 如果是在.NET Core或者.NET 5及以上版本中使用,需要安装System.Management NuGet包,因为该命名空间不再默认包含在框架中。

常见问题解答

为什么获取到的主板序列号是空的?

可能是主板厂商没有在BIOS中写入序列号,或者当前程序没有足够的权限访问WMI信息,可以尝试以管理员身份运行程序,或者检查主板的BIOS设置。

WMI查询会不会有兼容性问题?

WMI是Windows系统原生支持的功能,在Windows XP及以上版本的系统中都可以使用,但是在非Windows系统中无法使用,如果需要跨平台获取硬件信息,需要采用其他对应平台的实现方案。

C#WMI主板序列号硬件ID修改时间:2026-07-03 18:06:28

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。