Tạo id máy duy nhất


104

Tôi cần viết một hàm tạo id duy nhất cho một máy nhất định chạy hệ điều hành Windows.

Hiện tại, tôi đang sử dụng WMI để truy vấn các thông số phần cứng khác nhau và ghép chúng lại với nhau và băm chúng để lấy ra id duy nhất. Câu hỏi của tôi là, những thông số đề xuất tôi nên sử dụng là gì? Hiện tại, tôi đang sử dụng kết hợp dữ liệu bios \ cpu \ disk để tạo id duy nhất. Và đang sử dụng kết quả đầu tiên nếu có nhiều kết quả cho mỗi số liệu.

Tuy nhiên, tôi đã gặp phải sự cố khi một máy khởi động kép vào 2 hệ điều hành Windows khác nhau tạo ra các mã trang web khác nhau trên mỗi hệ điều hành, điều này lý tưởng sẽ không xảy ra.

Để tham khảo, đây là các chỉ số tôi hiện đang sử dụng:

Win32_Processor:UniqueID,ProcessorID,Name,Manufacturer,MaxClockSpeed
Win32_BIOS:Manufacturer
Win32_BIOS:SMBIOSBIOSVersion,IdentificationCode,SerialNumber,ReleaseDate,Version
Win32_DiskDrive:Model, Manufacturer, Signature, TotalHeads
Win32_BaseBoard:Model, Manufacturer, Name, SerialNumber
Win32_VideoController:DriverVersion, Name

Câu trả lời:


25

Tự phân tích cú pháp SMBIOS và băm nó thành độ dài tùy ý. Xem đặc tả PDF cho tất cả các cấu trúc SMBIOS có sẵn.

Để truy vấn các thông tin SMBIOS từ Windows bạn có thể sử dụng EnumSystemFirmwareEntries, EnumSystemFirmwareTablesGetSystemFirmwareTable.

IIRC, "id duy nhất" từ lệnh CPUID không được chấp nhận từ P3 trở lên.


14
Lưu ý rằng các chức năng này yêu cầu ít nhất Windows Vista, Windows XP Professional x64 Edition, Windows Server 2008 hoặc Windows Server 2003 với SP1.
jcoffland

33
Một lưu ý để không làm những gì tôi đã làm, đó là gọi GetSystemFirmwareTable ('RSMB' ...); và băm toàn bộ bộ đệm SMBIOSTableData. Nó hoạt động tốt cho đến khi tôi gặp một máy trạm ghi nhiệt độ bên trong cpu của nó vào bảng đó, nghĩa là id duy nhất của tôi thay đổi vài giây một lần.
Thomas

Có bất kỳ mã nguồn nào có sẵn cho giải pháp này không?
Just Shadow

@Thomas vậy cuối cùng bạn đã chọn giải pháp nào?
Smith

@Smith Mục tiêu của tôi là một id nhỏ 8 ký tự. Đọc thông số kỹ thuật, tôi đưa ra quyết định về những trường nào có thể thay đổi và loại trừ chúng. Sau đó, trong nhiều năm, tôi đã cắt bỏ nhiều trường hơn không phải là hằng số từ máy móc. Cuối cùng, tôi đã kết thúc việc lưu trữ một bản sao được mã hóa của dữ liệu thô mà tôi đã sử dụng làm đầu vào và tạo một closeEnoughhàm để tôi chấp nhận một id không khớp nếu nó chỉ khác nhau trong 2 trường. Tôi cũng đưa thông tin chi tiết về bộ xử lý và ổ cứng hệ thống trong hàm băm của mình vì ngay từ đầu tôi đã có va chạm giữa các hệ thống giống hệt nhau.
Thomas

72

Tôi đã gặp vấn đề tương tự và sau khi nghiên cứu một chút, tôi quyết định cách tốt nhất là đọc MachineGuidtrong khóa đăng ký HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography, như @Agnus đề xuất. Nó được tạo trong quá trình cài đặt hệ điều hành và sẽ không thay đổi trừ khi bạn thực hiện cài đặt hệ điều hành mới khác. Tùy thuộc vào phiên bản hệ điều hành, nó có thể chứa địa chỉ MAC của bộ điều hợp mạng được nhúng (cộng với một số số khác, bao gồm cả số ngẫu nhiên) hoặc một số giả ngẫu nhiên, dành cho các phiên bản hệ điều hành mới hơn (sau XP SP2, tôi tin, nhưng không chắc). Nếu đó là một giả ngẫu nhiên về mặt lý thuyết, nó có thể được giả mạo - nếu hai máy có cùng trạng thái ban đầu, bao gồm cả đồng hồ thời gian thực. Trong thực tế, điều này sẽ hiếm khi xảy ra, nhưng hãy lưu ý nếu bạn mong đợi nó là cơ sở bảo mật có thể bị tấn công bởi các hacker mạnh.

