Как быстро получить Hardware-ID в C#?

Мне нужно в моей программе привязать лицензию к идентификатору оборудования. Я попытался использовать WMI, но он все еще медленный.

Мне нужна, например, информация о CPU, HDD и материнской плате.

4 ответов


для получения более подробной информации см. этой ссылке

следующий код даст вам идентификатор процессора:

требуемое пространство имен System.Management

var mbs = new ManagementObjectSearcher("Select ProcessorId From Win32_processor");
ManagementObjectCollection mbsList = mbs.Get();
string id = "";
foreach (ManagementObject mo in mbsList)
{
    id = mo["ProcessorId"].ToString();
    break;
}

для жесткого диска ID и материнской платы ID подробности см. это ссылка

чтобы ускорить эту процедуру, убедитесь, что вы не используете SELECT *, но только выберите то, что вам действительно нужно. Использовать SELECT * только во время разработки, когда вы пытаетесь выяснить, что нужно использовать, потому что тогда запрос будет взять много больше времени.


Я вот ищу то же самое, и я нашел другое решение. Если вы, ребята, заинтересованы, я разделяю этот класс:

using System;
using System.Management;
using System.Security.Cryptography;
using System.Security;
using System.Collections;
using System.Text;
namespace Security
{
    /// <summary>
    /// Generates a 16 byte Unique Identification code of a computer
    /// Example: 4876-8DB5-EE85-69D3-FE52-8CF7-395D-2EA9
    /// </summary>
    public class FingerPrint  
    {
        private static string fingerPrint = string.Empty;
        public static string Value()
        {
            if (string.IsNullOrEmpty(fingerPrint))
            {
                fingerPrint = GetHash("CPU >> " + cpuId() + "\nBIOS >> " + 
            biosId() + "\nBASE >> " + baseId()
                            //+"\nDISK >> "+ diskId() + "\nVIDEO >> " + 
            videoId() +"\nMAC >> "+ macId()
                                     );
            }
            return fingerPrint;
        }
        private static string GetHash(string s)
        {
            MD5 sec = new MD5CryptoServiceProvider();
            ASCIIEncoding enc = new ASCIIEncoding();
            byte[] bt = enc.GetBytes(s);
            return GetHexString(sec.ComputeHash(bt));
        }
        private static string GetHexString(byte[] bt)
        {
            string s = string.Empty;
            for (int i = 0; i < bt.Length; i++)
            {
                byte b = bt[i];
                int n, n1, n2;
                n = (int)b;
                n1 = n & 15;
                n2 = (n >> 4) & 15;
                if (n2 > 9)
                    s += ((char)(n2 - 10 + (int)'A')).ToString();
                else
                    s += n2.ToString();
                if (n1 > 9)
                    s += ((char)(n1 - 10 + (int)'A')).ToString();
                else
                    s += n1.ToString();
                if ((i + 1) != bt.Length && (i + 1) % 2 == 0) s += "-";
            }
            return s;
        }
        #region Original Device ID Getting Code
        //Return a hardware identifier
        private static string identifier
        (string wmiClass, string wmiProperty, string wmiMustBeTrue)
        {
            string result = "";
            System.Management.ManagementClass mc = 
        new System.Management.ManagementClass(wmiClass);
            System.Management.ManagementObjectCollection moc = mc.GetInstances();
            foreach (System.Management.ManagementObject mo in moc)
            {
                if (mo[wmiMustBeTrue].ToString() == "True")
                {
                    //Only get the first one
                    if (result == "")
                    {
                        try
                        {
                            result = mo[wmiProperty].ToString();
                            break;
                        }
                        catch
                        {
                        }
                    }
                }
            }
            return result;
        }
        //Return a hardware identifier
        private static string identifier(string wmiClass, string wmiProperty)
        {
            string result = "";
            System.Management.ManagementClass mc = 
        new System.Management.ManagementClass(wmiClass);
            System.Management.ManagementObjectCollection moc = mc.GetInstances();
            foreach (System.Management.ManagementObject mo in moc)
            {
                //Only get the first one
                if (result == "")
                {
                    try
                    {
                        result = mo[wmiProperty].ToString();
                        break;
                    }
                    catch
                    {
                    }
                }
            }
            return result;
        }
        private static string cpuId()
        {
            //Uses first CPU identifier available in order of preference
            //Don't get all identifiers, as it is very time consuming
            string retVal = identifier("Win32_Processor", "UniqueId");
            if (retVal == "") //If no UniqueID, use ProcessorID
            {
                retVal = identifier("Win32_Processor", "ProcessorId");
                if (retVal == "") //If no ProcessorId, use Name
                {
                    retVal = identifier("Win32_Processor", "Name");
                    if (retVal == "") //If no Name, use Manufacturer
                    {
                        retVal = identifier("Win32_Processor", "Manufacturer");
                    }
                    //Add clock speed for extra security
                    retVal += identifier("Win32_Processor", "MaxClockSpeed");
                }
            }
            return retVal;
        }
        //BIOS Identifier
        private static string biosId()
        {
            return identifier("Win32_BIOS", "Manufacturer")
            + identifier("Win32_BIOS", "SMBIOSBIOSVersion")
            + identifier("Win32_BIOS", "IdentificationCode")
            + identifier("Win32_BIOS", "SerialNumber")
            + identifier("Win32_BIOS", "ReleaseDate")
            + identifier("Win32_BIOS", "Version");
        }
        //Main physical hard drive ID
        private static string diskId()
        {
            return identifier("Win32_DiskDrive", "Model")
            + identifier("Win32_DiskDrive", "Manufacturer")
            + identifier("Win32_DiskDrive", "Signature")
            + identifier("Win32_DiskDrive", "TotalHeads");
        }
        //Motherboard ID
        private static string baseId()
        {
            return identifier("Win32_BaseBoard", "Model")
            + identifier("Win32_BaseBoard", "Manufacturer")
            + identifier("Win32_BaseBoard", "Name")
            + identifier("Win32_BaseBoard", "SerialNumber");
        }
        //Primary video controller ID
        private static string videoId()
        {
            return identifier("Win32_VideoController", "DriverVersion")
            + identifier("Win32_VideoController", "Name");
        }
        //First enabled network card ID
        private static string macId()
        {
            return identifier("Win32_NetworkAdapterConfiguration", 
                "MACAddress", "IPEnabled");
        }
        #endregion
    }
}

