2010-02-25 31 views
33

Tôi cần trong chương trình của mình để buộc giấy phép vào ID phần cứng. Tôi đã thử sử dụng WMI, nhưng nó vẫn còn chậm.Làm cách nào để nhận được ID phần cứng nhanh chóng trong C#?

Tôi cần, ví dụ: thông tin về CPU, HDD và bo mạch chủ.

+4

Sơ đồ cấp phép như vậy nghe có vẻ giống như một sự khó chịu đối với khách hàng trung thực hơn là ngăn chặn một cracker. – CodesInChaos

Trả lời

63

Để biết thêm thông tin chi tiết tham khảo this link

Đoạn mã dưới đây sẽ cung cấp cho bạn CPU ID:

namespace yêu cầu 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; 
} 

Đối với ID đĩa cứng và các chi tiết id bo mạch tham khảo this-link

Để tăng tốc quy trình này, hãy đảm bảo bạn không sử dụng SELECT *, nhưng chỉ chọn những gì bạn thực sự cần. Chỉ sử dụng SELECT * trong khi phát triển khi bạn cố gắng tìm hiểu những gì bạn cần sử dụng, vì sau đó truy vấn sẽ mất nhiều hơn dài hơn để hoàn tất.

+1

Trả lời tốt và mở rộng +1 –

+10

Được cảnh báo, tuy nhiên, các id này không độc đáo, hoặc thậm chí tồn tại. Bộ xử lý chỉ xác định thiết kế bộ vi xử lý, VolumeSerialnumber có thể được thay đổi bởi người dùng và có các nhà sản xuất bo mạch chủ không thiết lập Serialnumber. – Jens

+1

Cách tốt nhất để tạo id duy nhất là tạo id bằng cách kết hợp tất cả id của id này, id cpu, id bo mạch chủ và id đĩa cứng. – HotTester

-1

Here là một DLL cho thấy:
* Ổ cứng ID (phần cứng độc đáo số serial viết bằng chip điện tử IDE ổ của)
* Partition ID (volume serial number)
* CPU ID (ID phần cứng duy nhất)
* nhà cung cấp CPU
* CPU chạy tốc độ
* CPU lý thuyết tốc độ
* Memory Load (Tổng bộ nhớ sử dụng trong tỷ lệ phần trăm (%))
* Tổng Physical (Tổng số bộ nhớ vật lý theo byte)
* Avail vật lý (bộ nhớ vật lý còn lại trong byte)
* Tổng pagefile (Tổng số tập tin trang trong byte)
* Sẵn có pagefile (Page file còn lại trong byte)
* Tổng ảo (Tổng bộ nhớ ảo bằng byte)
* sẵn ảo (Virtual memory còn lại trong byte)
* Bios nhận dạng duy nhất numberBiosDate
* Bios nhận dạng duy nhất numberBiosVersion
* Bios nhận dạng duy nhất numberBiosProductID
* Bios nhận dạng duy nhất numberBiosVideo

(văn bản được lấy từ trang web gốc)
Nó hoạt động với C#.

+0

ý tưởng là để làm điều đó trong C# – Fredrik

+2

@ Frederic - Bài đăng gốc cho thấy rằng ID là cần thiết cho một hệ thống an ninh (giấy phép). Tuy nhiên, mã được cung cấp trong các câu trả lời là đọc thông tin từ MS Windows. Đó là một miếng bánh để sửa đổi thông tin đó. Tuy nhiên, phần cứng ID Extractor DLL được thông tin trực tiếp từ CPU (cấp phần cứng). Bạn không thể thay đổi ID phần cứng của CPU (trừ khi bạn làm tan CPU và xây dựng lại nó :)) – thelight

+1

Ngoài ra, nó nhận được thông tin trong chưa đến 1 micro giây. Trong khi lấy thông tin từ MS Windows mất đến 5 giây! – thelight

16

Tôi đến đây tìm kiếm điều tương tự và tôi tìm thấy một giải pháp khác. Nếu các bạn quan tâm đến tôi chia sẻ lớp này:

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 
    } 
} 

tôi sẽ không mất bất kỳ tín dụng cho điều này bởi vì tôi thấy nó here Nó làm việc nhanh hơn tôi mong đợi đối với tôi. Nếu không có card đồ họa, mac và id của ổ đĩa tôi nhận được ID duy nhất trong khoảng 2-3 giây. Với những người ở trên bao gồm tôi đã nhận nó trong khoảng 4-5 giây.

+0

DLL được trình bày bên dưới truy xuất thông tin trong chưa đến 1 micro giây. – thelight

+0

Mã này rất hay. Tnq –

9

Cách tiếp cận sau đây được lấy cảm hứng từ this answer đến câu hỏi có liên quan (tổng quát hơn).

Cách tiếp cận là đọc giá trị MachineGuid trong khóa đăng ký HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography. Giá trị này được tạo trong khi cài đặt hệ điều hành.

Có một vài cách xung quanh tính duy nhất của ID phần cứng trên mỗi máy bằng cách sử dụng phương pháp này. Một phương pháp là chỉnh sửa giá trị đăng ký, nhưng điều này sẽ gây ra các biến chứng trên máy của người dùng sau đó. Một phương pháp khác là sao chép một hình ảnh ổ đĩa sẽ sao chép giá trị MachineGuid.

Tuy nhiên, không có cách tiếp cận nào là chống hack và điều này chắc chắn sẽ đủ tốt cho người dùng thông thường. Về mặt tích cực, phương pháp này nhanh chóng hiệu quả và đơn giản để thực hiện.

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(); 
     } 
    } 
} 
+0

chỉnh sửa giá trị đăng ký nhanh và 'không nhất thiết tạo ra sự cố trên máy người dùng' - bạn có thể chỉnh sửa, thực hiện những gì bạn muốn (trong s/w) và hoàn nguyên giá trị. – NSGaga

-5

mã này không làm việc cho đến khi u làm theo các bước này

Add Reference vào System.Management hội.

Đối với điều này bạn phải làm:

  1. Đi tới Dự án Tab

  2. Bấm vào Thêm Tài liệu tham khảo

  3. Bấm vào tab .NET

  4. Chọn System.Management và nhấn ok

+0

Tôi upvoted bạn, nhưng downvoted bạn một lần nữa bởi vì đây không phải là một câu trả lời, điều này thực sự phải là một bình luận theo bài mã cụ thể. Mặc dù bạn không thể cấu trúc một câu trả lời như thế này, bạn chỉ đơn giản có thể làm giảm điều này để nói "Mã này sẽ không hoạt động nếu bạn không có tham chiếu assembly cho" System.Management "". –

Các vấn đề liên quan