Tất nhiên, bất kỳ ai cũng có thể dễ dàng thay đổi mục đăng ký để giả mạo GUID của máy, nhưng điều tôi nhận thấy là điều này sẽ làm gián đoạn hoạt động bình thường của rất nhiều thành phần của Windows mà trong hầu hết các trường hợp, không người dùng thông thường nào làm được (một lần nữa, hãy coi chừng dành cho tin tặc khó tính).


6
Bạn có thể sử dụng cờ KEY_WOW64_64KEY để đảm bảo rằng bạn luôn nhận được phiên bản "thực" của khóa đăng ký, tôi nghĩ vậy.
Colen

13
Nếu bạn sao chép hình ảnh ổ đĩa, nó sẽ không thay đổi. Vì vậy, điều này hoàn toàn không phải là an toàn giả mạo và rất không an toàn.
bitbonk

19
Để làm rõ vấn đề, khi tôi đưa các biện pháp DRM vào phần mềm, mục tiêu chính của tôi là ngăn mọi người tạo ra một bản crack cho phép những kẻ cướp biển 'chuyên nghiệp' bán các bản sao bất hợp pháp của phần mềm mà không có bất kỳ giới hạn nào. Tôi không lo lắng về việc một hacker không thường xuyên sao chép ổ đĩa của bạn anh ta chỉ để có thể sử dụng phần mềm của tôi. Trong những trường hợp như vậy, những người này thường có nhiều thời gian hơn tiền bạc, và dù thế nào đi nữa thì họ cũng sẽ không trả tiền. Nếu phần mềm có giá 100 đô la và lương của bạn hơn 50 đô la / h, bạn chỉ cần trả tiền cho nó. Sự phức tạp sẽ làm mất nhiều thời gian của bạn hơn 2h.
Fabio Ceconello,

7
Đặc biệt, trong môi trường mà Windows được cài đặt bằng cách sao chép hình ảnh máy chủ, MachineGuid sẽ giống hệt nhau cho tất cả chúng.
nandhp

8
Không nếu bạn làm điều đó một cách chính xác và hợp pháp, bằng cách sử dụng sysprep & tất cả. Đối với những người có bản sao lậu của windows và "chỉ sao chép", đó là một vấn đề khác. Nhưng dù sao thì chúng cũng sẽ không bị chặn lại dễ dàng như vậy.
Fabio Ceconello

34

Với công cụ cấp phép của chúng tôi, chúng tôi xem xét các thành phần sau

  • Địa chỉ MAC
  • CPU (Không phải số sê-ri, mà là cấu hình CPU thực tế như bước và kiểu máy)
  • Số sê-ri của ổ đĩa hệ thống (Không phải nhãn ổ đĩa)
  • Ký ức
  • Mô hình và nhà cung cấp CD-ROM
  • Nhà cung cấp và mô hình Card Video
  • Bộ điều khiển IDE
  • Bộ điều khiển SCSI

Tuy nhiên, thay vì chỉ băm các thành phần và tạo hệ thống đạt / không đạt, chúng tôi tạo ra một dấu vân tay so sánh có thể được sử dụng để xác định cấu hình hai máy khác nhau như thế nào. Nếu đánh giá chênh lệch trên một dung sai được chỉ định thì hãy yêu cầu người dùng kích hoạt lại.

Chúng tôi nhận thấy rằng trong 8 năm qua, với hàng trăm nghìn lượt cài đặt của người dùng cuối, sự kết hợp này hoạt động tốt để cung cấp một id máy duy nhất đáng tin cậy - ngay cả đối với máy ảo và cài đặt hệ điều hành nhân bản.


1
Làm thế nào để bạn xác định địa chỉ MAC nào bạn sử dụng? Một máy có thể có nhiều NIC và những NIC này được thêm động (kết nối với VPN mới qua một applet sẽ thêm NIC ảo). Một số là ảo, có loại Ethernet và khó xác định là ảo. Những người khác Lên / Xuống tùy thuộc vào điều kiện mạng (wifi)
Marek

