Registry bearbeiten, alle Hives eines Subfolders löschen, die auf ein bestimmtes File verweisen

  • Hallo zusammen

    Ich würde gerne einen Registrybereich durchsuchen (HKLM\SOFTWARE\Test\) und jeden Subhive löschen, der auf eine bestimmte DLL verweist

    Sozusagen ein delete von [xxx], falls ener.dll enthalten ist

    HKLM\SOFTWARE\Test\[xxx], "filer"="c:\\inetdb\\ener.dll"

    Code
    REGEDIT4 
    [HKEY_LOCAL_MACHINE\SOFTWARE\Test\Entry1] 
    "Counter"="3" 
    "filer"="c:\\inetdb\\ener.dll" 
    [HKEY_LOCAL_MACHINE\SOFTWARE\Test\Otherone] 
    "Counter"="4" 
    "filer"="c:\\inetdb\\ener2.dll" 
    [HKEY_LOCAL_MACHINE\SOFTWARE\Test\Something] 
    "Counter"="2" 
    "filer"="c:\\inetdb\\ener2.dll"

    Hat jemand eine Idee, wie man das in Autoit umsetzen könnte?

    Surfy

    Einmal editiert, zuletzt von Surfy (13. Oktober 2011 um 12:39)

  • Hallo,
    also möchtest du immer dein Eintrag "filter" löschen? sobald er auf die ener2.dll verweist?
    jedoch möchtest du nicht das die gesamte Strucktur gelöscht wird? also dann zb "HKEY_LOCAL_MACHINE\SOFTWARE\Test\Something"?


    EDIT: // schau dir mal dieses Thread an dort ist eigentlich alles dabei was du brauchst [ offen ] Registry durchsuchen nach einem Schlüssel
    Gruß Marvin

    Einmal editiert, zuletzt von Protex (13. Oktober 2011 um 10:07)

  • Hi Marvin

    Doch, das Ziel wäre, die ganze Struktur zu löschen, falls darin der "filer"="c:\\inetdb\\ener.dll" enthalten ist.

    Deswegen haben mir die gefundenen Sachen wie "Regsearch" nicht geholfen, weil ich etwas "mehr" löschen würde, als das gesuchte.

    Surfy

  • Hab mal schnell was gebaut hoffe damit ist es gelöst :)

    [autoit]


    $sRegPath = 'HKEY_LOCAL_MACHINE\SOFTWARE\Test\'
    $sSearch = 'c:\\inetdb\\ener.dll'
    _RegDelSearch($sRegPath,$sSearch,'filter')

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

    Func _RegDelSearch($sRegPath,$sSearch,$Key)
    Local $i = 0 ,$sKey, $RegRead

    While True
    $i += 1
    $sKey = RegEnumKey($sRegPath, $i)
    If $sKey = '' Then ExitLoop
    $RegRead = RegRead($sRegPath & $sKey, $Key)
    If $RegRead = '' Then ContinueLoop
    If $RegRead = $sSearch Then
    RegDelete($sRegPath & $sKey)
    EndIf

    WEnd

    EndFunc

    [/autoit]

    Gruß Marvin

  • Herzlichen Dank Marvin, so läufts 1a!

    Spoiler anzeigen

    Ich musste nur noch den $ssearch Value anpassen, die doppel "\\" kommen nur beim Registry Export :)

    [autoit]

    $sRegPath = 'HKEY_LOCAL_MACHINE\SOFTWARE\Test\'
    $sSearch = 'c:\inetdb\ener.dll'
    _RegDelSearch($sRegPath,$sSearch,'filer')

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

    Func _RegDelSearch($sRegPath,$sSearch,$Key)
    Local $i = 0 ,$sKey, $RegRead
    While True
    $i += 1
    $sKey = RegEnumKey($sRegPath, $i)
    If $sKey = '' Then ExitLoop
    $RegRead = RegRead($sRegPath & $sKey, $Key)
    If $RegRead = '' Then ContinueLoop
    If $RegRead = $sSearch Then
    ;MsgBox(4096, "Test", $sSearch, 10)
    RegDelete($sRegPath & $sKey)
    EndIf
    WEnd
    EndFunc

    [/autoit]

    Jetzt probiere ich das noch für die gleichen HKCU Keys aller lokalen Benutzer umzusetzen, hab da was ganz spannendes im englischen Forum entdeckt:

    Das Registry UDF http://www.autoitscript.com/forum/topic/75…fs/page__st__40

    Da kann man sich die SIDs aller lokalen User anzeigen lassen, bearbeiten, und so ev auch deine Function darin verschachteln :)

    HKCU\SOFTWARE\Test filer='c:\\inetdb\\ener.dll' :whistling: 8o

    Surfy

  • Mhh, wenn ich das richtig sehe, müsste ich mit Verwendung von dem Hive in der Form von

    "HKEY_USERS" ("HKU"),

    und deiner Funktion - auch schon alle Userprofile durchkämmen? *kopfkratz*

    Zitat

    Ein Registry-Schlüssel muss mit "HKEY_LOCAL_MACHINE" ("HKLM"), "HKEY_USERS" ("HKU"), "HKEY_CURRENT_USER" ("HKCU"), "HKEY_CLASSES_ROOT" ("HKCR")oder "HKEY_CURRENT_CONFIG" ("HKCC") beginnen.


    Ansonsten würde die Unterscheidung ja keinen Sinn machen, im Vergleich von HKU zu HKCU. Nur wieso denn das UDF im englischsprachigen Forum?

  • XD ich weiß nicht mal was du machen willst, ich hab mir auch die UDF nicht angeschaut (wieso soltle ich auch) 8|

    nochmal zum Verständnis , du willst einfach den "HKEY_CURRENT_USER" durchsuchen nach irgend einem KEY? und wieder irgend was löschen?

    wenn ja nimm doch einfach meine Func und bau sie dir ggf. einfach um wie du sie halt benötigst.. wäre schoen wenn du beim nächsten mal etwas mehr Details preisgeben könntest und ein SourceCode ist auch nicht schlecht :P

    Gruß Marvin

  • Dass war jetzt mal nur theoretisch angesprochen.

    Ich habe hier PCs an dem abwechselnd mehrere User arbeiten, mit unterschiedlichen User-Profilen.

    Unter der Annahme das alle Adminuser sind, wäre es nun natürlich interessant, wenn ich einen "Clean-Up" falscher Registry Keys - gleich für alle User durchführen könnte, die ein lokales Profil haben.

    DH: wenn ich deinen Script nun mit

    [autoit]

    $sRegPath = 'HKEY_CURRENT_USER\SOFTWARE\Test\'

    [/autoit]

    verwende, dann löscht er die falschen Beiträge in meinem Profil. Aber nicht in anderen Profilen auf meinem PC.

    Gib mal in einem Command Fenster ein: REG QUERY HKU

    Du siehst dann mindestens so etwas, je nach anzahl lokaler User - einige mehr:

    Dann siehst Du die SID`s aller lokalen Userprofile. Diese Profile findest Du in Regedit auch wieder - abgebildet unter HKey_USERS.

    Mein Anliegen wäre nun, anstelle von

    [autoit]

    $sRegPath = 'HKEY_USERS\SOFTWARE\Test\'

    [/autoit]

    zu verwenden, damit gleich alle Userprofile korrigiert sind.

    Hab dass gerade ausprobiert, klappt leider nicht :huh: Daher ist mir greade auch unklar, wieso Autoit einen Unterschied von

    ("HKU") und ("HKCU"),macht, laut hilfe, wenn man da dann doch nicht rankommt.

    Der Link ins Englische Forum führt zu einem UDF, mit dem es möglich ist, alle lokalen und remote gespeicherten Userprofile zu bearbeiten. Aber halt auch "nur" etwas suchen und löschen, aber nicht etwas übergeordnetes wie Du es hier in deiner Function gemacht hast.

    Surfy

  • Naja dann benötigst du eine Rekursive Suche durch die Registry ^^
    also muss er in einer While Schleife die Strucktur durchgehen und sobald er einen Treffer hat den dazugehörigen Ordner löschen
    sollte eigentlich machbar sein ;)

    Gruß Marvin


    EDIT : Hier , habe weitergebastelt und nun ist eine Funktion dabei von "Oscar" übernommen.. diese Sucht dir alle Ordner herraus die einen Schlüssel enthalten mit dem Wert den du der Funktion übergibst.

    Alle Pfade werden im Moment noch in der Console ausgegeben aber ich schätze das wirst du dir schon umbauen können :)

    Spoiler anzeigen
    [autoit]

    $sRegPath = 'HKEY_LOCAL_MACHINE\SOFTWARE\Test\'
    $sRegPath2 = 'HKEY_USERS'
    $sSearch = 'c:\\inetdb\\ener.dll'
    ;_RegDelSearch($sRegPath,$sSearch,'filter')
    _RegDelSearchRekursiv($sRegPath2, $sSearch)

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

    Func _RegDelSearch($sRegPath,$sSearch,$Key)
    Local $i = 0 ,$sKey, $RegRead

    While True
    $i += 1
    $sKey = RegEnumKey($sRegPath, $i)
    If $sKey = '' Then ExitLoop
    $RegRead = RegRead($sRegPath & $sKey, $Key)
    If $RegRead = '' Then ContinueLoop
    If $RegRead = $sSearch Then
    RegDelete($sRegPath & $sKey)
    EndIf
    WEnd
    EndFunc

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

    ;Func von Oscar (http://www.Autoit.de) EDIT By Protex
    Func _RegDelSearchRekursiv($sRegPath, $sSearch)
    Local $sKey, $sVal, $sVar, $ret, $i = 0, $j = 0
    While True
    $i += 1
    $sKey = RegEnumKey($sRegPath, $i)
    If @error Then ExitLoop
    $ret = _RegDelSearchRekursiv($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 & @CRLF)
    ExitLoop
    EndIf
    WEnd
    WEnd
    Return $ret
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von Protex (13. Oktober 2011 um 14:39)