.NET 8 获取CPU序列号和主板序列号异常问题

一般情况下我们会使用:

获取磁盘序列号:

try

{

System.Management.ManagementObjectSearcher cmicWmi = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");

System.UInt32 tmpUint32 = 0;

foreach(ManagementObject cmicWmiObj in cmicWmi.Get())

{

tmpUint32 = Convert.ToUInt32(cmicWmiObj"signature".ToString());

}

this.textBox1.Text = tmpUint32.ToString();

this.gProgressBar1.Value ++;

}

catch(Exception ex1)

{

throw new Exception(ex1.ToString());

}

获取CPU序列号:

try

{

System.Management.ManagementObjectSearcher Wmi = new ManagementObjectSearcher("SELECT * FROM Win32_Processor");

string tmpUint32_1 = string.Empty;

foreach(ManagementObject WmiObj in Wmi.Get())

{

tmpUint32_1 =WmiObj"ProcessorId".ToString();

}

this.textBox2.Text = tmpUint32_1;

this.gProgressBar1.Value ++;

}

catch(Exception ex2)

{

throw new Exception(ex2.ToString());

}

如上图代码,可能会在 winserver 2016 2019 2012r2 某些系统上报错,其错误信息为:

System.TypeInitializationException: The type initializer for 'System.Management.ManagementPath' threw an exception. ---> System.PlatformNotSupportedException: The native library 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\wminet_utils.dll' does not have all required functions. Please, update the .NET Framework.

因为在windows 平台上使用这段代码,其实是依赖了.NET FrameWork 相关的,为防止错误异常情况,微软有新的库对访问硬件信息的支持,

可在nuget 使用 Microsoft.Management.Infrastructure

其通过.NET8获取cpu序列号和主板序列号代码如下:

#region 获取处理器序列号

public static string cpuinfo()

{

// 查询 WMI 类

string namespaceName = @"root\cimv2";

string query = "SELECT * FROM Win32_BaseBoard";

CimSession session = CimSession.Create(null);

IEnumerable<CimInstance> result = session.QueryInstances(namespaceName, "WQL", query);

string boardSerialNumber = string.Empty;

foreach (CimInstance instance in result)

{

boardSerialNumber = instance.CimInstanceProperties"SerialNumber".Value.ToString();

}

return boardSerialNumber;

}

#endregion

#region 获取主板序列号

public static string biosinfo()

{

string namespaceName = @"root\cimv2";

string query = "SELECT * FROM Win32_Processor";

CimSession session = CimSession.Create(null);

IEnumerable<CimInstance> result = session.QueryInstances(namespaceName, "WQL", query);

string BiosSerialNumber = string.Empty;

foreach(CimInstance instance in result)

{

BiosSerialNumber = instance.CimInstanceProperties"ProcessorId".Value.ToString();

}

return BiosSerialNumber;

}

#endregion

上块代码经过实测和 .NET framework 获取的序列号是一致的。

相关推荐
CoderYanger3 小时前
Java EE 进阶:8.MyBatis 操作数据库(入门)(第二弹)
java·数据库·spring boot·spring·面试·java-ee·mybatis
CQU_JIAKE6 小时前
11.7[高体】
java·后端·spring
apcipot_rain6 小时前
C++转Java日记(04)
java·开发语言·c++
特立独行的猫A7 小时前
我给女儿写了个打字练习:一边敲键盘,一边把小学英语单词记牢
java·后端·python
憧憬成为java架构高手的小白9 小时前
LangGraph4j 实战(下)
java
天诰9 小时前
SA-K-11 检索会消失吗与四个未解问题
java·服务器·人工智能·python·机器学习·ai编程
陈希12311 小时前
Linux 防火墙配置实战:firewalld、iptables 与云安全组
linux·运维·服务器
女神下凡11 小时前
芯参谋(95):嵌入式文件系统_开发指南
linux·服务器·arm开发·驱动开发·设计规范
@兽血沸腾12 小时前
Windows系统安装Jenkins部署应用至远程Windows服务器操作指南
运维·服务器·jenkins
这个昵称不容易13 小时前
SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在
java·springboot·毕设