it-swarm-eu.dev

Generování jedinečného ID stroje

Musím napsat funkci, která generuje id, který je jedinečný pro daný počítač s operačním systémem Windows.

V současné době používám rozhraní WMI k dotazování různých hardwarových parametrů a spojování dohromady a jejich hash, aby bylo možné odvodit jedinečné ID. Moje otázka zní, jaké jsou navrhované parametry, které bych měl použít? V současné době používám kombinaci dat bios procesoru pro generování jedinečného id. A používám první výsledek, pokud je pro každou metriku více výsledků.

Nicméně jsem narazil na problém, kdy stroj, který má dvojité zavádění do 2 různých operačních systémů Windows, generuje různé kódy míst na každém operačním systému, což by se v ideálním případě nemělo.

Toto jsou metriky, které používám:

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
97
HS.

Analyzovat SMBIOS sami a hash to na libovolnou délku. Viz specifikace PDF pro všechny dostupné struktury SMBIOS.

K dotazování informací SMBIOS z Windows můžete použít EnumSystemFirmwareEntries , EnumSystemFirmwareTables a GetSystemFirmwareTable .

IIRC, "jedinečné id" z instrukce CPUID je zastaralé z P3 a novější.

22
Jonas Gulle

Měl jsem stejný problém a po malém výzkumu jsem se rozhodl, že bude nejlepší číst MachineGuid v klíči registru HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography, jak navrhl @Agnus. Je generován během instalace operačního systému a nezmění se, pokud neprovedete další instalaci operačního systému. V závislosti na verzi operačního systému může obsahovat adresu MAC adaptéru síťového adaptéru (plus některá další čísla, včetně náhodných), nebo pseudonáhodné číslo, později pro novější verze operačního systému (po XP SP2, věřím, ale nejsem si jistý) ). Pokud je to teoreticky pseudorandom, může být kováno - pokud dva počítače mají stejný počáteční stav, včetně hodin reálného času. V praxi to bude vzácné, ale uvědomte si, že očekáváte, že bude základem pro zabezpečení, které mohou být napadeny tvrdými hackery.

Samozřejmě může být položka registru také snadno změněna kýmkoliv, kdo vytvoří strojové GUID, ale zjistila jsem, že by to narušilo normální provoz tolika komponent systému Windows, které by ve většině případů neudělal žádný pravidelný uživatel (opět pozor pro hardcore hackery).

71
Fabio Ceconello

S naším licenčním nástrojem zvažujeme následující komponenty

  • Adresa MAC
  • CPU (není sériové číslo, ale skutečný profil procesoru, jako je krokování a model)
  • Sériové číslo systémové jednotky (ne označení svazku)
  • Paměť
  • CD-ROM model a prodejce
  • Model grafické karty a prodejce
  • IDE Controller
  • Řadič SCSI

Nicméně, spíše než jen hašování komponent a vytváření systému pass/fail, vytváříme srovnatelný otisk prstu , který lze použít k určení, jak různé dva profily strojů jsou. Pokud je rozdíl mezi hodnotami vyšší než specifikovaná tolerance, požádejte uživatele, aby se znovu aktivoval. 

Za posledních 8 let jsme zjistili, že se používají stovky tisíc koncových uživatelů, kteří tuto kombinaci dobře fungují, aby poskytovali spolehlivě jedinečné ID stroje - dokonce i pro virtuální počítače a klonované instalace operačního systému.

30
Paul Alexander

A co právě použití UniqueID procesoru?

2
gizmo

Nesnáším se být ten, kdo říká: "Jen to děláš špatně" (vždycky toho chlapa nenávidím), ale ...

Musí být opakovaně generován pro jedinečný stroj? Můžete přiřadit identifikátor nebo provést veřejný/soukromý klíč? Možná, že kdybyste mohli generovat a ukládat hodnotu, můžete k ní přistupovat z obou instalací operačního systému na stejném disku?

Pravděpodobně jste prozkoumali tyto možnosti a nefungují pro vás, ale pokud ne, je to něco, co je třeba zvážit.

Pokud se nejedná o důvěru uživatele, stačí použít MAC adresy.

2
Sam Hoice

V mém programu nejprve zkontroluji terminálový server a použiji WTSClientHardwareId. Jinak by MAC adresa lokálního PC měla být adekvátní.

Pokud opravdu chcete použít seznam vlastností, které jste poskytli, vynechejte věci jako Name a DriverVersion, Clockspeed atd., Protože je to možná závislé na OS. Vyzkoušejte výstup stejných informací na obou operačních systémech a vynechejte to, co se liší.

1
AngelBlaZe

Měli byste se podívat na použití adresy MAC na síťové kartě (pokud existuje). Ty jsou obvykle jedinečné, ale mohou být vyrobeny. Použil jsem software, který generuje jeho licenční soubor na základě MAC adresy vašeho síťového adaptéru, takže je považován za poměrně spolehlivý způsob, jak rozlišovat mezi počítači.

1
Kyle Cronin

K dispozici je knihovna pro získání hardwarově specifických informací: extraktor hardwarového sériového čísla (CPU, RAM, HDD, BIOS)

1
ariwez

Pro jednu z mých aplikací buď použiju název počítače, pokud se jedná o počítač, který není doménou, nebo identifikátor SID účtu počítače pro počítače domény. Mark Russinovich o tom hovoří v tomto příspěvku blogu, Machine SID :

Posledním případem, kdy by se mělo jednat o duplikaci SID, je to, zda distribuovaná aplikace používá k identifikaci počítačů SID počítače. Žádný software společnosti Microsoft tak neučiní a použití SID počítače tímto způsobem nefunguje jen pro to, že všechny DC mají stejný stroj SID. Software, který se spoléhá na jedinečné identity počítačů, používá názvy počítačů nebo doménové SID (SID účtů počítače v doméně). 

Přístup k účtu SID účtu domény pomocí protokolu LDAP nebo System.DirectoryServices.

1
cmcginty

Proč nepoužívat MAC adresu vaší síťové karty?

0
Brian Matthews

Možná trochu podvádí, ale MAC adresa počítače Ethernetový adaptér se zřídka mění bez toho, aby se v těchto dnech měnila základní deska.

0
bfabry

Můžete vytáhnout nějaké sériové číslo výrobce nebo servisní značku?

Náš obchod je obchod Dell, takže používáme servisní značku, která je pro každý stroj jedinečná, aby je identifikovala. Vím, že to může být dotazováno z BIOSu, alespoň v Linuxu, ale nevím, jak to udělat ve Windows.

0

Měl jsem další omezení, používal jsem .net express, takže jsem nemohl použít standardní hardwarový dotazovací mechanismus. Rozhodl jsem se tedy použít Power Shell na dotaz. Celý kód vypadá takto:

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
0
user2515235