Menghasilkan id mesin unik


104

Saya perlu menulis fungsi yang menghasilkan id yang unik untuk mesin tertentu yang menjalankan OS Windows.

Saat ini, saya menggunakan WMI untuk menanyakan berbagai parameter perangkat keras dan menggabungkannya bersama-sama dan melakukan hash untuk mendapatkan id unik. Pertanyaan saya adalah, parameter apa yang disarankan yang harus saya gunakan? Saat ini, saya menggunakan kombinasi data bios \ cpu \ disk untuk menghasilkan id unik. Dan saya menggunakan hasil pertama jika ada beberapa hasil untuk setiap metrik.

Namun, saya mengalami masalah di mana mesin yang melakukan dual boot ke 2 OS Windows yang berbeda menghasilkan kode situs yang berbeda di setiap OS, yang idealnya tidak terjadi.

Sebagai referensi, berikut adalah metrik yang saya gunakan saat ini:

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

Jawaban:


25

Parse sendiri SMBIOS dan lakukan hash hingga panjang acak. Lihat spesifikasi PDF untuk semua struktur SMBIOS yang tersedia.

Untuk menanyakan info SMBIOS dari Windows, Anda dapat menggunakan EnumSystemFirmwareEntries, EnumSystemFirmwareTablesdan GetSystemFirmwareTable.

IIRC, "id unik" dari instruksi CPUID tidak digunakan lagi dari P3 dan yang lebih baru.


14
Perhatikan bahwa fungsi ini memerlukan setidaknya Windows Vista, Windows XP Professional x64 Edition, Windows Server 2008 atau Windows Server 2003 dengan SP1.
jcoffland

33
Catatan untuk tidak melakukan apa yang saya lakukan, yang memanggil GetSystemFirmwareTable ('RSMB' ...); dan hash seluruh buffer SMBIOSTableData. Ini bekerja dengan baik sampai saya menemukan workstation yang menulis suhu internal cpu ke tabel itu, yang berarti id unik saya berubah setiap beberapa detik.
Thomas

Apakah ada kode sumber yang tersedia untuk solusi ini?
Just Shadow

@ Thomas jadi solusi mana yang akhirnya Anda pilih?
Smith

@Smith Tujuan saya adalah 8 karakter kecil id. Membaca spesifikasi, saya membuat keputusan tentang bidang mana yang mungkin berbeda dan mengecualikannya. Kemudian selama bertahun-tahun saya memangkas lebih banyak bidang yang bukan konstanta dari mesin. Akhirnya, saya akhirnya menyimpan salinan terenkripsi dari data mentah yang saya gunakan sebagai input dan membuat closeEnoughfungsi sehingga saya akan menerima id yang tidak cocok jika hanya bervariasi di 2 bidang. Saya juga menyertakan detail tentang prosesor dan harddisk sistem di hash saya karena sejak awal saya mengalami benturan antara sistem yang identik.
Thomas

72

Saya memiliki masalah yang sama dan setelah sedikit riset, saya memutuskan yang terbaik adalah membaca MachineGuiddi kunci registri HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography, seperti yang disarankan @Agnus. Ini dibuat selama penginstalan OS dan tidak akan berubah kecuali Anda membuat penginstalan OS baru lainnya. Bergantung pada versi OS, mungkin berisi alamat MAC adaptor jaringan yang disematkan (ditambah beberapa nomor lain, termasuk nomor acak), atau nomor pseudorandom, yang lebih baru untuk versi OS yang lebih baru (setelah XP SP2, saya yakin, tapi tidak yakin). Jika ini adalah pseudorandom secara teoritis dapat dipalsukan - jika dua mesin memiliki keadaan awal yang sama, termasuk jam waktu nyata. Dalam praktiknya, ini jarang terjadi, tetapi waspadalah jika Anda mengharapkannya menjadi basis keamanan yang dapat diserang oleh peretas hardcore.

Tentu saja entri registri juga dapat dengan mudah diubah oleh siapa saja untuk memalsukan GUID mesin, tetapi yang saya temukan adalah bahwa ini akan mengganggu operasi normal dari begitu banyak komponen Windows sehingga dalam banyak kasus tidak ada pengguna biasa yang melakukannya (sekali lagi, hati-hati untuk peretas hardcore).


6
Anda dapat menggunakan bendera KEY_WOW64_64KEY untuk memastikan Anda selalu mendapatkan versi "asli" dari kunci registri, saya rasa.
Colen

13
Jika Anda mengkloning gambar drive, ini akan tetap sama. Jadi ini sama sekali tidak aman dan tidak aman.
bitbonk

19
Untuk memperjelas hal ini, ketika saya menempatkan pengukuran DRM dalam perangkat lunak, tujuan utama saya adalah untuk mencegah orang membuat celah yang memungkinkan pembajak 'profesional' untuk menjual salinan ilegal dari perangkat lunak tanpa batasan apa pun. Saya tidak terlalu khawatir tentang peretas sesekali yang mengkloning drive temannya hanya untuk dapat menggunakan perangkat lunak saya. Dalam kasus seperti itu, orang-orang itu biasanya memiliki lebih banyak waktu daripada uang, dan toh tidak akan membayarnya. Jika biaya perangkat lunak $ 100 dan gaji Anda lebih dari $ 50 / jam, Anda cukup membayarnya. Kerumitan ini akan memakan lebih banyak waktu Anda daripada 2 jam.
Fabio Ceconello

7
Secara khusus, dalam lingkungan di mana Windows diinstal dengan mengklon gambar mesin master, MachineGuid akan identik untuk semuanya.
nandhp

8
Tidak jika Anda melakukannya dengan benar dan legal, menggunakan sysprep & all. Bagi mereka yang memiliki windows bajakan dan "hanya kloning", itu masalah lain. Tapi mereka tidak akan dihentikan semudah itu.
Fabio Ceconello

34

Dengan alat perizinan kami, kami mempertimbangkan komponen-komponen berikut

  • Alamat MAC
  • CPU (Bukan nomor seri, tetapi profil CPU yang sebenarnya seperti loncatan dan model)
  • Nomor Seri Drive Sistem (Bukan Label Volume)
  • Penyimpanan
  • Model & vendor CD-ROM
  • Model & vendor Kartu Video
  • Pengontrol IDE
  • Pengontrol SCSI

Namun, daripada hanya melakukan hashing pada komponen dan membuat sistem lulus / gagal, kami membuat sidik jari yang sebanding yang dapat digunakan untuk menentukan perbedaan dua profil mesin. Jika perbedaan peringkat berada di atas toleransi yang ditentukan, minta pengguna untuk mengaktifkan kembali.

Kami telah menemukan selama 8 tahun terakhir digunakan dengan ratusan ribu penginstalan pengguna akhir bahwa kombinasi ini bekerja dengan baik untuk memberikan id mesin yang unik dan andal - bahkan untuk mesin virtual dan penginstalan OS kloning.


1
Bagaimana Anda menentukan alamat MAC yang Anda gunakan? Sebuah mesin dapat memiliki beberapa NIC dan ini ditambahkan secara dinamis (menghubungkan ke VPN baru melalui applet akan menambahkan NIC virtual). Beberapa virtual, memiliki tipe Ethernet dan sulit diidentifikasi sebagai virtual. Lainnya Naik / Turun tergantung pada kondisi jaringan (wifi)
Marek

Kami menggunakan semua NIC fisik - tidak termasuk NICS virtual, gigi biru, dll. Semuanya digabungkan untuk membuat hash terpadu.
Paul Alexander

Mengapa Anda merekomendasikan untuk tidak menggunakan nomor seri CPU?
Mojtaba Rezaeian

3
Nomor seri CPU belum diaktifkan di chip Intel selama bertahun-tahun. Panggilan sistem masih ada, tetapi tidak mengembalikan nilai yang stabil. Saya tidak ingat apa yang dikembalikannya - baik data dummy atau nilai yang sama untuk semua mesin. bagaimanapun juga itu bukan metrik perangkat keras yang dapat diandalkan.
Paul Alexander

1
@PaulAlexander alat yang Anda rujuk memvalidasi semua parameter yang Anda sebutkan atau beberapa di antaranya akan berfungsi? Karena sistem sekarang hari biasanya tidak terdiri dari CD-ROM
FaizanHussainRabbani

3

Bagaimana dengan hanya menggunakan UniqueID prosesor?


14
Bukankah itu properti yang didepresiasi hari ini?
Jake Wilson

15
Mungkin maksudnya 'tidak digunakan lagi' ... Produsen CPU mulai memasukkan ID unik pada satu tahap, tetapi karena masalah privasi, mereka berhenti lagi. Jadi, Anda akan menemukan bahwa beberapa memiliki ID unik tetapi kebanyakan CPU modern tidak.
TripleAntigen

1
Sebagai referensi, hanya sejumlah singkat Pentium III yang pernah memiliki nomor seri CPU yang dapat dibaca. Sementara versi yang lebih baru memiliki nomor seri, itu dinonaktifkan secara default. Pentium IV dan CPU yang lebih baru sama sekali tidak mendukungnya.
Paul Alexander

2

Saya benci menjadi orang yang mengatakan, "Anda hanya melakukan kesalahan" (saya selalu membenci orang itu;) tapi ...

Apakah itu harus dibuat berulang kali untuk mesin unik? Bisakah Anda menetapkan pengenal atau melakukan kunci publik / pribadi? Mungkin jika Anda dapat menghasilkan dan menyimpan nilainya, Anda dapat mengaksesnya dari kedua penginstalan OS pada disk yang sama?

Anda mungkin telah menjelajahi opsi-opsi ini dan mereka tidak berhasil untuk Anda, tetapi jika tidak, itu sesuatu yang perlu dipertimbangkan.

