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
closeEnough
funkcję, 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.Miałem ten sam problem i po krótkich poszukiwaniach zdecydowałem, że najlepiej będzie wczytać
MachineGuid
klucz rejestruHKEY_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).
źródło
W naszym narzędziu do licencjonowania bierzemy pod uwagę następujące komponenty
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.
źródło
A co powiesz na użycie unikalnego identyfikatora procesora?
źródło
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.
źródło
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.
źródło
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 :
Możesz uzyskać dostęp do identyfikatora SID konta komputera domeny za pośrednictwem protokołu LDAP lub
System.DirectoryServices
.źródło
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
Name
iDriverVersion
,Clockspeed
itp, 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ą.źródło
Dostępna jest biblioteka do pobierania informacji dotyczących konkretnego sprzętu: Ekstraktor numeru seryjnego sprzętu (procesor, pamięć RAM, dysk twardy, BIOS)
źródło
Dlaczego nie użyć adresu MAC swojej karty sieciowej?
źródło
Może trochę oszukuje, ale adres MAC adaptera Ethernet maszyny rzadko się zmienia bez zmiany płyty głównej w dzisiejszych czasach.
źródło
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.
źródło
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:
źródło
Wyszukaj CPUID dla jednej opcji. W przypadku systemów wieloprocesorowych mogą wystąpić pewne problemy.
źródło
Spróbuj tego, daje unikalny identyfikator dysku twardego: Port of DiskId32 dla Delphi 7-2010 .
źródło