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

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

C#怎么获取电脑的BIOS序列号?如何通过WMI读取主板ID?

实现前的准备

使用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

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