Einzelnen Beitrag anzeigen

Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
454 Beiträge
 
Delphi XE4 Professional
 
#1

ProductID auslesen zwecks "Kopierschutz"

  Alt 26. Mai 2015, 09:58
Hallo Leute,

ich möchte gerne einen "eindeutigen" String eines WindowsOS auslesen..
Gegal ob UAC aktiv oder nicht
Egal ob 32 oder 64 Bit Windows
Egal ob reale Maschine oder virtuelle Maschine
Egal ob uraltes oder neuestes Betriebssystem
Egal - welche Userberechtigung anliegt

Anhand dieses Strings würde ich dann online "nachschauen" - ob der Rechner eine gültige Nutzungslizenz besitzt.


Hab momentan die unten ageführten Zeilen:

Ist das eurer Meinung nach ne brauchbare Lösung (auch in Bezug auf Win10?)

Vielen Dank für Infos

Erich



Delphi-Quellcode:
function TMainForm.GetWindowsRegistryValuesA: string;
const
  CDataValue1: string = 'DigitalProductId';
  CDataValue2: string = 'DigitalProductId4';
  CKeyName: string = 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\';
var
  Reg: TRegistry;
  message_string:String;
  vSize, p: integer;
  tmpStr: AnsiString;
begin

  message_string:='Keine Werte gefunden';

  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if (Reg.OpenKeyReadOnly(CKeyName)) then
    begin
      try

        if Reg.ValueExists(CDataValue1) then // 32 Bit OS
              begin
              vSize := reg.GetDataSize(CDataValue1);
              if (vSize > 0) then
              begin
                SetLength(tmpStr, vSize);
                reg.ReadBinaryData(CDataValue1, tmpstr[1], vSize);
                repeat
                  p := Pos(#0, tmpStr);
                  if p <> 0 then
                    Delete(tmpStr, p, 1);
                until p = 0;
                message_string :='ProductID 32bit:'+ tmpStr;
              end;
              end;

        if Reg.ValueExists(CDataValue2) then // 64 Bit OS
              begin
              vSize := reg.GetDataSize(CDataValue2);
              if (vSize > 0) then
              begin
                SetLength(tmpStr, vSize);
                reg.ReadBinaryData(CDataValue2, tmpstr[1], vSize);
                repeat
                  p := Pos(#0, tmpStr);
                  if p <> 0 then
                    Delete(tmpStr, p, 1);
                until p = 0;
                message_string :='ProductID 64bit:'+ tmpStr;
              end;
              end;

      finally
        Reg.CloseKey;
      end;
    end;
  finally
    Reg.Free;
  end;

  showmessage(message_string);

end;
Erich Wanker - for life:=1971 to lebensende do begin ..
O
/H\
/ \

Geändert von erich.wanker (26. Mai 2015 um 10:07 Uhr)
  Mit Zitat antworten Zitat