Entwickler-Ecke

Sonstiges (Delphi) - Auslesen der Windows-Product-ID (C++ -> Delphi)


Born-to-Frag - Di 18.07.06 14:33
Titel: Auslesen der Windows-Product-ID (C++ -> Delphi)
Hallo!

Ich habe hier einen Source mit dem ich (glaube ich :mrgreen:) den Product Key von meinem Windows auslesen kann..
Leider ist der Source in C++, was ich nicht kann.

Deswegen wollte ichi fragen ob ihn mir jemand übersetzen kann :)



Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
#include <iostream>
#include <windows.h>

int main () {
    //Zeichenvorrat Buchstaben,Ziffern ohne AEIOU01 (24)
    UCHAR digits[] = {'B','C','D','F','G','H','J','K','M','P','Q','R','T','V','W','X','Y','2','3','4','6','7','8','9'};
    PUCHAR strresult = new UCHAR[26];
    PUCHAR buf = new UCHAR[200];
   
    HKEY key = NULL;
    DWORD datasize = 200;
    DWORD dwRet = 0;

    ZeroMemory((PVOID)strresult,26);

    dwRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",0,KEY_READ,&key);                      
    dwRet = RegQueryValueEx(key,"DigitalProductID",NULL,NULL,(LPBYTE)buf,&datasize);
   
    if (dwRet != ERROR_SUCCESS) {
        return -1;
    }
   
    RegCloseKey(key);

    for (int i=24;i>=0;i--) {
        int x=0;

        for (int j=14;j>=0;j--) {
            x = (x<<8) + (buf+0x34)[j];
            (buf+0x34)[j] = x / 24;
            x = x % 24;
        }
        strresult[i]=digits[x];
    }
   
    std::cout << strresult;
   
    std::cin.get();
    return 0;
}


