.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 获取的序列号是一致的。