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
closeEnough
fungsi 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.Saya memiliki masalah yang sama dan setelah sedikit riset, saya memutuskan yang terbaik adalah membaca
MachineGuid
di kunci registriHKEY_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).
sumber
Dengan alat perizinan kami, kami mempertimbangkan komponen-komponen berikut
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.
sumber
Bagaimana dengan hanya menggunakan UniqueID prosesor?
sumber
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.
sumber
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.
sumber
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 :
Anda dapat mengakses SID akun mesin domain melalui LDAP atau
System.DirectoryServices
.sumber
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
Name
danDriverVersion
,Clockspeed
, dll karena itu mungkin OS tergantung. Coba keluarkan info yang sama di kedua sistem operasi dan biarkan yang berbeda di antaranya.sumber
Ada perpustakaan yang tersedia untuk mendapatkan informasi khusus perangkat keras: Ekstraktor nomor seri perangkat keras (CPU, RAM, HDD, BIOS)
sumber
Mengapa tidak menggunakan alamat MAC kartu jaringan Anda?
sumber
Mungkin sedikit curang, tetapi Alamat MAC dari adaptor Ethernet mesin jarang berubah tanpa motherboard berubah hari ini.
sumber
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.
sumber
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:
sumber
Cari CPUID untuk satu opsi. Mungkin ada beberapa masalah dengan sistem multi-CPU.
sumber
Coba yang ini, ini memberikan ID hard disk yang unik: Port of DiskId32 untuk Delphi 7-2010 .
sumber