Jika ini bukan masalah kepercayaan pengguna, Anda cukup menggunakan alamat MAC.


5
Alamat MAC tidak akan berfungsi jika mesin tidak memiliki kartu jaringan.
Brian

7
@ Brian - apakah Anda benar-benar memerlukan nilai unik untuk mengidentifikasi komputer yang tidak memiliki kartu jaringan? Tampaknya taruhan yang cukup aman mesin memiliki kartu.
romandas

1

Anda harus melihat ke dalam menggunakan alamat MAC pada kartu jaringan (jika ada). Itu biasanya unik tetapi bisa dibuat-buat. Saya telah menggunakan perangkat lunak yang menghasilkan file lisensinya berdasarkan alamat MAC adaptor jaringan Anda, jadi ini dianggap sebagai cara yang cukup andal untuk membedakan antar komputer.


6
Tidak, mereka tidak. Banyak pabrikan memungkinkan Anda mengubahnya. Ini sangat membantu saat bekerja dengan cluster karena beberapa vendor memberi Anda semua komputer dengan alamat MAC yang sama (kami mengalami masalah ini beberapa tahun yang lalu).
alat

Ini adalah ide yang valid dalam banyak kasus, pertanyaan tidak menentukan spoof-proodness atau offline - Anda umumnya ingin menghasilkan ID unik jika Anda ingin mengidentifikasi dalam jaringan
Hurda

Dimungkinkan untuk memiliki beberapa perangkat Jaringan di mesin yang sama; Anda tidak dijamin bahwa mereka akan selalu terdeteksi dalam urutan yang sama atau tidak akan diganti di beberapa titik. Lebih baik menggunakan beberapa perangkat keras yang cenderung lebih permanen.
Agi Hammerthief

1

Untuk salah satu aplikasi saya, saya menggunakan nama komputer jika itu adalah komputer non-domain, atau akun mesin domain SID untuk komputer domain. Mark Russinovich membicarakannya dalam posting blog ini, Machine SID :

Kasus terakhir di mana duplikasi SID akan menjadi masalah adalah jika aplikasi terdistribusi menggunakan SID mesin untuk mengidentifikasi komputer secara unik. Tidak ada perangkat lunak Microsoft yang melakukannya dan menggunakan mesin SID dengan cara itu tidak berfungsi hanya karena semua DC memiliki SID mesin yang sama. Perangkat lunak yang mengandalkan identitas komputer unik baik menggunakan nama komputer atau komputer Domain SID (SID akun komputer di Domain).

Anda dapat mengakses SID akun mesin domain melalui LDAP atau System.DirectoryServices.


1

Dalam program saya, pertama saya memeriksa Terminal Server dan menggunakan WTSClientHardwareId. Jika tidak, alamat MAC dari PC lokal harus memadai.

Jika Anda benar-benar ingin menggunakan daftar properti yang Anda berikan cuti hal-hal seperti Namedan DriverVersion, Clockspeed, dll karena itu mungkin OS tergantung. Coba keluarkan info yang sama di kedua sistem operasi dan biarkan yang berbeda di antaranya.



0

Mengapa tidak menggunakan alamat MAC kartu jaringan Anda?


14
Alamat Mac dapat dipalsukan
Henry B

Ini adalah ide yang valid dalam banyak kasus, pertanyaan tidak menentukan spoof-proodness atau offline - Anda pada umumnya ingin menghasilkan ID unik jika Anda ingin mengidentifikasi dalam jaringan
Hurda

0

Mungkin sedikit curang, tetapi Alamat MAC dari adaptor Ethernet mesin jarang berubah tanpa motherboard berubah hari ini.


Banyak pabrikan memungkinkan Anda mengubahnya. Ini sangat membantu saat bekerja dengan cluster karena beberapa vendor memberi Anda semua komputer dengan alamat MAC yang sama (kami mengalami masalah ini beberapa tahun yang lalu).
alat

1
MAC sama sekali tidak dapat diandalkan karena dapat dengan mudah diubah (hanya dengan pencarian google dan Anda akan melihat banyak alat gratis yang melakukan ini). Hal yang sama untuk WMI.
InTheNameOfScience

0

Dapatkah Anda menarik beberapa jenis nomor seri atau tag servis pabrikan?

Toko kami adalah toko Dell, jadi kami menggunakan tag servis yang unik untuk setiap mesin untuk mengidentifikasinya. Saya tahu ini dapat ditanyakan dari BIOS, setidaknya di Linux, tetapi saya tidak tahu begitu saja bagaimana melakukannya di Windows.


0

Saya memiliki kendala tambahan, saya menggunakan .net express sehingga saya tidak dapat menggunakan mekanisme kueri perangkat keras standar. Jadi saya memutuskan untuk menggunakan power shell untuk melakukan kueri. Kode lengkapnya terlihat seperti ini:

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

Cari CPUID untuk satu opsi. Mungkin ada beberapa masalah dengan sistem multi-CPU.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.