📅  最后修改于: 2023-12-03 14:59:40.076000             🧑  作者: Mango
当需要进行软件授权等操作时,经常需要获取计算机的硬件信息,然后根据这些信息生成硬件ID。 而在C#中,可以通过System.Management命名空间中的ManagementClass和 ManagementObject来获取计算机的硬件信息。
首先需要引用System.Management命名空间。
using System.Management;
创建ManagementClass对象,指定需要查询的WMI路径,并通过ManagementClass的GetInstances方法获取所有系统实例。
ManagementClass mc = new ManagementClass("win32_processor");
ManagementObjectCollection moc = mc.GetInstances();
遍历ManagementObjectCollection对象,获取处理器ID信息并存储到StringBuilder对象中。
StringBuilder sb = new StringBuilder();
foreach (ManagementObject mo in moc)
{
sb.Append(mo.Properties["ProcessorId"].Value.ToString());
}
如果需要获取其他硬件信息,只需要修改ManagementClass对象的WMI路径即可。比如获取硬盘序列号可以使用以下代码:
ManagementClass mc = new ManagementClass("win32_DiskDrive");
ManagementObjectCollection moc = mc.GetInstances();
StringBuilder sb = new StringBuilder();
foreach (ManagementObject mo in moc)
{
sb.Append(mo.Properties["SerialNumber"].Value.ToString());
}
最后,可以将StringBuilder对象的值通过MD5或SHA1等加密算法进行加密,得到计算机的硬件ID。
using System.Management;
using System.Security.Cryptography;
using System.Text;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
string hardwareId = GetHardwareId("win32_processor", "ProcessorId");
Console.WriteLine(hardwareId);
}
public static string GetHardwareId(string wmiPath, string propertyName)
{
ManagementClass mc = new ManagementClass(wmiPath);
ManagementObjectCollection moc = mc.GetInstances();
StringBuilder sb = new StringBuilder();
foreach (ManagementObject mo in moc)
{
sb.Append(mo.Properties[propertyName].Value.ToString());
}
string hardwareId = GetSha1(sb.ToString());
return hardwareId;
}
public static string GetSha1(string input)
{
using (SHA1Managed sha1 = new SHA1Managed())
{
byte[] hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(input));
StringBuilder sb = new StringBuilder();
foreach (byte b in hash)
{
sb.Append(b.ToString("X2"));
}
return sb.ToString();
}
}
}
}
上述代码实现了获取处理器ID并进行SHA1加密的功能。可以根据实际需求修改wmiPath和propertyName,获取其他硬件信息。