Я не возьму на себя ответственность за это, потому что я нашел его здесь Это сработало быстрее, чем я ожидал. Без графической карты, Mac и drive id я получил уникальный идентификатор примерно за 2-3 секунды. С теми, кто включен выше, я получил его примерно за 4-5 секунд.


следующий подход был вдохновлен ответ к связанному (более общему) вопросу.

подход состоит в том, чтобы прочитать MachineGuid значение в ключ реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography. Это значение создается во время установки ОС.

существует несколько способов обойти уникальность аппаратного идентификатора на машину, используя этот подход. Одним из методов является редактирование значения реестра, но это вызовет осложнения на компьютере пользователя впоследствии. Другим методом является клонирование a образ диска, который будет копировать MachineGuid значение.

однако никакой подход не является хакерским, и это, безусловно, будет достаточно хорошо для обычных пользователей. С положительной стороны, этот подход является быстрым с точки зрения производительности и простым в реализации.

public string GetMachineGuid()
{
   string location = @"SOFTWARE\Microsoft\Cryptography";
   string name = "MachineGuid";

   using (RegistryKey localMachineX64View = 
       RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
   {
       using (RegistryKey rk = localMachineX64View.OpenSubKey(location))
       {
           if (rk == null)
               throw new KeyNotFoundException(
                   string.Format("Key Not Found: {0}", location));

           object machineGuid = rk.GetValue(name);
           if (machineGuid == null)
               throw new IndexOutOfRangeException(
                   string.Format("Index Not Found: {0}", name));

           return machineGuid.ToString();
       }
   }
}

здесь - это DLL, которая показывает:
* Идентификатор жесткого диска (уникальный серийный номер оборудования, записанный в IDE-электронном чипе диска)
* Идентификатор раздела (серийный номер тома)
* CPU ID (уникальный идентификатор оборудования)
* CPU vendor
* Скорость работы процессора
* Теоретическая скорость процессора
* Загрузка памяти (общая память используется в процентах ( % ))
* Общая физическая (общая физическая память в байтах)
* Avail Physical (физическая память, оставленная в байтах )
* Общий файл подкачки (общий файл страницы в байтах )
* Доступный файл подкачки (файл страницы, оставленный в байтах )
* Total Virtual (общая виртуальная память в байтах )
* Доступна виртуальная (Виртуальная память в байтах)
* Bios уникальный идентификатор numberBiosDate
* Bios уникальная идентификация numberBiosVersion
* Bios уникальная идентификация numberBiosProductID
* Bios уникальный идентификатор numberBiosVideo

(Текст взят из оригинальной сети сайт)
Он работает с C#.