![]() |
AW: Registry durchsuchen
|
AW: Registry durchsuchen
Ja. Das sieht schon einmal sehr gut aus. 2 Sachen fehlen aber noch bzw. sind fehlerhaft, soweit es das Anzeigen betrifft:
|
AW: Registry durchsuchen
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.
|
AW: Registry durchsuchen
Danke für Eure Hilfe (auch
![]() Ich vergleiche die Registry mal mit einem Dateisystem. Wenn ich das richtig verstanden habe, dann sind die keys (
Delphi-Quellcode:
) die (Unter)Verzeichnisse und die values (
GetKeynames
Delphi-Quellcode:
) 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.
GetValueNames
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; |
AW: Registry durchsuchen
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
Delphi-Quellcode:
ergibt.
RPath + '\' + S
|
AW: Registry durchsuchen
Hallo,
Zitat:
Zitat:
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:
Vielleicht hilft 's
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; Gruß |
AW: Registry durchsuchen
Zitat:
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. |
AW: Registry durchsuchen
Zitat:
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. |
AW: Registry durchsuchen
Liste der Anhänge anzeigen (Anzahl: 1)
Ups, bevor ich es nochmal vergess'.
TRegistryEx.Reflection, bzw. ![]() 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. |
AW: Registry durchsuchen
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:16 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 by Thomas Breitkreuz