Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Windows Registry Rekursiv auslesen (https://www.delphipraxis.net/75374-windows-registry-rekursiv-auslesen.html)

KrazyMartz 18. Aug 2006 14:25


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

Xplosion 19. Aug 2006 11:46

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;

KrazyMartz 21. Aug 2006 09:57

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

JoergZiemer 21. Aug 2006 12:29

Re: Windows Registry Rekursiv auslesen
 
Hallo,

so könnte es gehen:

Delphi-Quellcode:
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;
viel Erfolg
Jörg

TKC 21. Aug 2006 13:14

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;

KrazyMartz 21. Aug 2006 14:46

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

TKC 21. Aug 2006 15:17

Re: Windows Registry Rekursiv auslesen
 
also 1. JCL = JEDI CODE LIBRARY und wird für die Zugriffe auf RegBinary genutzt.

Download und Infos

2. Funktionsaufruf ist z.B. folgender:
Delphi-Quellcode:
ConvertKeysToBartPE(HKCU, '\SOFTWARE\Adobe', Memo1, True);
Wert 1-2 : sollten selbsterklärend sein
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!

KrazyMartz 21. Aug 2006 15:34

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

KrazyMartz 22. Aug 2006 10:30

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:

[Error] Unit1.pas(27): Function needs result type
[Error] Unit1.pas(42): Undeclared identifier: 'hkRoot'
[Error] Unit1.pas(43): Undeclared identifier: 'sPath'
[Error] Unit1.pas(45): Undeclared identifier: 'RegGetDataType'
[Error] Unit1.pas(45): Undeclared identifier: 'sName'
[Error] Unit1.pas(49): Undeclared identifier: 'KeyTypeToStr'
[Error] Unit1.pas(49): Undeclared identifier: 'bForBartPE'
[Error] Unit1.pas(78): Undeclared identifier: 'RegReadMultiSz'
[Error] Unit1.pas(87): Undeclared identifier: 'StrLeft'
[Error] Unit1.pas(87): Incompatible types
[Error] Unit1.pas(95): Undeclared identifier: 'RegGetDataSize'
[Error] Unit1.pas(96): Undeclared identifier: 'RegReadBinary'
[Error] Unit1.pas(98): Operator not applicable to this operand type
[Error] Unit1.pas(112): Incompatible types
[Error] Unit1.pas(127): Undeclared identifier: 'ConvertKeysToBartPE'
[Error] Unit1.pas(127): Undeclared identifier: 'HKCU'
[Fatal Error] Project2.dpr(5): Could not compile used unit 'Unit1.pas'
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

TKC 22. Aug 2006 11:56

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:
function TfrmMain.ReadKeyToString(hkRoot ; sPath: string; sName: string; bForBartPE: Boolean = True): string;
muss auf jeden Fall nach
Delphi-Quellcode:
function TForm1.ReadKeyToString(hkRoot ; sPath: string; sName: string; bForBartPE: Boolean = True): string;
geändert werden.
Und im Private Abschnitt der TForm1 muss natürlich die function auch rein
Delphi-Quellcode:
  private
    { Private declarations }
    function ReadKeyToString(hkRoot ; sPath: string; sName: string; bForBartPE: Boolean = True): string;
3. Welchen Typ hat denn hkRoot bitteschön ????

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.
Seite 1 von 2  1 2      

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