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) >= 67) then 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 > 0) and ((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
Roy - Sa 10.10.15 12:26
Narses hat folgendes geschrieben : |
Probier das mal so: ;)
|
Ich erhalte hierbei kein Ergebnis, Label bleibt leer
Moderiert von
Narses: Zitat gekürzt.
SMO - Sa 10.10.15 16:41
Roy hat folgendes geschrieben : |
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:
| function GetWinProductKey: string; const KeyOffset = 52; Symbols = 'BCDFGHJKMPQRTVWXY2346789'; SymbolCount = Length(Symbols); RegKeyName = 'SOFTWARE\Microsoft\Windows NT\CurrentVersion'; RegValueName = 'DigitalProductID'; 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; Decoded: string; i, j, x: Integer; IsWin8: Boolean; begin AAccess := KEY_READ; 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 >= 67) then begin SetLength(DigitalProductID, i); Reg.ReadBinaryData(RegValueName, DigitalProductID[0], i); x := 66; IsWin8 := Odd(DigitalProductID[x] div 6); if IsWin8 then DigitalProductID[x] := DigitalProductID[x] and $F7; 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 Decoded := Copy(Decoded, 2, x) + 'N' + Copy(Decoded, 2 + x, MaxInt); for i := 0 to 4 do begin if i > 0 then Result := Result + '-'; Result := Result + Copy(Decoded, 1 + i * 5, 5); 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
Narses: Komplettzitat des letzten Beitrags entfernt.
SMO - Sa 10.10.15 17:19
Roy hat folgendes geschrieben : |
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; 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:
| function GetWinProductKey: string; const KeyOffset = 52; Symbols = 'BCDFGHJKMPQRTVWXY2346789'; SymbolCount = Length(Symbols); RegKeyName = 'SOFTWARE\Microsoft\Windows NT\CurrentVersion'; RegValueName = 'DigitalProductID'; 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; Decoded: string; i, j, x: Integer; IsWin8: Boolean; begin AAccess := KEY_READ; 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 >= 67) then begin SetLength(DigitalProductID, i); Reg.ReadBinaryData(RegValueName, DigitalProductID[0], i); x := 66; IsWin8 := Odd(DigitalProductID[x] div 6); if IsWin8 then DigitalProductID[x] := DigitalProductID[x] and $F7; 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 Decoded := Copy(Decoded, 2, x) + 'N' + Copy(Decoded, x, MaxInt); for i := 0 to 4 do begin if i > 0 then Result := Result + '-'; Result := Result + Copy(Decoded, 1 + i * 5, 5); end; end else raise Exception.CreateFmt(SRegValueSizeErrMsg, [RegValueName, i]); finally Reg.Free; end; end; |
Moderiert von
Martok: Delphi-Tags hinzugefügt
SMO - Sa 10.10.15 19:20
Roy hat folgendes geschrieben : |
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..23] of 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;
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
hathor hat folgendes geschrieben : |
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
SMO hat folgendes geschrieben : |
hathor hat folgendes geschrieben : | 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
Roy hat folgendes geschrieben : |
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
hathor hat folgendes geschrieben : |
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
Narses: 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) \ 6) And 1 Key(66) = (Key(66) And &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 + 1, 1) & KeyOutput Last = Cur Loop While i >= 0 If (isWin8 = 1) Then keypart1 = Mid(KeyOutput, 2, Last) insert = "N" KeyOutput = Replace(KeyOutput, keypart1, keypart1 & insert, 2, 1, 0) If Last = 0 Then KeyOutput = insert & KeyOutput End If a = Mid(KeyOutput, 1, 5) b = Mid(KeyOutput, 6, 5) c = Mid(KeyOutput, 11, 5) d = Mid(KeyOutput, 16, 5) e = Mid(KeyOutput, 21, 5) 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 \ 24) And 255 Cur = Cur Mod 24 x = x -1 Loop While x >= 0 i = i -1 KeyOutput = Mid(Chars, Cur + 1, 1) & KeyOutput If (((29 - i) Mod 6) = 0) And (i <> -1) Then 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) \ 6) And 1 Key(66) = (Key(66) And &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 + 1, 1) & KeyOutput Last = Cur Loop While i >= 0 If (isWin8 = 1) Then keypart1 = Mid(KeyOutput, 2, Last) insert = "N" KeyOutput = Replace(KeyOutput, keypart1, keypart1 & insert, 2, 1, 0) If Last = 0 Then KeyOutput = insert & KeyOutput End If a = Mid(KeyOutput, 1, 5) b = Mid(KeyOutput, 6, 5) c = Mid(KeyOutput, 11, 5) d = Mid(KeyOutput, 16, 5) e = Mid(KeyOutput, 21, 5) ConvertToKey = a & "-" & b & "-" & c & "-" & d & "-" & e End Function |
Delete - So 11.10.15 22:31
Roy hat folgendes geschrieben : |
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
hathor hat folgendes geschrieben : |
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) \ 6) And 1 Key(66) = (Key(66) And &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 + 1, 1) & KeyOutput Last = Cur Loop While i >= 0 If (isWin8 = 1) Then keypart1 = Mid(KeyOutput, 2, Last) insert = "N" KeyOutput = Replace(KeyOutput, keypart1, keypart1 & insert, 2, 1, 0) If Last = 0 Then KeyOutput = insert & KeyOutput End If a = Mid(KeyOutput, 1, 5) b = Mid(KeyOutput, 6, 5) c = Mid(KeyOutput, 11, 5) d = Mid(KeyOutput, 16, 5) e = Mid(KeyOutput, 21, 5) 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!
Roy hat folgendes geschrieben : |
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:
Roy hat folgendes geschrieben : |
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.
Roy hat folgendes geschrieben : |
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:
Roy hat folgendes geschrieben : |
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
Roy hat folgendes geschrieben : |
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!