Chúng tôi sử dụng tất cả các NIC vật lý - không bao gồm NICS ảo, răng xanh, v.v. Tất cả chúng được kết hợp để tạo ra hàm băm thống nhất.
Paul Alexander

Tại sao bạn không nên sử dụng số sê-ri của CPU?
Mojtaba Rezaeian

3
Số sê-ri của CPU đã không được kích hoạt trong chip Intel trong nhiều năm. Các lệnh gọi hệ thống vẫn tồn tại, nhưng nó không trả về giá trị ổn định. Tôi không thể nhớ nó trả về những gì - dữ liệu giả hoặc cùng một giá trị cho tất cả các máy. theo cách nào đó thì nó không phải là một số liệu phần cứng đáng tin cậy.
Paul Alexander

1
@PaulAlexander công cụ mà bạn đã đề cập đến xác thực tất cả các thông số bạn đã đề cập hoặc một vài trong số chúng sẽ hoạt động? Bởi vì hệ thống bây giờ một ngày không thường bao gồm một đĩa CD-ROM
FaizanHussainRabbani

3

Điều gì về việc chỉ sử dụng UniqueID của bộ xử lý?


14
Đó không phải là một tài sản bị mất giá trong những ngày này?
Jake Wilson

15
Có lẽ ý anh ấy là 'không được dùng nữa' ... Các nhà sản xuất CPU bắt đầu đưa các ID duy nhất vào một giai đoạn nhưng do phản ứng dữ dội về các vấn đề quyền riêng tư, họ đã dừng lại. Vì vậy, bạn sẽ thấy rằng một số có một ID duy nhất nhưng hầu hết các CPU hiện đại thì không.
TripleAntigen

1
Để tham khảo, chỉ một lô Pentium III ngắn gọn từng có số sê-ri CPU có thể đọc được. Trong khi các phiên bản sau này có số sê-ri thì nó bị tắt theo mặc định. Pentium IV và các CPU mới hơn hoàn toàn không hỗ trợ nó.
Paul Alexander

2

Tôi ghét phải là người nói, "bạn chỉ đang làm sai" (Tôi luôn ghét anh chàng đó;) nhưng ...

Nó có phải được tạo lặp lại cho máy duy nhất không? Bạn có thể chỉ định số nhận dạng hay tạo khóa công khai / riêng tư? Có thể nếu bạn có thể tạo và lưu trữ giá trị, bạn có thể truy cập nó từ cả hai bản cài đặt hệ điều hành trên cùng một đĩa?

Bạn có thể đã khám phá các tùy chọn này và chúng không phù hợp với bạn, nhưng nếu không, đó là điều cần xem xét.

Nếu đó không phải là vấn đề về sự tin cậy của người dùng, bạn chỉ có thể sử dụng địa chỉ MAC.


5
Địa chỉ MAC sẽ không hoạt động nếu máy không có card mạng.
Brian

7
@Brian - bạn có thực sự cần một giá trị duy nhất để xác định máy tính không có card mạng không? Có vẻ như một cuộc đặt cược khá an toàn khi máy có thẻ.
romandas

1

Bạn nên xem xét việc sử dụng địa chỉ MAC trên card mạng (nếu nó tồn tại). Chúng thường là duy nhất nhưng có thể được chế tạo. Tôi đã sử dụng phần mềm tạo tệp giấy phép của nó dựa trên địa chỉ MAC của bộ điều hợp mạng của bạn, vì vậy nó được coi là một cách khá đáng tin cậy để phân biệt giữa các máy tính.


6
Không, họ không. Rất nhiều nhà sản xuất cho phép bạn thay đổi chúng. Điều này rất hữu ích khi làm việc với các cụm vì một số nhà cung cấp cung cấp cho bạn tất cả các máy tính có cùng địa chỉ MAC (chúng tôi đã gặp vấn đề này một vài năm trước).
gizmo 19-08

Đây là ý tưởng hợp lệ trong nhiều trường hợp, câu hỏi không chỉ định khả năng giả mạo hay ngoại tuyến - bạn thường muốn tạo ID duy nhất nếu bạn muốn xác định trong một mạng
Hurda

Có thể có nhiều thiết bị Mạng trong cùng một máy; bạn không được đảm bảo rằng chúng sẽ luôn được phát hiện theo cùng một thứ tự hoặc chúng sẽ không bị thay thế vào một lúc nào đó. Tốt hơn là sử dụng một số phần cứng có khả năng lâu dài hơn.
Agi Hammerthief

