Unikalny numer komputera

0

Witam,

czy ktoś z Was wie może jak wygenerować unikalny numer maszyny? Próbowałam z wygenerowaniem numeru seryjnego dysku twardego, który znalazłam na torrys.net ale coś mi to nie wychodziło. Pytam bo potrzebne mi to do rozróżniania komputerów w sieci a kombinacja adres ip + nazwa użytkownika się nie sprawdza (jak zapewne wiecie jest szansa, że trafią się komputery z adresem IP 192.168.0.1 i nazwą użytkownika Administrator).

Pozdrawiam!

PS. Nie chodzi mi o numer aktualnej sesji bo to nie rozwiązuje problemu.

1

użyj MAC adresu.

0

Po pierwsze do czego dokładnie chcesz to wykorzystać?
Po drugie o jakiej sieci mowa? Lokalnej, firmowej, globalnej?

0

@Kaska1988 - jeśli potrzebujesz mieć unikalny numer, to skorzystaj z unikalnych elementów; Ani adres IP, ani nazwa użytkownika nimi nie są, nawet MAC adres karty sieciowej może się powtarzać (można go komuś zwędzić), choć to bardzo rzadka sytuacja; Poza tym jeden komputer może mieć wiele kart sieciowych, stąd wiele adresów MAC - trzeba by ustalić jak to wykonać; Co nie zmienia faktu, że rozróżnianie po MACu to jeden z lepszych pomysłów;

Możesz też sprawdzać numery seryjne podzespołów - dysku twardego, płyty głównej, one raczej się nie powtarzają; Albo najlepiej łączyć kilka z nich i tworzyć jakiś hash (miksturę z różnych danych), będzie mniejsza szansa zdublowania numeru wynikowego.

0

Sam MAC karty jest bardzo słabym pomysłem, bo można go dowolnie zmieniać i powstaje problem z wybraniem MACa jeśli w systemie jest zainstalowanych kilka kart (nie koniecznie fizycznych, mogą być też wirtualne). Tak jak napisał @furious programming lepiej użyć identyfikatorów sprzętu: typ/model/numer seryjny procesora, numer seryjny płyty głównej, numer seryjny dysku na którym aplikacja jest zainstalowana, numer seryjny/producent karty graficznej lub identyfikatorów systemu np. numer seryjny, numer aktywacyjny, GUID systemu, wersja, etc. Mając te informacje można stworzyć HWID wykorzystując jedną z funkcji hashujących np. md5, sha. Korzystając z tej metody trzeba pamiętać żeby przynajmniej jeden z wybranych identyfikatorów był unikalny.

HWID := funkcja hashująca(jak największy zbiór identyfikatorów);

Mały przykład funkcji odczytujących identyfikatory z rejestru:

