AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Registry durchsuchen

Ein Thema von Aurelius · begonnen am 20. Mai 2008 · letzter Beitrag vom 15. Feb 2014
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: Registry durchsuchen

  Alt 10. Feb 2014, 14:24
Funktioniert das hier evtl.?

http://www.swissdelphicenter.ch/de/showcode.php?id=1176
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#12

AW: Registry durchsuchen

  Alt 11. Feb 2014, 09:08
Ja. Das sieht schon einmal sehr gut aus. 2 Sachen fehlen aber noch bzw. sind fehlerhaft, soweit es das Anzeigen betrifft:
  1. Es sollte OpenKeyReadOnly(''); statt OpenKey('', False); verwendet werden.
    Zumindest in meinem Windows 8 muss man das sonst zwingend als Administrator laufen lassen. Ein Großteil der Schlüssel wird sonst mangels Rechten nicht angezeigt. Und um das Anzeigen geht es schließlich auch in dem Code-Beispiel. (Unter XP fällt das natürlich nicht auf )
  2. Und es fehlt für meine Belange noch das "Reinschauen" in die einzelnen Keys. Eine Suche macht ja nur Sinn, wenn man auch dort nachsieht. -> Aber das bekomme ich auch noch hin.
Danke für die schnelle und wirklich hilfreiche Antwort!
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: Registry durchsuchen

  Alt 11. Feb 2014, 09:14
Es sollte auch genügen, die Registry-Instanz mit KEY_READ-Rechten zu erzeugen. Und wenn ich mich recht entsinne gibt es sogar Schlüssel, auf die nicht einmal der Administrator zugreifen kann.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#14

AW: Registry durchsuchen

  Alt 12. Feb 2014, 12:57
Danke für Eure Hilfe (auch hier) soweit.

Ich vergleiche die Registry mal mit einem Dateisystem. Wenn ich das richtig verstanden habe, dann sind die keys (GetKeynames ) die (Unter)Verzeichnisse und die values (GetValueNames ) die Dateien. In den Values sind dann Werte enthalten. Da ich nach einem String suche, war jetzt meine Idee, die Values zu öffnen und die Werte als String auszulesen.
Das klappt aber irgendwie nicht. Ich suche nach einem Wert, der definitiv (jedenfalls lt. regedit) vorhanden ist und er wird trotzdem nicht gefunden.

