做个计算器--获取硬件信息

本篇文章将告诉大家如何获取 CPU 序列号、主板序列和 BIOS 编号。


零、怎么获取硬件信息

在 .NET 中要获取计算机硬件信息,就必须使用 System.Management ,它是 .NET 框架中 WIM 的命名空间,所有硬件信息就是从这里获取到的。获取硬件信息的方法如下:


  1. 引用 System.Management ;
  2. 实例化 ManagenmentClass 类,并传入要绑定的 WMI 类。该类表示 WMI 中的一个 CIM 管理类。 CIM 类表示包括硬件、软件、进程等在内的管理信息;
  3. 获取 WMI 信息集合;
  4. 搜索对应的实例,遍历集合获取指定的内容;
  5. 获取到指定内容后跳出循环。

一、代码实现

下面我们通过代码的形式实现上一小节所描述的内容。

在 Method 文件夹下创建 HardwareInformation 类

using System;
using System.Collections.Generic;
using System.Linq;
//引用 System.Management
using System.Management;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Calculator.Method
{
    public class HardwareInformation
    {
        public static string Get(string path)
        {
            try
            {
                string propertyName = "";
                switch (path)
                {
                    //cpu 序列号
                    case "Win32_Processor":
                        propertyName = "ProcessorId";
                        break;
                    //主板序列号
                    case "Win32_BaseBoard":
                    //BIOS 编号
                    case "Win32_BIOS":
                    //硬盘序列号
                    case "Win32_PhysiclMedia":
                    case "Win32_DiskDrive":
                        propertyName = "SerialNumber";
                        break;
                    default:
                        break;
                }
                //实例化 ManagenmentClass 类,并传入要绑定的 WMI 类
                ManagementClass mc = new ManagementClass(path);
                //获取 WMI 信息集合
                ManagementObjectCollection moc = mc.GetInstances();
                string hi = null;
                //搜索对应的实例,遍历集合获取指定的内容
                foreach (ManagementObject mo in moc)
                {
                    //获取到指定内容后跳出循环
                    hi = mo.Properties[propertyName].Value.ToString();
                    break;
                }
                return hi.Trim();
            }
            catch(Exception e)
            {
                MessageBox.Show($"Error:获取硬件信息失败,{e.Message}");
                return "";
            }
        }
    }
}

在代码中我们看到获取硬盘序列号时 Win32_PhysicalMedia Win32_DiskDrive 都可以获取到,那么它俩有什么区别呢? Win32_DiskDrive 返回硬盘驱动器信息,这个信息是磁盘的物理信息,比如簇大小、总大小、块大小、PNPID之类,而

Win32_PhysicalMedia 返回当前计算机上的物理媒体信息,因为是返回“物理媒体”信息,所以它的通用性较高,返回的信息也比较抽象化。在实际开发中建议使用 Win32_PhysiclMedia 来获取硬件信息


编写完上面的代码后,我们在 Registered 窗体的 Load 方法中编写如下代码:

private void Registered_Load(object sender, EventArgs e)
        {
            //获取硬件信息
            string cpu = HardwareInformation.Get("Win32_Processor");
            string baseBoard = HardwareInformation.Get("Win32_BaseBoard");
            string bois = HardwareInformation.Get("Win32_BIOS");
            string diskDrive = HardwareInformation.Get("Win32_PhysiclMedia");
            //生成机器码
            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
            string inf = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(cpu  + baseBoard + bois + diskDrive)), 4, 8);
            MachineCode_TextBox.Text = inf;
        }

运行代码,注册窗体将显示生成的机器码

做个计算器--获取硬件信息

二、总结

本篇文章讲解了 CPU 序列号、主板序列和 BIOS 编号的获取方法和思路,并通过代码进行实现。


Tip:因为本专题是针对具有开发经验的人员所编写,并且本专题主要讲解软件防破解,因此本文对于获取硬件相关的代码不在进行详细讲解。


Tip:本节代码下载,https://gitee.com/miaoshu_studio/calculator.git 拉取时选择 HardwareInformation 分支


上一篇:详谈10G XFP万兆光模块有哪些类型?


下一篇:透过思科华为看(通信)世界