Generowanie unikalnego identyfikatora maszyny

104

Muszę napisać funkcję, która generuje identyfikator, który jest unikalny dla danej maszyny z systemem operacyjnym Windows.

Obecnie używam usługi WMI do wykonywania zapytań o różne parametry sprzętowe, łączenia ich ze sobą i mieszania ich w celu uzyskania unikalnego identyfikatora. Moje pytanie brzmi, jakie są sugerowane parametry, których powinienem użyć? Obecnie używam kombinacji danych bios \ cpu \ disk, aby wygenerować unikalny identyfikator. I używam pierwszego wyniku, jeśli dla każdego wskaźnika istnieje wiele wyników.

Jednak napotkałem problem polegający na tym, że maszyna, która uruchamia się podwójnie w 2 różnych systemach operacyjnych Windows, generuje różne kody witryn w każdym systemie operacyjnym, co w idealnym przypadku nie powinno mieć miejsca.

Dla porównania, są to metryki, których obecnie używam:

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
HS.
źródło

Odpowiedzi:

25

Przeanalizuj SMBIOS samodzielnie i zhaszuj go do dowolnej długości. Zobacz specyfikację PDF dla wszystkich dostępnych struktur SMBIOS.

Kwerendy informacji SMBIOS z systemu Windows można użyć EnumSystemFirmwareEntries, EnumSystemFirmwareTablesi GetSystemFirmwareTable.

IIRC, „unikalny identyfikator” z instrukcji CPUID, jest przestarzały w P3 i nowszych.

Jonas Gulle
źródło
14
Należy pamiętać, że te funkcje wymagają co najmniej systemu Windows Vista, Windows XP Professional x64 Edition, Windows Server 2008 lub Windows Server 2003 z dodatkiem SP1.
jcoffland
33
Uwaga, aby nie robić tego, co zrobiłem, a mianowicie wywołać GetSystemFirmwareTable ('RSMB' ...); i haszuj cały bufor SMBIOSTableData. Działało świetnie, dopóki nie natrafiłem na stację roboczą, która zapisywała swoją wewnętrzną temperaturę procesora do tej tabeli, co oznacza, że ​​mój unikalny identyfikator zmienia się co kilka sekund.
Thomas
Czy jest dostępny kod źródłowy tego rozwiązania?
Just Shadow,
@Thomas więc jakie rozwiązanie ostatecznie wybrałeś?
Smith
@Smith Moim celem był mały identyfikator składający się z 8 znaków. Czytając specyfikację, podjąłem decyzje, które pola mogą się różnić i je wykluczyłem. Następnie przez wiele lat wycinałem więcej pól, które nie są stałymi z maszyn. W końcu zapisałem zaszyfrowaną kopię surowych danych, których użyłem jako dane wejściowe, i utworzyłem closeEnoughfunkcję, aby zaakceptować niepasujący identyfikator, jeśli różni się tylko w 2 polach. W skrócie dołączam również szczegóły dotyczące procesora i dysku twardego systemu, ponieważ na początku miałem kolizje między identycznymi systemami.
Thomas
72

Miałem ten sam problem i po krótkich poszukiwaniach zdecydowałem, że najlepiej będzie wczytać MachineGuidklucz rejestru HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography, jak zasugerował @Agnus. Jest generowany podczas instalacji systemu operacyjnego i nie zmieni się, chyba że wykonasz kolejną nową instalację systemu operacyjnego. W zależności od wersji systemu operacyjnego może zawierać wbudowany adres MAC karty sieciowej (plus kilka innych liczb, w tym losowych) lub numer pseudolosowy, późniejszy dla nowszych wersji systemu operacyjnego (po XP SP2, myślę, ale nie jestem pewien). Jeśli jest to pseudolosowy, teoretycznie można go sfałszować - jeśli dwie maszyny mają ten sam stan początkowy, w tym zegar czasu rzeczywistego. W praktyce będzie to rzadkie, ale pamiętaj, jeśli spodziewasz się, że będzie to podstawa bezpieczeństwa, która może zostać zaatakowana przez zagorzałych hakerów.

Oczywiście każdy może łatwo zmienić wpis rejestru, aby sfałszować identyfikator GUID komputera, ale odkryłem, że zakłóciłoby to normalne działanie tak wielu komponentów systemu Windows, że w większości przypadków nie zrobiłby tego żaden zwykły użytkownik (ponownie uważaj dla zapalonych hakerów).

Fabio Ceconello
źródło
6
Możesz użyć flagi KEY_WOW64_64KEY, aby upewnić się, że zawsze otrzymujesz „prawdziwą” wersję klucza rejestru.
Colen
13
Jeśli sklonujesz obraz dysku, pozostanie taki sam. Więc to wcale nie jest bezpieczne przed manipulacją i bardzo niebezpieczne.
bitbonk
19
Aby wyjaśnić sprawę, kiedy umieszczam środki DRM w oprogramowaniu, moim głównym celem jest zapobieżenie stworzeniu crack, który umożliwia „zawodowym” piratom sprzedaż nielegalnych kopii oprogramowania bez żadnych ograniczeń. Nie martwię się zbytnio o hakera, który klonuje dysk swojego przyjaciela tylko po to, by móc korzystać z mojego oprogramowania. W takich przypadkach ci ludzie zwykle mają więcej czasu niż pieniędzy i i tak by za to nie płacili. Jeśli oprogramowanie kosztuje 100 USD, a Twoja pensja przekracza 50 USD / h, po prostu za nie płacisz. Kłopot zajmie więcej czasu niż 2 godziny.
Fabio Ceconello,
7
W szczególności w środowisku, w którym system Windows jest instalowany przez klonowanie obrazu maszyny głównej, MachineGuid będzie identyczny dla wszystkich.
nandhp
8
Nie, jeśli zrobisz to poprawnie i legalnie, używając sysprep & all. Dla tych, którzy mają pirackie kopie Windows i „tylko klonują”, to inna sprawa. Ale i tak nie dałoby się ich tak łatwo zatrzymać.
Fabio Ceconello,
34

W naszym narzędziu do licencjonowania bierzemy pod uwagę następujące komponenty

  • Adres MAC
  • Procesor (nie numer seryjny, ale rzeczywisty profil procesora, taki jak krok i model)
  • Numer seryjny dysku systemowego (nie etykieta woluminu)
  • Pamięć
  • Model i dostawca CD-ROM
  • Model i dostawca karty graficznej
  • Kontroler IDE
  • Kontroler SCSI

Jednak zamiast po prostu haszować komponenty i tworzyć system pass / fail, tworzymy porównywalny odcisk palca, który można wykorzystać do określenia, jak różne są dwa profile maszyn. Jeśli ocena różnicy jest powyżej określonej tolerancji, poproś użytkownika o ponowną aktywację.

W ciągu ostatnich 8 lat użytkowania z setkami tysięcy instalacji użytkowników końcowych stwierdziliśmy, że ta kombinacja działa dobrze, zapewniając niezawodnie unikalny identyfikator maszyny - nawet w przypadku maszyn wirtualnych i sklonowanych instalacji systemu operacyjnego.

Paul Alexander
źródło
1
Jak określić, którego adresu MAC używasz? Maszyna może mieć wiele kart sieciowych, które są dodawane dynamicznie (połączenie z nową siecią VPN za pośrednictwem apletu spowoduje dodanie wirtualnej karty sieciowej). Niektóre są wirtualne, mają typ Ethernet i są trudne do zidentyfikowania jako wirtualne. Inne są w górę / w dół w zależności od warunków sieciowych (wifi)
Marek
Używamy wszystkich fizycznych kart sieciowych - z wyłączeniem wirtualnych kart sieciowych, niebieskich zębów itp. Wszystkie są połączone w celu utworzenia ujednoliconego skrótu.
Paul Alexander,
Dlaczego nie zaleca się używania numeru seryjnego procesora?
Mojtaba Rezaeian
3
Numer seryjny procesora nie był włączony w chipie Intela od lat. Wywołania systemowe nadal istnieją, ale nie zwracają stabilnej wartości. Nie pamiętam, co zwraca - albo dane fikcyjne, albo tę samą wartość dla wszystkich maszyn. tak czy inaczej nie jest to wiarygodna miara sprzętu.
Paul Alexander
1
@PaulAlexander narzędzie, o którym wspomniałeś, sprawdza poprawność wszystkich wymienionych parametrów, czy tylko kilka z nich będzie działać? Ponieważ systemy teraz dzień zwykle nie składają się z CD-ROMu
FaizanHussainRabbani
3

A co powiesz na użycie unikalnego identyfikatora procesora?

gadżet
źródło
14
Czy to nie jest obecnie amortyzowana nieruchomość?
Jake Wilson
15
Być może ma na myśli „przestarzałe” ... Producenci procesorów zaczęli wprowadzać unikalne identyfikatory na pewnym etapie, ale z powodu luzu w kwestiach prywatności ponownie przestali. Przekonasz się, że niektóre mają unikalny identyfikator, ale większość nowoczesnych procesorów nie.
TripleAntigen
1
Dla porównania, tylko krótka partia Pentium III miała kiedykolwiek numery seryjne procesorów, które można było odczytać. Podczas gdy nowsze wersje miały numer seryjny, był on domyślnie wyłączony. Procesory Pentium IV i nowsze po prostu w ogóle go nie obsługiwały.
Paul Alexander
2

Nienawidzę być facetem, który mówi „po prostu robisz to źle” (zawsze nienawidzę tego faceta;), ale ...

Czy musi być powtarzalnie generowany dla unikalnej maszyny? Czy możesz po prostu przypisać identyfikator lub zrobić klucz publiczny / prywatny? Może gdybyś mógł wygenerować i zapisać wartość, mógłbyś uzyskać do niej dostęp z obu instalacji systemu operacyjnego na tym samym dysku?

Prawdopodobnie odkryłeś te opcje i nie działają one dla Ciebie, ale jeśli nie, to warto rozważyć.

Jeśli nie jest to kwestia zaufania użytkownika, możesz po prostu użyć adresów MAC.

Jonathan Adelson
źródło
5
Adresy MAC nie będą działać, jeśli urządzenie nie ma karty sieciowej.
Brian
7
@Brian - czy naprawdę potrzebujesz unikalnej wartości, aby zidentyfikować komputer bez karty sieciowej? Wydaje się całkiem bezpieczny zakład, że automat ma kartę.
romandy
1

Powinieneś sprawdzić użycie adresu MAC na karcie sieciowej (jeśli istnieje). Zwykle są one wyjątkowe, ale można je wytworzyć. Użyłem oprogramowania, które generuje plik licencji na podstawie adresu MAC karty sieciowej, więc jest uważane za dość niezawodny sposób rozróżniania komputerów.

Kyle Cronin
źródło
6
Nie, nie są. Wielu producentów pozwala na ich zmianę. Jest to bardzo pomocne podczas pracy z klastrami, ponieważ niektórzy dostawcy oferują wszystkie komputery z tym samym adresem MAC (napotkaliśmy ten problem kilka lat temu).
gizmo,
Jest to dobry pomysł w wielu przypadkach, pytanie nie określa | t spoof-proodness lub offline - generalnie chcesz wygenerować unikalny identyfikator, jeśli chcesz zidentyfikować się w sieci
Hurda
Możliwe jest posiadanie wielu urządzeń sieciowych na tym samym komputerze; nie masz gwarancji, że zawsze będą wykrywane w tej samej kolejności lub że w pewnym momencie nie zostaną wymienione. Lepiej jest użyć sprzętu, który prawdopodobnie będzie trwalszy.
Agi Hammerthief
1

W przypadku jednej z moich aplikacji używam nazwy komputera, jeśli nie jest to komputer należący do domeny, lub identyfikatora SID konta komputera domeny dla komputerów domeny. Mark Russinovich mówi o tym w tym poście na blogu Machine SID :

Ostatnim przypadkiem, w którym duplikowanie identyfikatorów SID byłoby problemem, jest sytuacja, w której rozproszona aplikacja używała identyfikatorów SID komputerów do jednoznacznej identyfikacji komputerów. Żadne oprogramowanie firmy Microsoft tego nie robi, a używanie identyfikatora SID komputera w ten sposób nie działa tylko z powodu faktu, że wszystkie kontrolery domeny mają ten sam identyfikator SID komputera. Oprogramowanie, które opiera się na unikalnych tożsamościach komputerów, wykorzystuje nazwy komputerów lub identyfikatory SID domeny komputera (identyfikatory SID kont komputerów w domenie).

Możesz uzyskać dostęp do identyfikatora SID konta komputera domeny za pośrednictwem protokołu LDAP lub System.DirectoryServices.

cmcginty
źródło
1

W moim programie najpierw sprawdzam serwer terminali i używam WTSClientHardwareId. W przeciwnym razie adres MAC lokalnego komputera powinien być odpowiedni.

Jeśli naprawdę chcesz używać listę właściwości podałeś opuścić rzeczy, jak Namei DriverVersion, Clockspeeditp, ponieważ jest to prawdopodobnie OS zależne. Spróbuj wyświetlić te same informacje w obu systemach operacyjnych i pomiń te, które się różnią.

AngelBlaZe
źródło
0

Dlaczego nie użyć adresu MAC swojej karty sieciowej?

Brian Matthews
źródło
14
Adres Mac można sfałszować
Henry B
Jest to dobry pomysł w wielu przypadkach, pytanie nie określa | t spoof-proodness lub offline - generalnie chcesz wygenerować unikalny identyfikator, jeśli chcesz identyfikować się w sieci
Hurda
0

Może trochę oszukuje, ale adres MAC adaptera Ethernet maszyny rzadko się zmienia bez zmiany płyty głównej w dzisiejszych czasach.

bfabry
źródło
Wielu producentów pozwala na ich zmianę. Jest to bardzo pomocne podczas pracy z klastrami, ponieważ niektórzy dostawcy oferują wszystkie komputery z tym samym adresem MAC (napotkaliśmy ten problem kilka lat temu).
gizmo
1
MAC jest całkowicie zawodny, ponieważ można go tak łatwo zmienić (wystarczy wyszukać google, a zobaczysz wiele bezpłatnych narzędzi, które to robią). To samo dotyczy WMI.
InTheNameOfScience
0

Czy możesz pobrać jakiś numer seryjny producenta lub tag serwisowy?

Nasz sklep to sklep firmy Dell, więc do ich identyfikacji używamy numeru seryjnego, który jest unikalny dla każdej maszyny. Wiem, że można o to zapytać z BIOS-u, przynajmniej w Linuksie, ale nie wiem od razu, jak to zrobić w Windowsie.

Christopher Cashell
źródło
0

Miałem dodatkowe ograniczenie, używałem .net express, więc nie mogłem używać standardowego mechanizmu zapytań sprzętowych. Postanowiłem więc użyć powłoki zasilania, aby wykonać zapytanie. Pełny kod wygląda następująco:

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
user2515235
źródło
-1

Wyszukaj CPUID dla jednej opcji. W przypadku systemów wieloprocesorowych mogą wystąpić pewne problemy.

BCS
źródło