Aktuell sieht mein Code jetzt so aus:
Delphi-Quellcode:
Procedure TMainForm.SearchReg;
Var
   SearchStr   : String;

   Procedure EnumAllKeys(hkey: THandle; Const RPath: String);
   Var
      KeyList   : TStringList;
      ValList   : TStringList;
      n         : Integer;
      S, T      : String;
      lReg      : TRegistry;
   Begin
      With TRegistry.Create Do
      Try
         RootKey:=hkey;
         OpenKeyReadOnly(EmptyStr);
         KeyList:=TStringList.Create;
         ValList:=TStringList.Create;
         Try
            GetKeynames(KeyList);
            GetValueNames(ValList);
            CloseKey;
            For n:=0 To Pred(ValList.Count) Do   // Einträge durchgehen
            Begin
               S:=ValList[n];
               If Pos(SearchStr, UpperCase(S)) > 0 Then
                  LBRegistry.Items.Append('[val] ' + RPath + '\' + S);

               lReg:=TRegistry.Create;            // Einträge selbst auslesen
               Try
                  lReg.RootKey:=hkey;
                  T:=lReg.ReadString(RPath + '\' + S);
                  If Pos(SearchStr, UpperCase(T)) > 0 Then
                     LBRegistry.Items.Append('[con] ' + RPath + '\' + S + '=' + T);
                  Finally
                  lReg.Free;
               End;
            End;

            For n:=0 To Pred(KeyList.Count) Do   // weitere Keys suchen
            Begin
               S:=KeyList[n];
               If Pos(SearchStr, UpperCase(S)) > 0 Then
                  LBRegistry.Items.Append('[key]' + RPath + '\' + S);
               If OpenKeyReadOnly(S) Then
               Begin
                  EnumAllKeys(CurrentKey, RPath + '\' + S);
                  CloseKey;
               End;
            End;
         Finally
            KeyList.Free;
            ValList.Free;
         End;
      Finally
         Free;
      End;
   End;

Begin
   SearchStr:=UpperCase(EDSearch.Text);
   LBRegistry.Items.Clear;
   LBRegistry.Items.BeginUpdate;
   Try
//   EnumAllKeys(HKEY_CLASSES_ROOT ,'');
//   EnumAllKEys(HKEY_CURRENT_USER ,'');
      EnumAllKEys(HKEY_LOCAL_MACHINE ,'');
//   EnumAllKEys(HKEY_USERS ,'');
//   EnumAllKEys(HKEY_PERFORMANCE_DATA,'');
//   EnumAllKEys(HKEY_CURRENT_CONFIG ,'');
//   EnumAllKEys(HKEY_DYN_DATA ,'');
   Finally
      LBRegistry.Items.EndUpdate;
   End;
End;
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: Registry durchsuchen

  Alt 12. Feb 2014, 13:09
Irgendwie scheint da ein lReg.OpenKey zu fehlen, oder habe ich es nur übersehen? So suchst Du ja im Wurzelknoten nach einem Eintrag, dessen Name sich aus
RPath + '\' + S ergibt.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#16

AW: Registry durchsuchen

  Alt 12. Feb 2014, 23:33
Hallo,

Zitat:
[...] Das klappt aber irgendwie nicht. Ich suche nach einem Wert, der definitiv (jedenfalls lt. regedit) vorhanden ist und er wird trotzdem nicht gefunden.
Naja, wenn regedit sagt, dass der Wert in der Registry steht, dann wird das schon so sein; wenn Dein Programm den Wert nicht findet liegt es wohl an Deiner Programmierung.

Zitat:
Aktuell sieht mein Code jetzt so aus:
Und da haben wir es schon:
  1. Du versuchst einen Wurzelknoten (EmptyString) zu öffnen (was nur [in Deinem Fall] bei HKEY_LOCAL_MACHINE klappt, ansonsten raus aus der procedure)
  2. Du liest alle Unterschlüssel ein (KeyList)
  3. Du liest alle Wertebezeichner ein (ValueList)
  4. Du schließt den geöffneten Schlüssel
  5. Du versuchst auf Daten eines geschlossenen Schlüssels zuzugreifen (was nicht funktioniert)
  6. Du gehst (nicht über Los, sondern direkt) mit dem aktuellen CurrentKey (da der bereits geschlossen wurde und 0 ist) zu Schritt 1. (das funktioniert aber nicht, himitsu und meinereiner hatten das aber schon gesagt)
Da wundert es nicht, dass Du nix findest!

Zu 1.: Wenn Du nur in einen bestimmten Hauptschlüssel (z. B. HKEY_LOCAL_MACHINE) suchen möchtest, dann kannst Du das konstant gestalten, ansonsten immer den Hauptschlüssel als Parameter übergeben
Zu 2.: Warum zwei Listen, wenn es in diesem Fall auch mit einer geht?
Zu 3.: Dito
Zu 4.: Lass das bleiben
Zu 5.: Dito
Zu 6.: Lass CurrentKey weg (entweder konstant oder den Hauptschlüssel per Parameter, den "Pfad" oder Unterschlüssel relativ übergeben)

In Code gegossen vielleicht so (Hauptschlüssel per Parameter):
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
   SearchString : string;

   procedure EnumAllKeys (const Root : HKEY; const Key : string);
   var
     r : TRegistry;
     l : TStringList;
     i : Integer;
     s : string;
   begin
     r := TRegistry.Create;
     l := TStringList.Create;
     try
       r.RootKey := Root;

       if r.OpenKeyReadOnly (Key) then
         begin
           r.GetValueNames (l);
           for i := 0 to l.Count - 1 do
             begin
               s := l [i];
               if Pos (SearchString, UpperCase (s)) > 0 then
                 ListBox1.Items.Add ('[val] ' + r.CurrentPath + '\' + s);

               if r.GetDataType (s) in [rdString, rdExpandString] then
                 begin
                   s := r.ReadString (s);
                   if Pos (SearchString, UpperCase (s)) > 0 then
                     ListBox1.Items.Add ('[con] ' + r.CurrentPath + '\' + s)
                 end
             end;

           r.GetKeyNames (l);
           for i := 0 to l.Count - 1 do
             begin
               s := l [i];
               if Pos (SearchString, UpperCase (s)) > 0 then
                 ListBox1.Items.Add ('[key] ' + r.CurrentPath + '\' + s);

               EnumAllKeys (Root, r.CurrentPath + '\' + s)
             end
         end
     finally
       r.Free;
       l.Free
     end
   end;

begin
   SearchString := 'PRINT';
   EnumAllKeys (HKEY_CURRENT_CONFIG, '')
end;
Vielleicht hilft 's

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#17

AW: Registry durchsuchen

  Alt 13. Feb 2014, 12:41
...
Vielleicht hilft 's
Perfekt! Danke.
Vielleicht sollte man das noch in die Code Library übernehmen. In der Kürze und Vollständigkeit ist das meines Erachtens sehr hilfreich und ich habe das in vergleichbarer Form im Netz nirgends gefunden.
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#18

AW: Registry durchsuchen

  Alt 13. Feb 2014, 15:58
Naja, wenn regedit sagt, dass der Wert in der Registry steht, dann wird das schon so sein; wenn Dein Programm den Wert nicht findet liegt es wohl an Deiner Programmierung.
Oder an den "Umleitungen" des Systems.

Werden für 32-Bit-Programme Umleitungen eingerichtet, damit die im Win64 ihr Zeug an den "gewohnten" 32-Bit-Orten finden.




Irgendwie spinnt TeamViewer grad. (in 1-2 Stündchen dann)
Hab daheim eine PAS rumliegen, in der die TRegistry um so paar Funktionen erweitert wurde, wie Umleitungen deaktivieren oder selber Welche setzen oder Arbeiten in 'ner Transaktione usw.
Man kann sich natürlich auch selber entsprechenden WinAPIs raussuchen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (13. Feb 2014 um 16:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#19

AW: Registry durchsuchen

  Alt 15. Feb 2014, 00:38
Ups, bevor ich es nochmal vergess'.
TRegistryEx.Reflection, bzw. MSDN-Library durchsuchenRegDisableReflectionKey

Die Funktiononen für's Dateisystem fehlen noch (die alte Implementation gefällt mir nicht mehr) und da sich das schrottige TRegistry nicht "überschreiben" läßt, ist diese Implementation auch nich ganz ideal.
Angehängte Dateien
Dateityp: pas System.Win.Transaction.pas (32,9 KB, 10x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (15. Feb 2014 um 00:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#20

AW: Registry durchsuchen

  Alt 15. Feb 2014, 12:41
Hallo,
Hinweis: es fehlt noch ein UPPERCASE beim Searchstring, wenn man es verallgemeinern will

Delphi-Quellcode:
begin
    SearchString := UPPERCASE('PRINT'); // <====
    EnumAllKeys (HKEY_CURRENT_CONFIG, '')
end;
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz