Domanda

Devo scrivere una funzione che generi un ID univoco per una determinata macchina che esegue un sistema operativo Windows.

Attualmente utilizzo WMI per interrogare vari parametri hardware, concatenarli insieme e sottoporli ad hash per ricavare l'ID univoco.La mia domanda è: quali sono i parametri suggeriti che dovrei utilizzare?Attualmente sto utilizzando una combinazione di dati bios\cpu\disco per generare l'ID univoco.E sto utilizzando il primo risultato se sono presenti più risultati per ciascuna metrica.

Tuttavia, ho riscontrato un problema per cui una macchina che esegue il doppio avvio in 2 diversi sistemi operativi Windows genera codici sito diversi su ciascun sistema operativo, cosa che idealmente non dovrebbe verificarsi.

Per riferimento, queste sono le metriche che sto attualmente utilizzando:

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
È stato utile?

Soluzione

Analizzare il SMBIOS te stesso e hash ad una lunghezza arbitraria.Vedi il Specifica PDF per tutte le strutture SMBIOS disponibili.

Per interrogare le informazioni SMBIOS da Windows potresti usare EnumSystemFirmwareEntries, EnumSystemFirmwareTables E GetSystemFirmwareTable.

IIRC, l'"ID univoco" dell'istruzione CPUID è deprecato da P3 e versioni successive.

Altri suggerimenti

Ho avuto lo stesso problema e dopo una piccola ricerca ho deciso che la cosa migliore sarebbe stata leggere MachineGuid nella chiave di registro HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography, come suggerito da @Agnus.Viene generato durante l'installazione del sistema operativo e non cambierà a meno che non si effettui un'altra nuova installazione del sistema operativo.A seconda della versione del sistema operativo, potrebbe contenere l'indirizzo MAC dell'adattatore di rete incorporato (più alcuni altri numeri, incluso quello casuale) o un numero pseudocasuale, il più tardivo per le versioni del sistema operativo più recenti (dopo XP SP2, credo, ma non ne sono sicuro).Se è pseudocasuale, teoricamente può essere falsificato, se due macchine hanno lo stesso stato iniziale, incluso l'orologio in tempo reale.In pratica, questo sarà raro, ma fai attenzione se ti aspetti che sia una base di sicurezza che può essere attaccata da hacker accaniti.

Ovviamente una voce di registro può anche essere facilmente modificata da chiunque per falsificare il GUID di una macchina, ma quello che ho scoperto è che ciò interromperebbe il normale funzionamento di così tanti componenti di Windows che nella maggior parte dei casi nessun utente normale lo farebbe (di nuovo, attenzione per hacker hardcore).

Con il nostro strumento di licenza consideriamo i seguenti componenti

  • Indirizzo MAC
  • CPU (non il numero di serie, ma il profilo effettivo della CPU come step e modello)
  • Numero di serie dell'unità di sistema (non etichetta del volume)
  • Memoria
  • Modello e fornitore del CD-ROM
  • Modello e fornitore della scheda video
  • Controllore IDE
  • Controller SCSI

Tuttavia, anziché limitarsi ad eseguire l'hashing dei componenti e creare un sistema pass/fail, creiamo un file impronta digitale comparabile che può essere utilizzato per determinare quanto sono diversi i due profili macchina.Se la valutazione della differenza è superiore a una tolleranza specificata, chiedere all'utente di effettuare nuovamente l'attivazione.

Negli ultimi 8 anni abbiamo riscontrato che questa combinazione, utilizzata da centinaia di migliaia di installazioni da parte degli utenti finali, funziona bene per fornire un ID macchina univoco e affidabile, anche per macchine virtuali e installazioni di sistemi operativi clonati.

Odio essere il tipo che dice "stai semplicemente sbagliando" (odio sempre quel ragazzo ;) ma...

Deve essere generato in modo ripetibile per la macchina unica?Potresti semplicemente assegnare l'identificatore o creare una chiave pubblica/privata?Forse se potessi generare e archiviare il valore, potresti accedervi da entrambe le installazioni del sistema operativo sullo stesso disco?

Probabilmente hai esplorato queste opzioni e non funzionano per te, ma in caso contrario è qualcosa da considerare.

Se non è una questione di fiducia dell'utente, potresti semplicemente utilizzare gli indirizzi MAC.

Che ne dici di usare semplicemente l'ID univoco del processore?

Dovresti esaminare l'utilizzo dell'indirizzo MAC sulla scheda di rete (se esiste).Di solito sono unici ma possono essere fabbricati.Ho utilizzato un software che genera il file di licenza in base all'indirizzo MAC della scheda di rete, quindi è considerato un modo abbastanza affidabile per distinguere tra computer.

Per una delle mie applicazioni, utilizzo il nome del computer se non è un computer di dominio oppure il SID dell'account del computer di dominio per i computer di dominio.Mark Russinovich ne parla in questo post del blog, ID macchina:

L'ultimo caso in cui la duplicazione del SID costituirebbe un problema è se un'applicazione distribuita utilizzasse i SID della macchina per identificare in modo univoco i computer.Nessun software Microsoft lo fa e l'utilizzo del SID della macchina in questo modo non funziona solo per il fatto che tutti i controller di dominio hanno lo stesso SID della macchina.Il software che si basa su identità di computer univoche utilizza nomi di computer o SID di dominio dei computer (il SID degli account computer nel dominio).

È possibile accedere al SID dell'account del computer del dominio tramite LDAP o System.DirectoryServices.

Nel mio programma controllo innanzitutto la presenza di Terminal Server e utilizzo WTSClientHardwareId.Altrimenti l'indirizzo MAC del PC locale dovrebbe essere adeguato.

Se vuoi davvero utilizzare l'elenco delle proprietà che hai fornito, tralascia cose come Name E DriverVersion, Clockspeed, eccetera.poiché probabilmente dipende dal sistema operativo.Prova a fornire le stesse informazioni su entrambi i sistemi operativi e tralascia ciò che differisce tra loro.

È disponibile una libreria per ottenere informazioni specifiche sull'hardware: Estrattore del numero di serie dell'hardware (CPU, RAM, HDD, BIOS)

Perché non utilizzare l'indirizzo MAC della tua scheda di rete?

Forse imbroglia un po', ma al giorno d'oggi l'indirizzo MAC dell'adattatore Ethernet di una macchina raramente cambia senza che la scheda madre cambi.

Puoi estrarre qualche tipo di numero di serie del produttore o tag di servizio?

Il nostro negozio è un negozio Dell, quindi utilizziamo il codice di matricola univoco per ogni macchina per identificarla.So che può essere interrogato dal BIOS, almeno in Linux, ma non so come farlo in Windows.

Avevo un vincolo aggiuntivo, stavo usando .net express quindi non potevo usare il meccanismo di query hardware standard.Quindi ho deciso di utilizzare Power Shell per eseguire la query.Il codice completo è simile al seguente:

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

Cerca CPUID per un'opzione.Potrebbero verificarsi alcuni problemi con i sistemi multi-CPU.

Prova questo, fornisce un ID disco rigido univoco: Porto di DiskId32 per Delphi 7-2010.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top