(Quelle [http://www.c-plusplus.de/forum/viewtopic-var-t-is-104590-and-start-is-0-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-.html-and-printview-is-1-and-start-is-0.html])


greetz


EDIT: Konkret verwirren mich die Zeilen 17 (Muss ich das mit ReadBinaryData machen?), 29 und 30 (die Operatoren versteh ich einfach nicht)


Narses - Di 18.07.06 16:21

Moin!

Probier das mal so: ;)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
function GetWinProductID: String;
  const
    Digits = 'BCDFGHJKMPQRTVWXY2346789';
  var
    Reg: TRegistry;
    Value: String;
    i,j,x: Integer;
begin
  Result := '';
  Reg := TRegistry.Create(KEY_READ);
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    Reg.OpenKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion',FALSE);
    SetLength(Value,Reg.GetDataSize('DigitalProductID'));
    if (Length(Value) >= 67then begin
      Reg.ReadBinaryData('DigitalProductID',Value[1],Length(Value));
      for i := 24 downto 0 do begin
        x := 0;
        for j := 14 downto 0 do begin
          x := (x shl 8) +Ord(Value[53+j]);
          Value[53+j] := Char(x div 24);
          x := x mod 24;
        end;
        Result := Digits[x+1] +Result;
        if ( (i > 0and ((i mod 5) = 0) ) then
          Result := '-' +Result;
      end;
    end;
  finally
    Reg.Free;
  end;
end;

cu
Narses


Born-to-Frag - Di 18.07.06 16:23

Wow, dankesehr Narses :flehan: :beer:

Die Funktion funktioniert einwandfrei :)


greetz


Martin1966 - Mi 19.07.06 09:46

Ich hab die Funktion für die DL vorgeschlagen: http://www.delphi-library.de/viewtopic.php?p=374960#374960


Roy - Sa 10.10.15 12:26

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Probier das mal so: ;)


Ich erhalte hierbei kein Ergebnis, Label bleibt leer

Moderiert von user profile iconNarses: Zitat gekürzt.


Delete - Sa 10.10.15 16:31

Hier gibt es eine Lösung: function View_Win_Key: string;

http://www.swissdelphicenter.ch/de/showcode.php?id=2252

Kleine Änderung:
Reg := TRegistry.Create(KEY_READ OR KEY_WOW64_64KEY);

Funktioniert bei XE7, WIN8.1


SMO - Sa 10.10.15 16:41

user profile iconRoy hat folgendes geschrieben Zum zitierten Posting springen:
Ich erhalte hierbei kein Ergebnis, Label bleibt leer


Dann benutzt du wahrscheinlich ein 32-bit Programm in einem 64-bit Windows. Siehe MSDN [https://msdn.microsoft.com/en-us/library/windows/desktop/ms724072%28v=vs.85%29.aspx].



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
// Get Windows product key, adapted by SMO from open source examples
// tested on Windows 7 and 8.1
function GetWinProductKey: string;
const
  KeyOffset    = 52;
  Symbols      = 'BCDFGHJKMPQRTVWXY2346789';
  SymbolCount  = Length(Symbols);  // = 24
  RegKeyName   = 'SOFTWARE\Microsoft\Windows NT\CurrentVersion';
  RegValueName = 'DigitalProductID';
  // KEY_WOW64_64KEY = $0100;
  SRegOpenErrMsg = 'Error while opening registry key "%s":'#10'%s';
  SRegValueExistErrMsg = 'Registry value "%s" does not exist';
  SRegValueSizeErrMsg = 'Registry value "%s" is too small (%d bytes)';
var
  Reg: TRegistry;
  AAccess: Longword;
  DigitalProductID: array of Byte; // TBytes
  Decoded: string;
  i, j, x: Integer;
  IsWin8: Boolean;
begin
  AAccess := KEY_READ;
  // on a 64 bit OS, make sure to read the 64 bit version of the registry key
  if TOSVersion.Architecture = arIntelX64 then
    AAccess := AAccess or KEY_WOW64_64KEY;

  Reg := TRegistry.Create(AAccess);
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if not Reg.OpenKey(RegKeyName, FALSE) then
      raise Exception.CreateFmt(SRegOpenErrMsg, [RegKeyName, Reg.LastErrorMsg]);
    if not Reg.ValueExists(RegValueName) then
      raise Exception.CreateFmt(SRegValueExistErrMsg, [RegValueName]);
    i := Reg.GetDataSize(RegValueName);
    if (i >= 67then
    begin
      SetLength(DigitalProductID, i);
      Reg.ReadBinaryData(RegValueName, DigitalProductID[0], i);
      // Windows 8 requires a tweak
      x := 66;
      IsWin8 := Odd(DigitalProductID[x] div 6);
      if IsWin8 then
        DigitalProductID[x] := DigitalProductID[x] and $F7;
      // decode
      SetLength(Decoded, 25);
      for i := High(Decoded) downto Low(Decoded) do
      begin
        x := 0;
        for j := 14 downto 0 do
        begin
          x := (x shl 8) + DigitalProductID[KeyOffset + j];
          DigitalProductID[KeyOffset + j] := x div SymbolCount;
          x := x mod SymbolCount;
        end;
        Decoded[i] := Symbols[Low(Symbols) + x];
      end;
      if IsWin8 then
        // discard the first symbol and insert an "N" somewhere in the middle
        Decoded := Copy(Decoded, 2, x) + 'N' + Copy(Decoded, 2 + x, MaxInt);
      // produce final output, separated with "-"
      for i := 0 to 4 do
      begin
        if i > 0 then Result := Result + '-';
        Result := Result + Copy(Decoded, 1 + i * 55);
      end;
    end
    else
      raise Exception.CreateFmt(SRegValueSizeErrMsg, [RegValueName, i]);
  finally
    Reg.Free;
  end;
end;



Edit: hathor war schneller, aber der Code, den er verlinkt hat, funktioniert nicht für Windows 8.x (und hat außerdem schlechte Fehlerbehandlung).
Edit2: Fehler korrigiert.


Roy - Sa 10.10.15 16:56

Undefinierter Bezeichner
TOSVersion

TOSVersion

Moderiert von user profile iconNarses: Komplettzitat des letzten Beitrags entfernt.


SMO - Sa 10.10.15 17:19

user profile iconRoy hat folgendes geschrieben Zum zitierten Posting springen:
Undefinierter Bezeichner
TOSVersion


Hast du die Unit System.SysUtils eingebunden?
Falls ja, gibt es TOSVersion in deiner Delphi-Version wohl noch nicht.

Ersetze einfach "if TOSVersion.Architecture = arIntelX64 then" durch "if IsWow64Process then".
Wobei dieses IsWow64Process gemeint ist:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function IsWow64Process: Boolean;
type
  TIsWow64Process = function(hProcess: THandle; var Wow64Process: BOOL): BOOL; stdcall;
// const kernel32 = 'kernel32.dll'; // defined in Winapi.Windows
var
  LIsWow64Process: TIsWow64Process;
  Wow64Process: BOOL;
begin
  Result := False;
  LIsWow64Process := GetProcAddress(GetModuleHandle(kernel32), 'IsWow64Process');
  if Assigned(LIsWow64Process) then
  begin
    if not LIsWow64Process(GetCurrentProcess, Wow64Process) then
      raise Exception.Create('Invalid handle');
    Result := Wow64Process;
  end;
end;


Roy - Sa 10.10.15 19:03

Funktioniert nicht der code


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
// Get Windows product key, adapted by SMO from open source examples
// tested on Windows 7 and 8.1
function GetWinProductKey: string;
const
  KeyOffset    = 52;
  Symbols      = 'BCDFGHJKMPQRTVWXY2346789';
  SymbolCount  = Length(Symbols);  // = 24
  RegKeyName   = 'SOFTWARE\Microsoft\Windows NT\CurrentVersion';
  RegValueName = 'DigitalProductID';
  // KEY_WOW64_64KEY = $0100;
  SRegOpenErrMsg = 'Error while opening registry key "%s":'#10'%s';
  SRegValueExistErrMsg = 'Registry value "%s" does not exist';
  SRegValueSizeErrMsg = 'Registry value "%s" is too small (%d bytes)';
var
  Reg: TRegistry;
  AAccess: Longword;
  DigitalProductID: array of Byte; // TBytes
  Decoded: string;
  i, j, x: Integer;
  IsWin8: Boolean;
begin
  AAccess := KEY_READ;
  // on a 64 bit OS, make sure to read the 64 bit version of the registry key
     if not LIsWow64Process(GetCurrentProcess, Wow64Process) then
      raise Exception.Create('Invalid handle');
    Result := Wow64Process;
  end;

  Reg := TRegistry.Create(AAccess);
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if not Reg.OpenKey(RegKeyName, FALSE) then
      raise Exception.CreateFmt(SRegOpenErrMsg, [RegKeyName, Reg.LastErrorMsg]);
    if not Reg.ValueExists(RegValueName) then
      raise Exception.CreateFmt(SRegValueExistErrMsg, [RegValueName]);
    i := Reg.GetDataSize(RegValueName);
    if (i >= 67then
    begin
      SetLength(DigitalProductID, i);
      Reg.ReadBinaryData(RegValueName, DigitalProductID[0], i);
      // Windows 8 requires a tweak
      x := 66;
      IsWin8 := Odd(DigitalProductID[x] div 6);
      if IsWin8 then
        DigitalProductID[x] := DigitalProductID[x] and $F7;
      // decode
      for i := 24 downto 0 do
      begin
        x := 0;
        for j := 14 downto 0 do
        begin
          x := (x shl 8) + DigitalProductID[KeyOffset + j];
          DigitalProductID[KeyOffset + j] := x div SymbolCount;
          x := x mod SymbolCount;
        end;
        Decoded := Symbols[Low(Symbols) + x] + Decoded;
      end;
      if IsWin8 then
        // discard the first symbol and insert an "N" somewhere in the middle
        Decoded := Copy(Decoded, 2, x) + 'N' + Copy(Decoded, x, MaxInt);
      // produce final output, separated with "-"
      for i := 0 to 4 do
      begin
        if i > 0 then Result := Result + '-';
        Result := Result + Copy(Decoded, 1 + i * 55);
      end;
    end
    else
      raise Exception.CreateFmt(SRegValueSizeErrMsg, [RegValueName, i]);
  finally
    Reg.Free;
  end;
end;


Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt


SMO - Sa 10.10.15 19:20

user profile iconRoy hat folgendes geschrieben Zum zitierten Posting springen:
Funktioniert nicht der code

Könntest du vielleicht sagen, was genau nicht funktioniert? Und bitte nicht sinnlos den kompletten Code in deine Nachrichten kopieren.

Übrigens habe ich noch einen kleinen Fehler gefunden und korrigiert, also probier's nochmal mit dem aktuellen Code.
Welche Delphi-Version hast du, Delphi 2007?


Roy - Sa 10.10.15 19:23

Windows7
Delphi7

welchen aktuellen code??


SMO - Sa 10.10.15 19:44

Na den Code in meinem ersten Beitrag oben.

Delphi 7 ist alt, das kann z.B. kein "Low()" für Strings und kennt auch noch nicht die Konstante KEY_WOW64_64KEY.
Mit etwas Eigeninitiative kannst du die paar Stellen, die Delphi 7 nicht versteht, sicher ändern. Kleine Anregung:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
function GetWinProductKey: string;
const
// ...
  SymbolCount = 24;
  KEY_WOW64_64KEY = $0100
// ...
begin
// ...
  if IsWow64Process then
    AAccess := AAccess or KEY_WOW64_64KEY;
// ...
    for i := Length(Decoded) downto 1 do
    begin
// ...
      Decoded[i] := Symbols[1 + x];
// ...


Delete - Sa 10.10.15 23:52

Decoder geändert: Sollte jetzt mit WIN8.0 und WIN8.1 funktionieren.
Bitte mit WIN7.0 und WIN10 testen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
program WIN8_Info;

{$APPTYPE CONSOLE}

uses
{$if CompilerVersion < 21}
  SysUtils,
  Registry;
{$endif}
{$if CompilerVersion > 20}
  System.SysUtils,
  System.Win.Registry;
{$endif}

const KEY_WOW64_64KEY = 256; KEY_READ = 131097; HKEY_LOCAL_MACHINE = $80000002;


function BinToInt(Value: String): Integer;
var i, vSize: Integer;
begin
  Result := 0; vSize := Length(Value);
  for i := vSize downTo 1 do
    if Value[i] = '1' then begin Result := Result + (1 shl (vSize - i)); end;
end;

function DecodeProductKey8(Const HexSrc: Array Of Byte): String;
Const
  StarToffset: Integer = $34;
  EndOffset: Integer = $34 + 17;
  Digits: Array[0..23of Char =
  ('B','C','D','F','G','H','J','K','M','P','Q','R','T','V','W','X','Y','2','3','4','6','7','8','9');
  dLen: Integer = 29;
  KeyOffset :Integer = 52 ;
var
  Key  : Array Of Cardinal;
  Cur, X, I, K, Last : Integer;
  T    : String;
begin
  I := 24;
  SetLength(Key, dLen);
    for K := StarToffset To EndOffset do begin Key[K - StarToffSet] := HexSrc[K]; end;
  Key[14] := BinToInt(IntToStr(Key[14]));
    repeat
      Cur := 0; X := 14;
        repeat
          Cur := Cur * 256 ;
          Cur := (Key[X]) + Cur;
          Key[X] := Cur div 24 ;
          Cur := Cur Mod 24;
          X := X - 1;
        until X < 0;
      I := I - 1;
      Last := Cur;
      T := Digits[Cur] + T ;
    until I < 0;
  T :=  Copy(T,2,25);
  Insert('N', T, Last + 1);
    For X := 1 To 4 do begin Insert('-', T, X*6); end;
  Result := T;
end;

function View_Win8_Key: string;
var Reg: TRegistry;  HexBuf: array of BYTE; binarySize: INTEGER; PN,PID,DN: string;
begin
  Reg := TRegistry.Create(KEY_READ OR KEY_WOW64_64KEY);
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if Reg.OpenKeyReadOnly('\SOFTWARE\Microsoft\Windows NT\CurrentVersion'then
    begin
      if Reg.GetDataType('DigitalProductId') = rdBinary then
      begin
        PN         := (Reg.ReadString('ProductName'));
        PID        := (Reg.ReadString('ProductID'));
        binarySize := Reg.GetDataSize('DigitalProductId');
        SetLength(HexBuf, binarySize);
        if binarySize > 0 then
        begin Reg.ReadBinaryData('DigitalProductId', HexBuf[0], binarySize); end;
      end;
    end;
  finally FreeAndNil(Reg); end;
  Result := ''; Result := DecodeProductKey8(HexBuf);
end;

//[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion]
function GetWinProductID: String;
var Reg: TRegistry;
begin
  Reg := TRegistry.Create(KEY_READ OR KEY_WOW64_64KEY);
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    Reg.OpenKeyReadOnly('SOFTWARE\Microsoft\Windows NT\CurrentVersion');
    Result := Reg.ReadString('ProductID');
  finally Reg.Free; end;
end;

begin
      WriteLn('ProductID: '+GetWinProductID);
      WriteLn('Key: '+View_Win8_Key);
      Writeln; Writeln('Press Enter to exit'); Readln;
end.


SMO - So 11.10.15 00:00

user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Link geht doch !


Wie ich bereits geschrieben habe, dieser Code funktioniert nicht mehr ab Windows 8!
Ja, er läuft und liefert ein Ergebnis, aber ein falsches.
Der Code von mir funktioniert auch für Windows 8 (Windows 10 noch nicht getestet).


Roy - So 11.10.15 07:47

Ich habe auch Embarcadero XE7 ist das besser?


Delete - So 11.10.15 11:27

user profile iconSMO hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Link geht doch !


Wie ich bereits geschrieben habe, dieser Code funktioniert nicht mehr ab Windows 8!
Ja, er läuft und liefert ein Ergebnis, aber ein falsches.
Der Code von mir funktioniert auch für Windows 8 (Windows 10 noch nicht getestet).


Endlich mal eine Aussage, mit der ich was anfangen kann!

Decoder oben geändert.

INFO:
http://www.nirsoft.net/utils/product_cd_key_viewer.html


Delete - So 11.10.15 11:28

user profile iconRoy hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe auch Embarcadero XE7 ist das besser?


Ist ein Golf BJ 2015 besser als ein VW Käfer BJ xxxx ?


SMO - So 11.10.15 14:33

user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Endlich mal eine Aussage, mit der ich was anfangen kann!

Decoder oben geändert.


Schön, jetzt funktioniert dein Code mit Windows 8, aber eben nicht mehr mit Windows 7. Meiner funktioniert für beide. ;)

Und wieso benutzt du "Key[14] := BinToInt(IntToStr(Key[14]))" anstatt "Key[14] := Key[14] and $F7"?
Die Variable "Last" ist außerdem überflüssig, hat immer denselben Wert wie Cur am Ende.


Roy - So 11.10.15 18:55

Nichts zu machen, Funktioniert nicht unter Delphi7 und auch nicht unter Embarcadero XE7

Er kann mit dem hier alles nichts anfangen


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
{$APPTYPE CONSOLE}

uses
{$if CompilerVersion < 21}
  Windows,
  SysUtils,
  ActiveX,
  ComObj,
  Variants,
  Registry,
  Classes;
{$endif}
{$if CompilerVersion > 20}
  Winapi.Windows,
  System.SysUtils,
  Winapi.ActiveX,
  System.Win.ComObj,
  System.Variants,
  System.Win.Registry,
  System.Classes;
{$endif}


Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


Delete - So 11.10.15 20:01

Es gibt auch ein VBS-File:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
Set WshShell = CreateObject("WScript.Shell")
Key = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"
DigitalID = WshShell.RegRead(key & "DigitalProductId")

ProductName = "Product Name: " & WshShell.RegRead(Key & "ProductName") & vbNewLine
ProductID = "Product ID: " & WshShell.RegRead(Key & "ProductID") & vbNewLine
ProductKey = "Installed Key: " & ConvertToKey(DigitalID)
ProductID = ProductName & ProductID & ProductKey

If vbYes = MsgBox(ProductId & vblf & vblf & "Save to a file?", vbYesNo + vbQuestion, "Windows Key Information") then
   Save ProductID
End if

Function ConvertToKey(Key)
    Const KeyOffset = 52
    isWin8 = (Key(66) \ 6And 1
    Key(66) = (Key(66And &HF7) Or ((isWin8 And 2) * 4)
    i = 24
    Chars = "BCDFGHJKMPQRTVWXY2346789"
    Do
        Cur = 0
        X = 14
        Do
            Cur = Cur * 256
            Cur = Key(X + KeyOffset) + Cur
            Key(X + KeyOffset) = (Cur \ 24)
            Cur = Cur Mod 24
            X = X -1
        Loop While X >= 0
        i = i -1
        KeyOutput = Mid(Chars, Cur + 11) & KeyOutput
        Last = Cur
    Loop While i >= 0
    If (isWin8 = 1Then
        keypart1 = Mid(KeyOutput, 2, Last)
        insert = "N"
        KeyOutput = Replace(KeyOutput, keypart1, keypart1 & insert, 210)
        If Last = 0 Then KeyOutput = insert & KeyOutput
    End If
    a = Mid(KeyOutput, 15)
    b = Mid(KeyOutput, 65)
    c = Mid(KeyOutput, 115)
    d = Mid(KeyOutput, 165)
    e = Mid(KeyOutput, 215)
    ConvertToKey = a & "-" & b & "-" & c & "-" & d & "-" & e
End Function

Function Save(Data)
    Const ForWRITING = 2
    Const asASCII = 0
    Dim fso, f, fName, ts
    fName = "Windows Key.txt"
    Set fso = CreateObject("Scripting.FileSystemObject")
    fso.CreateTextFile fName
    Set f = fso.GetFile(fName)
    Set f = f.OpenAsTextStream(ForWRITING, asASCII)
    f.Writeline Data
    f.Close
End Function


Delete - So 11.10.15 20:25

Noch 2 VBS-Lösungen für WIN8 und für ältere WIN-Versionen:
Anleitung für Newbies:
Einen Source-Teil in Notepad kopieren, abspeichern unter WINKEY7.vbs oder WINKEY8.vbs
Doppelklick auf das File zeigt den Key.

Vor WIN8.0


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
Set WshShell = CreateObject("WScript.Shell")
MsgBox ConvertToKey(WshShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DigitalProductId"))

Function ConvertToKey(Key)
Const KeyOffset = 52
i = 28
Chars = "BCDFGHJKMPQRTVWXY2346789"
Do
Cur = 0
x = 14
Do
Cur = Cur * 256
Cur = Key(x + KeyOffset) + Cur
Key(x + KeyOffset) = (Cur \ 24And 255
Cur = Cur Mod 24
x = x -1
Loop While x >= 0
i = i -1
KeyOutput = Mid(Chars, Cur + 11) & KeyOutput
If (((29 - i) Mod 6) = 0And (i <> -1Then
i = i -1
KeyOutput = "-" & KeyOutput
End If
Loop While i >= 0
ConvertToKey = KeyOutput
End Function


Ab WIN8.0


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
Set WshShell = CreateObject("WScript.Shell")
MsgBox ConvertToKey(WshShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DigitalProductId"))

Function ConvertToKey(Key)
    Const KeyOffset = 52
    isWin8 = (Key(66) \ 6And 1
    Key(66) = (Key(66And &HF7) Or ((isWin8 And 2) * 4)
    i = 24
    Chars = "BCDFGHJKMPQRTVWXY2346789"
    Do
        Cur = 0
        X = 14
        Do
            Cur = Cur * 256
            Cur = Key(X + KeyOffset) + Cur
            Key(X + KeyOffset) = (Cur \ 24)
            Cur = Cur Mod 24
            X = X -1
        Loop While X >= 0
        i = i -1
        KeyOutput = Mid(Chars, Cur + 11) & KeyOutput
        Last = Cur
    Loop While i >= 0
    If (isWin8 = 1Then
        keypart1 = Mid(KeyOutput, 2, Last)
        insert = "N"
        KeyOutput = Replace(KeyOutput, keypart1, keypart1 & insert, 210)
        If Last = 0 Then KeyOutput = insert & KeyOutput
    End If
    a = Mid(KeyOutput, 15)
    b = Mid(KeyOutput, 65)
    c = Mid(KeyOutput, 115)
    d = Mid(KeyOutput, 165)
    e = Mid(KeyOutput, 215)
    ConvertToKey = a & "-" & b & "-" & c & "-" & d & "-" & e
End Function


Delete - So 11.10.15 22:31

user profile iconRoy hat folgendes geschrieben Zum zitierten Posting springen:
Nichts zu machen, Funktioniert nicht unter Delphi7 und auch nicht unter Embarcadero XE7


Das liegt am Decoder - der funktioniert offensichtlich erst ab WIN8.0.


Roy - Di 13.10.15 14:38

user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Es gibt auch ein VBS-File:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
Set WshShell = CreateObject("WScript.Shell")
Key = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"
DigitalID = WshShell.RegRead(key & "DigitalProductId")

ProductName = "Product Name: " & WshShell.RegRead(Key & "ProductName") & vbNewLine
ProductID = "Product ID: " & WshShell.RegRead(Key & "ProductID") & vbNewLine
ProductKey = "Installed Key: " & ConvertToKey(DigitalID)
ProductID = ProductName & ProductID & ProductKey

If vbYes = MsgBox(ProductId & vblf & vblf & "Save to a file?", vbYesNo + vbQuestion, "Windows Key Information") then
   Save ProductID
End if

Function ConvertToKey(Key)
    Const KeyOffset = 52
    isWin8 = (Key(66) \ 6And 1
    Key(66) = (Key(66And &HF7) Or ((isWin8 And 2) * 4)
    i = 24
    Chars = "BCDFGHJKMPQRTVWXY2346789"
    Do
        Cur = 0
        X = 14
        Do
            Cur = Cur * 256
            Cur = Key(X + KeyOffset) + Cur
            Key(X + KeyOffset) = (Cur \ 24)
            Cur = Cur Mod 24
            X = X -1
        Loop While X >= 0
        i = i -1
        KeyOutput = Mid(Chars, Cur + 11) & KeyOutput
        Last = Cur
    Loop While i >= 0
    If (isWin8 = 1Then
        keypart1 = Mid(KeyOutput, 2, Last)
        insert = "N"
        KeyOutput = Replace(KeyOutput, keypart1, keypart1 & insert, 210)
        If Last = 0 Then KeyOutput = insert & KeyOutput
    End If
    a = Mid(KeyOutput, 15)
    b = Mid(KeyOutput, 65)
    c = Mid(KeyOutput, 115)
    d = Mid(KeyOutput, 165)
    e = Mid(KeyOutput, 215)
    ConvertToKey = a & "-" & b & "-" & c & "-" & d & "-" & e
End Function

Function Save(Data)
    Const ForWRITING = 2
    Const asASCII = 0
    Dim fso, f, fName, ts
    fName = "Windows Key.txt"
    Set fso = CreateObject("Scripting.FileSystemObject")
    fso.CreateTextFile fName
    Set f = fso.GetFile(fName)
    Set f = f.OpenAsTextStream(ForWRITING, asASCII)
    f.Writeline Data
    f.Close
End Function


Ich möchte das gerne auf meiner TForm in einem Memo aufrufen. Bekomme nur Fehler beim Compleiren


Narses - Di 13.10.15 14:56

Moin!

So, das wird mir jetzt doch zu komisch hier. :? Du zeigst keinerlei erkennbare Eigeninitiative, zitierst sinnlos meterweise Code/Beiträge, lieferst keine brauchbaren Informationen und wünschst c&p-ready Code. Das entspricht zum einen nicht unseren Forenregeln, zum anderen ist es reichlich unverschämt. :|

Konkret zu deinem letzten Beitrag: Du hast den VBS-Code in dein Delphi-Projekt übernommen, aber komischerweise kann man das nicht kompilieren. :roll: Tja, ich schlage vor, du lieferst erstmal eine Erklärung, was denn die Ursache sein könnte. Dann schauen wir mal weiter.

Alternativ mache ich den Thread hier zu.

cu
Narses


Roy - Di 13.10.15 15:07

Hallo Narses,

den Code zietiere ich nur das derjenige weis welchen Code ich meine. Habe gemerkt das hier alle durcheinander posten, jeder mit einem anderen Code.

Meine Frage bleibt immer noch die Gleiche.
Ich möchte mir den Produktkey auf meinem Formular in einem Memo ausgeben lassen.

In allen Code die ihr gepostet habt, die auch alle bei mir funktionieren, habe ich aber Probleme sowie ich es in mein Project einbinden möchte und in einem Memo anzeigen will.

Zur Ursache kann ich nichts sagen.
Kann mit WshShell nichts anfangen


Danke
Roy


Narses - Di 13.10.15 17:02

Moin!

user profile iconRoy hat folgendes geschrieben Zum zitierten Posting springen:
den Code zietiere ich nur das derjenige weis welchen Code ich meine. Habe gemerkt das hier alle durcheinander posten, jeder mit einem anderen Code.
Ja, zugegebenermaßen läuft das hier manchmal etwas... übereilt. :? OK, soll nicht dein Problem sein. :nixweiss:

user profile iconRoy hat folgendes geschrieben Zum zitierten Posting springen:
Meine Frage bleibt immer noch die Gleiche.
Ich möchte mir den Produktkey auf meinem Formular in einem Memo ausgeben lassen.
Das ist keine Frage, das ist ein Wunsch. :idea: Konkret: DEIN Wunsch! Dann tu auch was dafür und lass dir nicht alles vorbeten.

user profile iconRoy hat folgendes geschrieben Zum zitierten Posting springen:
In allen Code die ihr gepostet habt, die auch alle bei mir funktionieren, habe ich aber Probleme sowie ich es in mein Project einbinden möchte und in einem Memo anzeigen will.
Und diese Probleme sind uns hier natürlich alle schon klar, wir sind nur so gemein, sie dir nicht von den Augen abzulesen und einfach nur den "richtigen" Code hinzuschreiben... :roll: ist schon klar. :schmoll:
Ist dir schonmal der Gedanke gekommen, dass wir nicht wissen können, was auf deinem Monitor so alles zu sehen ist und was genau du da tust? :gruebel:

user profile iconRoy hat folgendes geschrieben Zum zitierten Posting springen:
Zur Ursache kann ich nichts sagen.
Kann mit WshShell nichts anfangen
Aber mit Google kannst du schon umgehen? Dann such doch bitte mal nach dem Stichwort "VBS" :lupe: was ist denn das für eine Programmiersprache, mach dich mal schlau. :les: ;)

cu
Narses


Delete - Di 13.10.15 19:20

user profile iconRoy hat folgendes geschrieben Zum zitierten Posting springen:
Ich möchte das gerne auf meiner TForm in einem Memo aufrufen. Bekomme nur Fehler beim Compleiren


Warum schreibst Du das nicht gleich?! [http://www.entwickler-ecke.de/viewtopic.php?p=696355#696355]

Hast Du mittlerweile begriffen, dass der GLEICHE CODE NICHT unter WIN7 UND unter WIN8 funktioniert?

Zwischen DELPHI 7 und DELPHI XE7 ist auch ein grosser Unterschied!
Entscheide Dich mal, was Du eigentlich willst!

Ich habe jetzt KEINE Lust, 4 verschiedene DELPHI-Versionen zu posten...
.
Albert Einstein lebte KURZ in der Schweiz.
Es kam ihm aber SEHR LANGE vor.
Da entdeckte er die Relativitätstheorie.