![]() |
Windows Registry Rekursiv auslesen
Hallo Leute,
ich habe ein Problem was sich sicher net so schwer lösen lassen dürfte aber ich bekomme es beim besten Willen nicht hin. Ich schreibe gerade an einem Programm welches es ermöglicht Keys und Values aus der Registry zu lesen und diese dann in einer Listbox anzeigt und als txt-Datei speichert. Das Problem is ich habe 12 Key Pfade welche ich auslesen muss also habe ich 12x den ganzen Quellcode zum auslesen geschrieben der ganze Quellcode fasst nun ca. 18 Seiten in Word also ist alles andere als ein Schmauss daher poste ich den auch echt nur auf Anfrage und dann am besten als Text file per icq oder msn. Die Grundidee für das Programm war halt das man auf ein frisches und ein "gebrauchtes" System ein Programm installiert und dann einmal schaut wie sich das, zu einen das installieren auf das Dateisystem (das ist fertig) und halt jetzt noch auf die Registry auswirkt und die Ergebnise dann vergleichen (via UltraEdit). Also die Schlüssel liegen in HKEY_Current_user\software\programmname\...\...\.. . und HKEY_local_machine\software\programmname\... bis jetzt lasse ich jetzt jeden einzelnen unterordner dieser Pfade einzeln nach schlüsseln und Values durchsuchen was leider sehr umständlich ist aber ich bekomme das rekursiv nicht hin. Was somit jede Änderung zu einer einfachen Kathastrophe macht... 12x alle Variablen und Pfade ändern prost Malzeit.. Wäre gut wenn mir da jmd. ne Idee geben könnte wie man das lösen könnte. Fragen und antworten oder anfragen nach dem Quelltext (eher für die die ma richtig abkotzen wollen :-) auch gerne per mail : Martzzz@gmx.de oder msn (siehe mail addi) oder icq 163735843 thanks a lot greetz Martz |
Re: Windows Registry Rekursiv auslesen
Hallo
also das was du machen willst gibt es schon in vereinfachter Form als Delphi Funktion. Schau mal nach: GetKeynames() Diese Funktion gibt alle Registry Schlüssel in einer Stringlist zurück. Also ungefähr so:
Delphi-Quellcode:
with TRegistry.Create do
try RootKey := hkey; OpenKey(EmptyStr, False); reglist := TStringList.Create; try GetKeynames(reglist); CloseKey; for I := 0 to reglist.Count - 1 do begin if OpenKey(reglist[I], False) then begin // tu was end; end; finally reglist .Free end; finally Free; end; |
Re: Windows Registry Rekursiv auslesen
Hi
Danke für deine Antwort, aber eine solche Abfrage habe ich schon drinne aber die sorgt ja nur dafür das aus einem Schlüssel alle schlüssel als name rausgezogen werden aber die Unter und Unterunterschlüssel werden nicht noch ausgelesen und auf ihre Schlüsselnamen überprüft und genau das bräuchte ich. Also als Beispiel ich gebe ihm an: Hkey_Local_Machine\software\Microsoft\ und dann werden dort alle Schlüssel und Values rausgezogen die es da gibt also in allen Schlüsseln und Unterschlüsseln. Mfg Martz |
Re: Windows Registry Rekursiv auslesen
Hallo,
so könnte es gehen:
Delphi-Quellcode:
viel Erfolg
procedure TForm1.Button1Click(Sender: TObject);
var Registry : TRegistry; KeyList : TStringList; procedure ReadRegistry(key : string; level : integer); var sl : TStringList; i : integer; begin sl := TStringList.create; try with Registry do begin OpenKey(key, False); GetKeynames(sl); CloseKey; end; for i := 0 to sl.count - 1 do begin KeyList.add(Dupestring('-', level) + '+' + sl[i]); ReadRegistry(key + '\' + sl[i], level + 1); end; finally sl.free; end; end; begin KeyList := TStringList.create; Registry := TRegistry.Create; with Registry do try RootKey := HKEY_LOCAL_MACHINE; ReadRegistry('', 0); finally Registry.Free; KeyList.free; end; end; Jörg |
Re: Windows Registry Rekursiv auslesen
so habe ich das mal gemacht ... benötigt aber die JCL für Registry Binär Daten.
Delphi-Quellcode:
function TfrmMain.ReadKeyToString(hkRoot: HKEY; sPath: string; sName: string; bForBartPE: Boolean = True): string;
var reg : TRegistry; sl : TStringList; x : Integer; rgdt : Cardinal; sRegType : string; Buff : array[0..1023] of Byte; Size : Cardinal; begin sl := TStringList.Create; Result := ''; reg := TRegistry.Create(KEY_READ); reg.RootKey := hkRoot; reg.OpenKeyReadOnly(sPath); RegGetDataType(hkRoot, sPath, sName, rgdt); case rgdt of REG_SZ: begin sRegType := KeyTypeToStr(rgdt, bForBartPE); if bForBartPE then Result := '"' + reg.ReadString(sName) + '"' else Result := reg.ReadString(sName); end; REG_EXPAND_SZ: begin sRegType := KeyTypeToStr(rgdt, bForBartPE); if bForBartPE then Result := '"' + reg.ReadString(sName) + '"' else Result := reg.ReadString(sName); end; REG_DWORD: begin sRegType := KeyTypeToStr(rgdt, bForBartPE); if bForBartPE then Result := '0x' + IntToHex(reg.ReadInteger(sName), 1) else Result := '0x' + IntToHex(reg.ReadInteger(sName), 1) + ' (' + IntToStr(reg.ReadInteger(sName)) + ')'; end; REG_MULTI_SZ: begin sRegType := KeyTypeToStr(rgdt, bForBartPE); RegReadMultiSz(hkRoot, sPath, sName, sl); for x := 0 to sl.Count - 1 do begin if bForBartPE then Result := Result + '"' + sl[x] + '",' else Result := Result + sl[x] + ','; end; Result := StrLeft(Result, Length(Result) - 1); end; REG_BINARY: begin sRegType := KeyTypeToStr(rgdt, bForBartPE); ZeroMemory(@Buff, SizeOf(Buff)); RegGetDataSize(hkRoot, sPath, sName, Size); RegReadBinary(hkRoot, sPath, sName, Buff, Size); if (bForBartPE) and (Size > 50) then Result := Result + '\'#13#10; for x := 1 to Size do begin if bForBartPE then begin Result := Result + IntToHex(Buff[x - 1], 2) + ','; if ((x mod 50) = 0) and (x < Integer(Size)) then Result := Result + '\'#13#10; end else Result := Result + IntToHex(Buff[x], 2) + ' '; end; Result := StrLeft(Result, Length(Result) - 1); end; REG_NONE: sRegType := KeyTypeToStr(rgdt, bForBartPE); else Result := '!UNKNOWN!'; end; reg.CloseKey; reg.Free; end; |
Re: Windows Registry Rekursiv auslesen
Hi Danke für die Antworten !!!
Also ich habe beide Varianten nun mal ausprobiert jedoch bekam ich als ich versucht hatte das Ergebnis in einer Listbox auszugeben auf eine Access Violation. Und das Programm kam nicht weiter. Bei der zweiten Version muss ich ehrlich gestehen steige ich noch nicht so durch wie ich das ganze Anstoßen kann bzw. weiss ich auch nicht wie das mit der JLC gemeint ist also was ich da genau machen soll bzw. was ich da brauche und wie ich das bekomme. Gruß Martin |
Re: Windows Registry Rekursiv auslesen
also 1. JCL = JEDI CODE LIBRARY und wird für die Zugriffe auf RegBinary genutzt.
![]() 2. Funktionsaufruf ist z.B. folgender:
Delphi-Quellcode:
Wert 1-2 : sollten selbsterklärend sein
ConvertKeysToBartPE(HKCU, '\SOFTWARE\Adobe', Memo1, True);
Wert 3 : Memo1 ist ein TMemo und keine Tlistbox ! Wert 4 : Recursiv Ja/Nein (Boolean) Denke daran das es ein Auschnitt aus meinem Code ist du musst dir die Asugabe evtl nach deinen Bedürfnissen anpassen! |
Re: Windows Registry Rekursiv auslesen
Ah alles klar ich installier das mal und schaue ob ich das angepasst bekomme schaffe das aber warscheinlich erst morgen das richtig zu testen.
Vielen Dank schonmal das sieht auf jedenfall schon ziemlich gut aus ich habe leider viel zu lange nix mehr mit Delphi gemacht daher hänge ich jetzt immer so leicht in den Fluten wenn es da um die ganzen Begriffe und Klassen und Typen geht weil unter Java was ich an sich zur Zeit lerne is das immer noch was anderes. gruß Martin |
Re: Windows Registry Rekursiv auslesen
Also ich habe die JCL mal installiert aber er ist da immernoch am Mosern:
er sagt mir zum einen, dass die Function einen Rückgabewert brauch also er stoppt schon in der 1. Zeile davon abgesehen wird es bestimmt ärger mit dem hkroot und dem KeytypetoStr geben weil wenn ich die anklicke kommt zB. "var Keytypetostr :erroneus type -unit1" er würde da denke ich auch wieder auf einen Fehler laufen oder zeigt er das in Delphi nur net richtig an und das Problem wurde schon von den JCLs gefixt? Das kommt beim start: Zitat:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Registry, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function TfrmMain.ReadKeyToString(hkRoot ; sPath: string; sName: string; bForBartPE: Boolean = True): string; var reg : TRegistry; sl : TStringList; x : Integer; rgdt : Cardinal; sRegType : string; Buff : array[0..1023] of Byte; Size : Cardinal; begin sl := TStringList.Create; Result := ''; reg := TRegistry.Create(KEY_READ); reg.RootKey := hkRoot; reg.OpenKeyReadOnly(sPath); RegGetDataType(hkRoot, sPath, sName, rgdt); case rgdt of REG_SZ: begin sRegType := KeyTypeToStr(rgdt, bForBartPE); if bForBartPE then Result := '"' + reg.ReadString(sName) + '"' else Result := reg.ReadString(sName); end; REG_EXPAND_SZ: begin sRegType := KeyTypeToStr(rgdt, bForBartPE); if bForBartPE then Result := '"' + reg.ReadString(sName) + '"' else Result := reg.ReadString(sName); end; REG_DWORD: begin sRegType := KeyTypeToStr(rgdt, bForBartPE); if bForBartPE then Result := '0x' + IntToHex(reg.ReadInteger(sName), 1) else Result := '0x' + IntToHex(reg.ReadInteger(sName), 1) + ' (' + IntToStr(reg.ReadInteger(sName)) + ')'; end; REG_MULTI_SZ: begin sRegType := KeyTypeToStr(rgdt, bForBartPE); RegReadMultiSz(hkRoot, sPath, sName, sl); for x := 0 to sl.Count - 1 do begin if bForBartPE then Result := Result + '"' + sl[x] + '",' else Result := Result + sl[x] + ','; end; Result := StrLeft(Result, Length(Result) - 1); end; REG_BINARY: begin sRegType := KeyTypeToStr(rgdt, bForBartPE); ZeroMemory(@Buff, SizeOf(Buff)); RegGetDataSize(hkRoot, sPath, sName, Size); RegReadBinary(hkRoot, sPath, sName, Buff, Size); if (bForBartPE) and (Size > 50) then Result := Result + '\'#13#10; for x := 1 to Size do begin if bForBartPE then begin Result := Result + IntToHex(Buff[x - 1], 2) + ','; if ((x mod 50) = 0) and (x < Integer(Size)) then Result := Result + '\'#13#10; end else Result := Result + IntToHex(Buff[x], 2) + ' '; end; Result := StrLeft(Result, Length(Result) - 1); end; REG_NONE: sRegType := KeyTypeToStr(rgdt, bForBartPE); else Result := '!UNKNOWN!'; end; reg.CloseKey; reg.Free; end; procedure TForm1.Button1Click(Sender: TObject); begin ConvertKeysToBartPE(HKCU, '\SOFTWARE\Microsoft', form1.Memo1, True); end; end. Gruß martz |
Re: Windows Registry Rekursiv auslesen
oha ... ist das dein 1. Programm was du in Delphi programmierst ???
So kann das ja nicht funktionieren ! 1. Du musst JclRegistry und JclStrings in die Uses aufnehmen ! 2. wenn du TForm1 = class(TForm) hast sollte die function dazu auch passen
Delphi-Quellcode:
muss auf jeden Fall nach
function TfrmMain.ReadKeyToString(hkRoot ; sPath: string; sName: string; bForBartPE: Boolean = True): string;
Delphi-Quellcode:
geändert werden.
function TForm1.ReadKeyToString(hkRoot ; sPath: string; sName: string; bForBartPE: Boolean = True): string;
Und im Private Abschnitt der TForm1 muss natürlich die function auch rein
Delphi-Quellcode:
3. Welchen Typ hat denn hkRoot bitteschön ????
private
{ Private declarations } function ReadKeyToString(hkRoot ; sPath: string; sName: string; bForBartPE: Boolean = True): string; 4. Das Ergebnis (:String), wo wird denn das gespeichert ? .. bedenke das die function recursiv aufgerufen wird.. was passiert dann mit dem Ergebnis ? 5. Ich empfehle dir dringend dich erst einmal in Delphi einzuarbeiten und nicht gleich mit so einem Projekt anzufangen, das ist eindeutig zu viel für einen absoluten Anfänger der nicht einmal Grundkentnisse in Delphi besitzt ! 6. Ich könnte dir natürlich die Funktion fix und fertig geben .. aber du brauchst nicht zu Fragen ... denn aus dem obigen Grund werde ich es nicht tun. Greez ACE |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz