Registry durchsuchen nach einem Schlüssel

  • Hallo wie kann ich die Registry nach Registrierung einer datei durchsuchen komplett nicht an einer bestimmten stell.
    Kommt bei mir unter XP 36 Mal vor und vermutlich bei anderen Architekturen an anderen Stellen.
    Möchte dann bei Vorhandensaein einen Unterschlüssel gegenprüfen und ggf. löschen :)

    Nur wie durchsuche ich die registry quasi wie regedit gui mit STRG-F und ganz oft F3 :)
    Aber die regedit.exe schau mir noch mal an, schöner wäre allerdigs mit AutoIT

    Gruß Dietmar

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Wenn ich mit

    Code
    regedit /a C:\test.txt


    die Registry expotiere kann ich diese Textdatei durchsuchen, wäre machbar.

    aber ich benötige die komplette Zeile darüber um den Subkey gegenzuprüfen.

    ein Beispiel:

    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{373FF7F0-EB8B-11CD-8820-08002B2F4F5A}\ToolboxBitmap32]
    @="C:\\Windows\\system32\\comctl32.ocx, 16"

    comctl32.ocx wurde gesucht ;)

    Zitat


    Dann noch eine rekursive Funktion und schon bekommst Du Deine Suche

    Du meinst nimm HKLM merke dir alle darin enthalteten, nimm den ersten und schau darin welche es alle gibt .. ... .. .... .. .usw.
    das krieg ich nicht hin denke ich :(
    zumindest nicht in Kürze da ist der Regexport zwar hässlich aber für mich überschaubar :(

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

    • Offizieller Beitrag

    Ich hab mal schnell eine Funktion erstellt:

    Spoiler anzeigen
    [autoit]


    MsgBox(0, '', _RegSearch('HKEY_LOCAL_MACHINE', 'v3.3.4.0'))

    [/autoit] [autoit][/autoit] [autoit]

    Func _RegSearch($sRegPath, $sSearch)
    Local $sKey, $sVal, $sVar, $ret, $i = 0, $j = 0
    While True
    $i += 1
    $sKey = RegEnumKey($sRegPath, $i)
    If @error Then ExitLoop
    $ret = _RegSearch($sRegPath & '\' & $sKey, $sSearch)
    If $ret <> '' Then ExitLoop
    $j = 0
    While True
    $j += 1
    $sVal = RegEnumVal($sRegPath & '\' & $sKey, $j)
    If @error Then ExitLoop
    $sVar = RegRead($sRegPath & '\' & $sKey, $sVal)
    If $sVar == $sSearch Then Return $sRegPath & '\' & $sKey & '\' & $sVal
    WEnd
    WEnd
    Return $ret
    EndFunc

    [/autoit]
  • Klasse Vorlage Oscar, habs mal auf mehrfache Fundstellen und Teilstringsuche erweitert (nachdem ich es verstanden habe :D )

    Spoiler anzeigen
    [autoit]


    ConsoleWrite(_RegSearch('HKEY_LOCAL_MACHINE', 'v3.3.4.0') & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    Func _RegSearch($sRegPath, $sSearch)
    Local $sKey, $sVal, $sVar, $ret, $i = 0, $j = 0
    While True
    $i += 1
    $sKey = RegEnumKey($sRegPath, $i)
    If @error Then ExitLoop
    $ret = _RegSearch($sRegPath & '\' & $sKey, $sSearch)
    If $ret <> '' Then ExitLoop
    $j = 0
    While True
    $j += 1
    $sVal = RegEnumVal($sRegPath & '\' & $sKey, $j)
    If @error Then ExitLoop
    $sVar = RegRead($sRegPath & '\' & $sKey, $sVal)
    If StringInStr($sVar, $sSearch, 2) Then
    ConsoleWrite($sRegPath & '\' & $sKey & '\' & $sVal & @CRLF)
    ExitLoop
    EndIf
    WEnd
    WEnd
    Return $ret
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]
    • Offizieller Beitrag

    Wenn Du alle Fundstellen haben willst, dann sollte es aber auch eine Rückgabe als Variable geben:

    Spoiler anzeigen
    [autoit]


    $sFound = ''
    ToolTip('please wait...', @DesktopWidth / 2, @DesktopHeight / 2, 'Registry-Search', 1, 5)
    $iTimer = TimerInit()
    _RegSearch($sFound, 'HKEY_LOCAL_MACHINE', 'v3.3.4.0')
    ToolTip('')
    MsgBox(0, 'Gefunden:', Round(TimerDiff($iTimer) / 1000, 3) & ' sek.' & @CRLF & $sFound)

    [/autoit] [autoit][/autoit] [autoit]

    Func _RegSearch(ByRef $sFound, $sRegPath, $sSearch)
    Local $sKey, $sVal, $sVar, $i = 0, $j = 0
    While True
    $i += 1
    $sKey = RegEnumKey($sRegPath, $i)
    If @error Then ExitLoop
    _RegSearch($sFound, $sRegPath & '\' & $sKey, $sSearch)
    $j = 0
    While True
    $j += 1
    $sVal = RegEnumVal($sRegPath & '\' & $sKey, $j)
    If @error Then ExitLoop
    $sVar = RegRead($sRegPath & '\' & $sKey, $sVal)
    If StringInStr($sVar, $sSearch, 2) Then $sFound &= $sRegPath & '\' & $sKey & '\' & $sVal & @CRLF
    WEnd
    WEnd
    Return
    EndFunc

    [/autoit]


    BTW: Das komplette durchsuchen dauert bei mir ca. 38 sek. ^^

  • Wenn man es kann kommt man doch mit recht wenig Code aus :(
    Das hätte bei mir um einiges wuchtiger ausgesehen...

    Besten Dank dafür. das kan ich sicher immer wieder mal gebrauchen :)

    Eine Frage noch wenn ich die gesamte Registry durchsuche, muss ich ja switchen zwischen HKLM HKCU HKCR usw

    Ich habe nun eine Schleife gebastelt in der er bis 40 hochzählt und dann immer die Funktion aufruft.
    Bei Treffer den Sub_Regkey löscht, habe aber das Gefühl das er immer wieder vorne anfängt und den selben Regkey immer wieder findet.....

    EDIT: Gar nicht gesehn das Ihr noch fleissig weitergemacht habt, erst beim Bedanken gesehn, dann werde ich auch mal die Neuerungen testen... :)

    Gruß Dietmar


    Bei mir waren es 35.52 Sek mit Win7, so ist es jedenfalls ganz nah am Optimum :thumbup:

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

    Einmal editiert, zuletzt von Dietmar (24. Februar 2010 um 19:12)

  • Hallo zusammen :)

    Genau sowas habe ich gesucht *freu*

    [autoit]

    $sFound = ''
    $sVar = ''
    ToolTip('please wait...', @DesktopWidth / 2, @DesktopHeight / 2, 'Registry-Search', 1, 5)
    $iTimer = TimerInit()
    [autoit]
    _RegSearch($sFound, 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products', '{35C03C09-3F1G-42CA-A589-A7Z7EE691F65}')
    ToolTip('')
    MsgBox(0, 'Gefunden:', Round(TimerDiff($iTimer) / 1000, 3) & ' sek.' & @CRLF & $sFound)
    Func _RegSearch(ByRef $sFound, $sRegPath, $sSearch)
    Local $sKey, $sVal, $sVar, $i = 0, $j = 0
    While True
    $i += 1
    $sKey = RegEnumKey($sRegPath, $i)
    If @error Then ExitLoop
    _RegSearch($sFound, $sRegPath & '\' & $sKey, $sSearch)
    $j = 0
    While True
    $j += 1
    $sVal = RegEnumVal($sRegPath & '\' & $sKey, $j)
    If @error Then ExitLoop
    $sVar = RegRead($sRegPath & '\' & $sKey, $sVal)
    If StringInStr($sVar, $sSearch, 2) Then $sFound &= $sRegPath & '\' & $sKey & '\' & $sVal & @CRLF
    WEnd
    WEnd
    Return
    EndFunc
    if $sFound <> '' Then
    MsgBox(4096, "Test", "Nüx gefunden", 10)
    Else
    MsgBox(4096, "Test", "Was gefunden: " & $sFound & $sVar, 10)
    EndIf

    [/autoit]

    Allerdings übersteigt der script "etwas" meinen Skill. Wieso ist $sFound nicht leer, wenn der Suchbegriff nicht gefunden wurde?

    Einmal editiert, zuletzt von Surfy (26. Mai 2010 um 14:18)

  • Hallo,

    kann hier mir jemand weiterhelfen und mir sagen wir ich die MsgBox-Ausgabe unterbinden kann und das Ergebnis des Strings einfach in eine Variable schreiben kann ?
    Variable anstelle der Msgbox. Komme hier gerade einfach nicht weiter, bitte um hilfe ... thx @ all

  • Noch immer liebe ich diese Function von Oskar :rock:

    Nur habe ich das Problem, dass ich von einer X86 kompilierten Exe aus - auch die x64 Bereiche durchsuchen möchte.

    Gibt es da eine Lösung, ausser unterschiedlich kompilierte Exefiles zu nehmen und aufzurufen?

    Oder gibt es im 2014 generell eine bessere Methode so einer Registry-Suche?

    Surfy