本篇文章将告诉大家如何获取 CPU 序列号、主板序列和 BIOS 编号。
零、怎么获取硬件信息
在 .NET 中要获取计算机硬件信息,就必须使用 System.Management ,它是 .NET 框架中 WIM 的命名空间,所有硬件信息就是从这里获取到的。获取硬件信息的方法如下:
- 引用 System.Management ;
- 实例化 ManagenmentClass 类,并传入要绑定的 WMI 类。该类表示 WMI 中的一个 CIM 管理类。 CIM 类表示包括硬件、软件、进程等在内的管理信息;
- 获取 WMI 信息集合;
- 搜索对应的实例,遍历集合获取指定的内容;
- 获取到指定内容后跳出循环。
一、代码实现
下面我们通过代码的形式实现上一小节所描述的内容。
在 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 分支