using System.Management;
using System.Security.Cryptography;
using System.Text;
using MasstransferCommon.Utils;
namespace MasstransferSecurity.Utils;
///
/// 设备信息工具类方法
///
public sealed class DeviceInfoUtil
{
private const string KeyPath = @"Software\Masstransfer\Device";
public static string GenerateUniqueID()
{
var cpuId = GetCpuId();
var motherboardId = GetMotherboardId();
var diskDriveId = GetDiskDriveId();
var macAddress = GetMacAddress();
var deviceId = $"{cpuId}-{motherboardId}-{diskDriveId}-{macAddress}";
return ComputeSha256Hash(deviceId);
}
private static string GetCpuId()
{
var cpuId = string.Empty;
var searcher = new ManagementObjectSearcher("SELECT ProcessorId FROM Win32_Processor");
foreach (var item in searcher.Get())
{
cpuId = item["ProcessorId"].ToString();
break;
}
return cpuId;
}
private static string GetMotherboardId()
{
var motherboardId = string.Empty;
var searcher = new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_BaseBoard");
foreach (var item in searcher.Get())
{
motherboardId = item["SerialNumber"].ToString();
break;
}
return motherboardId;
}
private static string GetDiskDriveId()
{
string diskDriveId = string.Empty;
var searcher = new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_DiskDrive");
foreach (var item in searcher.Get())
{
diskDriveId = item["SerialNumber"].ToString();
break;
}
return diskDriveId;
}
private static string GetMacAddress()
{
string macAddress = string.Empty;
var searcher = new ManagementObjectSearcher(
"SELECT MACAddress FROM Win32_NetworkAdapter WHERE MACAddress IS NOT NULL AND NOT (MACAddress LIKE '')");
foreach (var item in searcher.Get())
{
macAddress = item["MACAddress"].ToString();
break;
}
return macAddress.Replace(":", string.Empty);
}
private static string ComputeSha256Hash(string rawData)
{
using SHA256 sha256Hash = SHA256.Create();
var bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(rawData));
var builder = new StringBuilder();
foreach (var t in bytes)
{
builder.Append(t.ToString("x2"));
}
return builder.ToString();
}
///
/// 获取设备的序列号
///
///
public static string GetDeviceSN()
{
return (string)RegistryHelper.ReadValue(KeyPath, "SerialNumber");
}
}