Anzahl von Registrierungseinträgen auslesen

  • Hallo liebe Community,

    wie der Titel bereits schon sagt suche ich eine Möglichkeit, die genaue Anzahl an Unterschlüsseln aus der Registrierung zu lesen ohne dabei selber extrem hohe Zahlen auslesn zu lassen.

    Das hier ist also keine Möglichkeit:

    [autoit]

    For $i = 1 To 100

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

    Local $user = RegEnumKey ("HKU", $i)

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

    RegDelete("HKEY_USERS\"&$user&"\SOFTWARE\Citrix\ICA Client")
    Next

    [/autoit]

    Ich muss nämlich in einem anderen Schlüssel mehrere Tausend Unterschlüssel überprüfen und das auf mehreren Rechnern. Die Zahl der Schlüssel variiert hier stark und muss desshalb möglichst genau jedes mal wieder ausgelesen werden.
    Dabei muss ich dann in den einzelnen Schlüsseln auch noch nach einem gewissen Wort suchen und wenn dieses dann vorhanden ist, diesen Schlüssel auch löschen.

    Hier mein Ansatz:

    [autoit]

    $i = 1
    While 1
    $var = RegEnumKey("HKCR", $i)
    If @error <> 0 Then ExitLoop
    If StringInStr ($var, "Citrix.ICAClient") Then RegDelete ($var)
    $i += 1
    WEnd

    [/autoit]

    #Edit: Ich hatte vergessen zu erwähnen, dass mein Ansatz absolut nichts macht außer ein wenig CPU verbrauchen.

    Danke schon einmal für eure Hilfe

  • Versuch es mal so:

    Spoiler anzeigen
    [autoit]

    $i = 1

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

    While True
    $sKey = RegEnumKey("HKCR", $i)
    If @error Then ExitLoop
    If StringInStr($sKey, "Citrix.ICAClient") Then RegDelete("HKCR\" & $sKey)
    $i += 1
    WEnd

    [/autoit]


    Bitte vorher RegDelete durch etwas anderes ersetzen (z.B. ConsoleWrite), es sei denn du vertraust diesem Script völlig ;).
    RegEnumKey gibt nicht den vollständigen Pfad zu einem Schlüssel zurück, sondern lediglich seinen Namen. Du musst also zum löschen auch noch den Pfad davorschreiben. Außerdem musst du beachten, dass diese Funktion nicht rekursiv alle Unterschlüssel durchsucht, sondern nur die erste Verzeichnistiefe nach dem angegebenen Pfad.

  • Da soll jemandem doch mal wer sagen, dass er nur den Schlüsselnamen zurück gibt. Oh mist steht sogar in der Hilfe...
    Naja dennoch danke ;)

    Dass er nicht rekursiv sucht passt mir ganz gut, sonst häte er noch mehr Einträge zum durchsuchen.
    Unterschlüssel werden doch eh immer gelöscht wenn man den Hauptschlüssen löscht oder nicht?

    Deine Antwort hat mir jetzt schon sehr weitergeholfen, dennoch bleibt mein Problem mit dem Auslesen der Anzahl damit ich nicht in die Zehntausend Leerschlüsseldurchsuchungen gehen muss.

    #Edit: Leider funktioniert auch deine Version nicht ...

  • Dann schau dir mal hier die Kosnolenausgabe an:

    Spoiler anzeigen
    [autoit]

    $i = 1

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

    While True
    $sKey = RegEnumKey("HKCR", $i)
    If @error Then ExitLoop
    If StringInStr($sKey, "Citrix.ICAClient") Then ConsoleWrite("HKCR\" & $sKey & @CRLF)
    $i += 1
    WEnd

    [/autoit]


    Findet er überhaupt die gewollten Schlüssel? Sind die Pfade korrekt?

    Zitat

    Deine Antwort hat mir jetzt schon sehr weitergeholfen, dennoch bleibt mein Problem mit dem Auslesen der Anzahl damit ich nicht in die Zehntausend Leerschlüsseldurchsuchungen gehen muss.

    Wie meinst du das? Das Script durchsucht momentan alle Unterschlüssel von HKCR. Nicht mehr, nicht weniger.

    • Offizieller Beitrag

    Problem gelöst oder?

    So kannst du dir alles auch schön angucken

    Spoiler anzeigen
    [autoit]

    $i = 1

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

    While True
    $sKey = RegEnumKey("HKCR", $i)
    If @error Then ExitLoop
    If StringInStr($sKey, "Citrix.ICAClient") Then
    ConsoleWrite('!' & "HKCR\" & $sKey & @CRLF)
    Else
    ConsoleWrite($i & ': ' & $sKey & @CRLF)
    EndIf
    $i += 1
    WEnd

    [/autoit]
  • Danke noch einmal für eure Hilfe!
    Trotzdem gibt er mir nicht mal in der Konsole was aus, das heißt dann wohl, dass irgendwas mit der suche nicht stimmt -_-

    @Xeno wenn ich mir jdes Ergebnis ausgeben lasse, habe ich weit mehr als 1000 Schlüssel ;)

  • Kommt auch nichts bei raus.
    Also so langsam bin ich mit meinem Latein auch am Ende.

    Hier noch einmal der Code:

    [autoit]

    #RequireAdmin
    $i = 1
    While 1
    $var = RegEnumKey("HKCR", $i)
    If @error Then ExitLoop
    If StringInStr ($var, "Citrix") Then ConsoleWrite ("HKCR\" & $var & @CRLF)
    $i += 1
    WEnd

    [/autoit]
  • Habe die Ausgabe der zu löschenden Schlüssel jetzt mal in eine Text-Datei schreiben lassen und da geht es komischerweise.
    Also muss es am löschen liegen. Jemand in der Richtung eine Idee?

    • Offizieller Beitrag
    [autoit]

    #RequireAdmin
    $i = 1

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

    While True
    $sKey = RegEnumKey("HKCR", $i)
    If @error > 0 Then
    ConsoleWrite('!' & $i & ' ' & @error & @LF)
    ExitLoop
    EndIf
    If @error < 0 Then
    MsgBox(16, 'ERROR', 'i = ' & $i & @CRLF &'Hier schon gescheitert!')
    Exit (0)
    EndIf

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

    If StringInStr($sKey, "Citrix.ICAClient") Then
    ConsoleWrite('!' & "HKCR\" & $sKey & @CRLF)
    Else
    ConsoleWrite($i & ': ' & $sKey & @CRLF)
    EndIf
    $i += 1
    WEnd

    [/autoit]

    Und so?

  • Zu aller erst: Ich habe das Problem so gut wie gelöst.
    Habe jetzt die Variable jedes mal wieder leer gemacht, somit löscht er dann auch einige Einträge.
    Leider sind erst nach 4-5 mal ausführen alle gewünschten Einträge weg.
    Code:

    [autoit]

    #RequireAdmin
    $i = 1
    While 1
    $var = RegEnumKey("HKCR", $i)
    If @error Then ExitLoop
    If StringInStr ($var, "Citrix") Then RegDelete ("HKCR\" & $var)
    $var = ""
    $i += 1
    WEnd

    [/autoit]

    @Xeno: "Hier schon gescheitert" -_-

  • Das ist mir klar. Sobald keine Einträge mehr vorhanden sind, wird das Fenster angezeigt. Ich frage nach der Konsolenausgabe in Scite. Immerhin wurden ja bis zu dem Zeitpunkt wo das Fenster erscheint schon 3880 Einträge verarbeitet ;).

  • So funktioniert es:

    Spoiler anzeigen
    [autoit]

    #RequireAdmin

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

    $i = 1
    While 1
    $var = RegEnumKey("HKCR", $i)
    If @error Then ExitLoop
    If StringInStr ($var, "Citrix") Then RegDelete ("HKCR\" & $var)
    $var = ""
    $i += 1
    WEnd

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

    $var = ""
    $i = ""

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

    $i = 1
    While 1
    $var = RegEnumKey("HKCR", $i)
    If @error Then ExitLoop
    If StringInStr ($var, "Citrix") Then RegDelete ("HKCR\" & $var)
    $var = ""
    $i += 1
    WEnd

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

    $var = ""
    $i = ""

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

    $i = 1
    While 1
    $var = RegEnumKey("HKCR", $i)
    If @error Then ExitLoop
    If StringInStr ($var, "Citrix") Then RegDelete ("HKCR\" & $var)
    $var = ""
    $i += 1
    WEnd

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

    $var = ""
    $i = ""

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

    $i = 1
    While 1
    $var = RegEnumKey("HKCR", $i)
    If @error Then ExitLoop
    If StringInStr ($var, "Citrix") Then RegDelete ("HKCR\" & $var)
    $var = ""
    $i += 1
    WEnd

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

    $var = ""
    $i = ""

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

    $i = 1
    While 1
    $var = RegEnumKey("HKCR", $i)
    If @error Then ExitLoop
    If StringInStr ($var, "Citrix") Then RegDelete ("HKCR\" & $var)
    $var = ""
    $i += 1
    WEnd

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

    $var = ""
    $i = ""

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

    $i = 1
    While 1
    $var = RegEnumKey("HKCR", $i)
    If @error Then ExitLoop
    If StringInStr ($var, "Citrix") Then RegDelete ("HKCR\" & $var)
    $var = ""
    $i += 1
    WEnd

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

    $var = ""
    $i = ""

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

    $i = 1
    While 1
    $var = RegEnumKey("HKCR", $i)
    If @error Then ExitLoop
    If StringInStr ($var, "Citrix") Then RegDelete ("HKCR\" & $var)
    $var = ""
    $i += 1
    WEnd

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

    $var = ""
    $i = ""

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

    $i = 1
    While 1
    $var = RegEnumKey("HKCR", $i)
    If @error Then ExitLoop
    If StringInStr ($var, "Citrix") Then RegDelete ("HKCR\" & $var)
    $var = ""
    $i += 1
    WEnd

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

    $var = ""
    $i = ""

    [/autoit]

    Und noch die Ausgabe von der ich denke dass du sie meinst:
    #Edit: Den meiner Meinung nach "richtigen" Screenshot eingefügt

  • Das ist seltsam. Eigentlich muss Xenos Script in jedem Fall pro Schleifendurchgang eine Zeile in die Konsole schreiben, egal ob der String im Schlüsselnamen gefunden wird oder nicht. Wenn bis zum Scriptabbruch schon 3880 mal die Schleife durchlaufen wurde sollte die Konsole alles andere als leer sein... Wenn du in der Konsole runterscrollst steht auch nicht mehr da, oder? ^^