📜  c# get hwid - C# (1)

📅  最后修改于: 2023-12-03 14:59:40.076000             🧑  作者: Mango

使用C#获取硬件ID

当需要进行软件授权等操作时,经常需要获取计算机的硬件信息,然后根据这些信息生成硬件ID。 而在C#中,可以通过System.Management命名空间中的ManagementClass和 ManagementObject来获取计算机的硬件信息。

步骤
  1. 首先需要引用System.Management命名空间。

    using System.Management;
    
  2. 创建ManagementClass对象,指定需要查询的WMI路径,并通过ManagementClass的GetInstances方法获取所有系统实例。

    ManagementClass mc = new ManagementClass("win32_processor");
    ManagementObjectCollection moc = mc.GetInstances();
    
  3. 遍历ManagementObjectCollection对象,获取处理器ID信息并存储到StringBuilder对象中。

    StringBuilder sb = new StringBuilder();
    foreach (ManagementObject mo in moc)
    {
        sb.Append(mo.Properties["ProcessorId"].Value.ToString());
    }
    
  4. 如果需要获取其他硬件信息,只需要修改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());
    }
    
  5. 最后,可以将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,获取其他硬件信息。