function getBiosInfo: string;
begin
    Result := '';
    try
        Registry.OpenKeyReadOnly('\HARDWARE\DESCRIPTION\System\BIOS\');
        Result := Registry.ReadString('BIOSVendor');
        Result := Result + ' ' + Registry.ReadString('BIOSVersion');
    except
    end;
end;

function getCPUID: string;
begin
    Result := '';
    try
        Registry.OpenKeyReadOnly('\HARDWARE\DESCRIPTION\System\CentralProcessor\0');
        Result := Registry.ReadString('Identifier');
        Result := Result + ' ' + Registry.ReadString('ProcessorNameString');
    except
    end;
end;

function getUniqueID: string;
begin
    Result := '';
    try
        Registry.OpenKeyReadOnly('\SOFTWARE\Microsoft\Cryptography');
        Result := Registry.ReadString('MachineGuid');
    except
    end;
end;
1

Sam MAC karty jest bardzo słabym pomysłem, bo można go dowolnie zmieniać

To wszystko zależy w jakim celu ma być identyfikacja komputerów przeprowadzana.

Czy to jest DRM, gdzie zakładamy że każdy użytkownik to haker zdeterminowany by położyć system?
Czy może komputery są firmowe, i chcemy prowadzić ich jakąś ewidencję?

Bez odpowiedzi na pytanie "po co to" nie da się udzielić sensownej rady.

0
Registry.OpenKeyReadOnly('\HARDWARE\DESCRIPTION\System\BIOS\');

dupa, bo w win64 nie ma takiego klucza.

dodanie znacznika <code class="delphi"> - furious programming

1

Jak to nie ma:

uses Registry;

function getBiosInfo: string;
var
  Reg: TRegistry;
begin
  Result := '';
  Reg:= TRegistry.Create;
  try
    Reg.RootKey:= HKEY_LOCAL_MACHINE;
    Reg.OpenKeyReadOnly('\HARDWARE\DESCRIPTION\System\BIOS\');
    Result := Reg.ReadString('BIOSVendor');
    Result := Result + ' ' + Reg.ReadString('BIOSVersion');
  finally
  Reg.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(getBiosInfo);
end;
0

Wszystko fajnie, ale:
funkcja getBiosInfo - ta funkcja działa mi tylko na Win7, pod XP nie zwraca nic
funkcje getCPUID i getUniqueId nie zwracają mi nic zarówno pod win7 (x86) i WinXP (x86) ;/

1

Po pierwsze: tak jak poprzednicy zauważyli, przydałaby się informacja do czego autor(ka) tematu zamierza ten HWID wykorzystać.
Po drugie: to co podałem to był tylko mały PRZYKŁAD, a nie gotowiec :P Ale skoro już zaczęliście sprawdzać dostępność to:

WinXP x86 - nie ma klucza BIOS, reszta powinna być

Win Vista x86 - wszystko powinno być
Win Vista x64 - wszystko powinno być

Win7 x86 - wszystko powinno być
Win7 x64 - wszystko powinno być

Win8 x86 - wszystko powinno być
Win8 x64 - wszystko powinno być

Systemy były co najmniej w wersji Professional ze wszystkimi dostępnymi aktualizacjami. Najważniejszy z tych kluczy - "MachineGuid" był dostępny w każdej testowanej wersji systemu, reszta może zależeć od konfiguracji sprzętowej.

Jeśli chodzi o samo generowanie HWID to nie ma znaczenia, czy wszystkie identyfikatory zostaną odczytane. Wystarczy, że mamy minimum jeden, który jest unikalny i zawsze dostępny. Finalnie i tak wszystkie powinny być hashowane.

0

Ja czytałem to w XP, i zawsze tam to było.

W 7 64 nie było, ale teraz patrzę i widzę że się cudownie pojawiły.
Pewnie to jakaś usługa tam zapisuje, i przed jej odpaleniem tego nie ma.

Też takiego sprzętowego numera potrzebowałem... do sprawdzania legalności softu.

Myślałem też o czytaniu wprost z dysku daty utworzenia katalogu systemowego, zwykle Windows,
Ale to jest trochę do d**y, bo po reinstalacji windows użytkownik musiałby aktywować program od nowa,
a ja nawet nie wiedziałbym czy on tego na komputerze kolegi nie aktywuje. :)

0

Po prostu zaczęłam pisać swój komunikator i zastanawiałam się jak rozwiązać sprawę rozróżniania komputerów. Póki co rozwiązałam to kombinacją NazwaUsera_NazwaKomputera.

0

Wycinam jedną cześć ze swojej biblioteki. Moim zdaniem szansa na powtórkę mała.

{ Pobieranie numeru seryjnego płyty głównej }
function GetMotherBoardSerial: String;
var
  objWMIService: OLEVariant;
  colItems: OLEVariant;
  colItem: OLEVariant;
  oEnum: IEnumvariant;
  iValue: LongWord;

  function GetWMIObject(const objectName: String): IDispatch;
  var
    chEaten: Integer;
    BindCtx: IBindCtx;
    Moniker: IMoniker;
  begin
    OleCheck(CreateBindCtx(0, BindCtx));
    OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker));
    OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));
  end;

begin
  Result := '';
  objWMIService := GetWMIObject('winmgmts:\\localhost\root\cimv2');
  colItems := objWMIService.ExecQuery('SELECT SerialNumber FROM Win32_BaseBoard', 'WQL', 0);
  oEnum := IUnknown(colItems._NewEnum) as IEnumvariant;
  if oEnum.Next(1, colItem, iValue) = 0 then
    Result := VarToStr(colItem.SerialNumber);
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1