1

Đối với một trong các ứng dụng của tôi, tôi sử dụng tên máy tính nếu đó là máy tính không thuộc miền hoặc SID tài khoản máy miền cho máy tính miền. Mark Russinovich nói về nó trong bài đăng trên blog này, Machine SID :

Trường hợp cuối cùng mà sự trùng lặp SID sẽ là một vấn đề là nếu một ứng dụng phân tán sử dụng SID của máy để nhận dạng duy nhất các máy tính. Không có phần mềm nào của Microsoft làm như vậy và việc sử dụng SID máy theo cách đó không hoạt động chỉ vì thực tế là tất cả các DC đều có SID máy giống nhau. Phần mềm dựa trên danh tính máy tính duy nhất sử dụng tên máy tính hoặc SID miền máy tính (SID của tài khoản máy tính trong Miền).

Bạn có thể truy cập SID tài khoản máy miền qua LDAP hoặc System.DirectoryServices.


1

Trong chương trình của mình, trước tiên, tôi kiểm tra Terminal Server và sử dụng WTSClientHardwareId. Nếu không, địa chỉ MAC của PC cục bộ phải đủ.

Nếu bạn thực sự muốn sử dụng danh sách các đặc tính mà bạn cung cấp nghỉ ra những thứ như NameDriverVersion, Clockspeedvv vì nó có thể là hệ điều hành phụ thuộc. Hãy thử xuất cùng một thông tin trên cả hai hệ điều hành và loại bỏ thông tin khác nhau giữa các hệ điều hành.



0

Tại sao không sử dụng địa chỉ MAC của card mạng của bạn?


14
Địa chỉ Mac có thể bị giả mạo
Henry B

Đây là ý tưởng hợp lệ trong nhiều trường hợp, câu hỏi không chỉ định khả năng giả mạo hay ngoại tuyến - bạn thường muốn tạo ID duy nhất nếu bạn muốn xác định trong một mạng
Hurda

0

Có thể gian lận một chút, nhưng Địa chỉ MAC của máy điều hợp Ethernet hiếm khi thay đổi nếu không có bo mạch chủ thay đổi trong những ngày này.


Rất nhiều nhà sản xuất cho phép bạn thay đổi chúng. Điều này rất hữu ích khi làm việc với các cụm vì một số nhà cung cấp cung cấp cho bạn tất cả các máy tính có cùng địa chỉ MAC (chúng tôi đã gặp vấn đề này một vài năm trước).
gizmo 19-08

1
MAC hoàn toàn không đáng tin cậy vì nó có thể dễ dàng thay đổi (chỉ cần tìm kiếm trên google, bạn sẽ thấy rất nhiều công cụ miễn phí đang thực hiện điều này). Đối với WMI cũng vậy.
InTheNameOfScience

0

Bạn có thể kéo một số loại số sê-ri của nhà sản xuất hoặc thẻ dịch vụ không?

Cửa hàng của chúng tôi là cửa hàng của Dell, vì vậy chúng tôi sử dụng thẻ bảo hành dành riêng cho từng máy để xác định chúng. Tôi biết nó có thể được truy vấn từ BIOS, ít nhất là trong Linux, nhưng tôi không biết cách thực hiện nó trong Windows.


0

Tôi có một hạn chế bổ sung, tôi đang sử dụng .net express nên tôi không thể sử dụng cơ chế truy vấn phần cứng tiêu chuẩn. Vì vậy, tôi quyết định sử dụng power shell để thực hiện truy vấn. Mã đầy đủ trông như thế này:

Private Function GetUUID() As String
    Dim GetDiskUUID As String = "get-wmiobject Win32_ComputerSystemProduct  | Select-Object -ExpandProperty UUID"
    Dim X As String = ""
    Dim oProcess As New Process()
    Dim oStartInfo As New ProcessStartInfo("powershell.exe", GetDiskUUID)
    oStartInfo.UseShellExecute = False
    oStartInfo.RedirectStandardInput = True
    oStartInfo.RedirectStandardOutput = True
    oStartInfo.CreateNoWindow = True
    oProcess.StartInfo = oStartInfo
    oProcess.Start()
    oProcess.WaitForExit()
    X = oProcess.StandardOutput.ReadToEnd
    Return X.Trim()
End Function

-1

Tra cứu CPUID cho một tùy chọn. Có thể có một số vấn đề với hệ thống nhiều CPU.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.