windows - genererer et unikt maskin-id

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skal skrive en funktion, der genererer et id, der er unikt for en given maskine, der kører et Windows OS.


I øjeblikket bruger jeg WMI til at forespørge forskellige hardwareparametre og sammenkæde dem sammen og hash dem til at udlede det unikke id. Mit spørgsmål er, hvad er de foreslåede parametre, jeg skal bruge?
I øjeblikket bruger jeg en kombination af bios \ cpu \ diskdata til at generere det unikke id. Og jeg bruger det første resultat, hvis der findes flere resultater for hver beregning.


Men jeg løb ind i et problem, hvor en maskine, der støder dobbelt i 2 forskellige Windows OS, genererer forskellige webstedskoder på hvert OS, hvilket ideelt set ikke skal ske.


Til reference er disse de metrics jeg bruger i øjeblikket:


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

Bedste reference


Parse SMBIOS selv og hash det til en vilkårlig længde. Se PDF-specifikationen for alle SMBIOS-strukturer til rådighed. [12] [13]


For at søge SMBIOS-info fra Windows kan du bruge EnumSystemFirmwareEntries, EnumSystemFirmwareTables og GetSystemFirmwareTable. [14] [15] [16]


IIRC, den 'unikke id' fra CPUID-instruktionen fjernes fra P3 og nyere.

Andre referencer 1


Jeg havde det samme problem, og efter lidt forskning besluttede jeg det bedste ville være at læse MachineGuid i registreringsdatabasenøgle HKEY\_LOCAL\_MACHINESOFTWAREMicrosoftCryptography, som @Agnus foreslog. Det genereres under OS installation og vil ikke ændres, medmindre du laver en anden frisk OS-installation. Afhængigt af OS versionen kan det indeholde netværksadapter MAC-adressen indlejret (plus nogle andre tal, inklusive tilfældige) eller et pseudorandom nummer, den senere for nyere OS versioner (efter XP SP2 tror jeg, men ikke sikker). Hvis det er 'teoretisk set kan det smedes - hvis to maskiner har samme startstatus, herunder realtidsur. I praksis vil dette være sjældent, men vær opmærksom på, om du forventer, at det er en base for sikkerhed, der kan angribes af hardcore hackere.


Selvfølgelig kan en registreringsdatabase også nemt ændres af enhver til at forfalske en maskin GUID, men hvad jeg fandt er, at dette ville forstyrre normal drift af så mange komponenter i Windows, at i de fleste tilfælde ikke nogen almindelig bruger ville gøre det (igen, pas på for hardcore hackere).

Andre referencer 2


Med vores licensværktøj overvejer vi følgende komponenter [17]



  • MAC-adresse

  • CPU (ikke serienummeret, men den faktiske CPU profil som stepping og model)

  • Systemdrev serienummer (ikke volumen etiket)

  • Hukommelse

  • CD-ROM-model & leverandør

  • Videokort model & leverandør

  • IDE Controller

  • SCSI Controller



Men i stedet for at bare hashing komponenterne og skaber et pass/fail-system, skaber vi et sammenligneligt fingeraftryk, som kan bruges til at bestemme, hvordan forskellige to maskinprofiler er. Hvis differencestigelsen er over en angivet tolerance, så spørg brugeren om at aktivere igen. [18]


Vi har fundet de sidste 8 år i brug med hundredtusinder af slutbrugerinstallationer, at denne kombination fungerer godt for at give et pålideligt unikt maskin-id - også til virtuelle maskiner og klonede OS-installationer.

Andre referencer 3


Jeg hader at være den fyr, der siger, 'du gør det bare forkert' (jeg hader altid den fyr;) men ...


Skal det genoprettes for den unikke maskine? Kunne du bare tildele identifikatoren eller gøre en offentlig/privat nøgle? Måske hvis du kunne generere og gemme værdien, kunne du få adgang til den fra begge operativsystemer på samme disk?


Du har sikkert udforsket disse muligheder, og de arbejder ikke for dig, men hvis ikke, er det noget at overveje.


Hvis det ikke er et spørgsmål om brugerens tillid, kan du bare bruge MAC-adresser.

Andre referencer 4


Hvad med bare at bruge processorens UniqueID?

Andre referencer 5


Du bør undersøge, om du bruger MAC-adressen på netværkskortet (hvis den findes). Disse er normalt unikke, men kan fremstilles. Jeg har brugt software, der genererer sin licensfil baseret på din MAC-adresse på netværksadapteren, så det anses for en ret pålidelig måde at skelne mellem computere.

Andre referencer 6


For et af mine applikationer bruger jeg enten computernavnet, hvis det er en ikke-domæne-computer eller domæneautomaten SID for domænecomputere. Mark Russinovich taler om det i dette blogindlæg, Machine SID: [19]



  Det endelige tilfælde, hvor SID-duplikering ville være et problem, er, hvis en distribueret applikation brugte maskinens SID'er til unikt at identificere computere. Ingen Microsoft-software gør det, og at bruge SID'en på den måde virker ikke kun for, at alle DC'er har samme MPS-SID. Software, der er afhængig af unikke computeridentiteter, bruger enten computernavne eller computer Domain SIDs (SID'en til computerens konti i domænet).



Du kan få adgang til domænet Maskinen konto SID via LDAP eller System.DirectoryServices.

Andre referencer 7


I mit program kigger jeg først til Terminal Server og bruger WTSClientHardwareId. Ellers skal den lokale pc's MAC-adresse være tilstrækkelig.


Hvis du virkelig vil bruge listen over egenskaber, du har angivet, skal du udelade ting som Name og DriverVersion, Clockspeed osv., Da det muligvis er afhængigt af OS. Prøv at udlevere samme information om begge operativsystemer og forlade det, der adskiller sig fra.

Andre referencer 8


Hvorfor ikke bruge MAC-adressen på dit netværkskort?

Andre referencer 9


Måske snyder lidt, men MAC-adressen på en Ethernet-adapter til maskiner ændres sjældent, uden at bundkortet ændrer disse dage.

Andre referencer 10


Kan du trække en slags producentens serienummer eller servicekode?


Vores butik er en Dell-butik, så vi bruger servicekoden, som er unik for hver maskine til at identificere dem. Jeg ved, at det kan forespørges fra BIOS, i hvert fald i Linux, men jeg ved ikke, hvordan man gør det i Windows.

Andre referencer 11


Der er et bibliotek til rådighed for at få hardwarespecifikke oplysninger: Hardware serienummerudtræk (CPU, RAM, HDD, BIOS) [20]

Andre referencer 12


Jeg havde en yderligere begrænsning, jeg brugte. Net Express, så jeg ikke kunne bruge standard hardware forespørgslen mekanisme. Så jeg besluttede at bruge magt shell til at gøre forespørgslen. Den fulde kode ser sådan ud:


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

Andre referencer 13


Kig op CPUID til en mulighed. Der kan være nogle problemer med multi-CPU-systemer.

Andre referencer 14


Prøv denne, den giver et unikt harddisk ID: Port DiskId32 til Delphi 7-2010. [21]