Anzahl von Registrierungseinträgen auslesen

  • Interessant... Ich habe gerade herausgefunden, dass Scite scheinbar nicht mehr auf den Stdout Stream von Autoit zugreift wenn das Script Adminrechte hat. Jetzt gibt es zwei Alternativen, probier mal bitte beides aus:

    Ohne Adminrechte:

    Spoiler anzeigen
    [autoit]

    $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]


    Mit Adminrechten:

    Spoiler anzeigen
    [autoit]

    #RequireAdmin
    $i = 1

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

    $hLogFile = FileOpen(@ScriptDir & "\log.txt", 2)

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

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

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

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

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

    FileClose($hLogFile)
    ShellExecute(@ScriptDir & "\log.txt")

    [/autoit]

    Hier wird alles in eine Logdatei geschrieben.

  • Tolle Sache. Er spuckt mir tatsächlich die Schlüssel alle aus, weigert sich aber diese auch zu löschen. Ich fühle mich grade ein wenig verarscht...

    Dann kommt noch die Tatsache dazu, dass meine Variante nur Funktioniert wenn ich sie mindestens 6 mal wiederhole. Lässt sich vielleicht mit 6 unterschiedlichen Anfängen der Keys erklären, vielleicht aber auch nicht.

    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]
  • Langsam weiß ich auch nicht mehr weiter, aber den selben Scriptteil 6 mal hintereinander zu schreiben kann keine Lösung sein..
    Jetzt sollte er dir zumindest sagen, welche Schlüssel nicht gelöscht werden.

    Spoiler anzeigen
    [autoit]

    #RequireAdmin
    $i = 1

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

    $hLogFile = FileOpen(@ScriptDir & "\log.txt", 2)

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

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

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

    If StringInStr($sKey, "Citrix.ICAClient") Then
    $iRet = RegDelete("HKCR\" & $sKey)
    If $iRet <> 1 Then
    FileWrite($hLogFile, $i & @TAB & "RegDelete Error: HKCR\" & $sKey & @TAB "Return Code: " & $iRet & @TAB & "Error Code: " & @error & @CRLF)
    Else
    RegRead("HKCR\" & $sKey)
    If @error Then
    FileWrite($hLogFile, $i & @TAB & "Deleted: HKCR\" & $sKey & @CRLF)
    Else
    FileWrite($hLogFile, $i & @TAB & "!NOT Deleted: HKCR\" & $sKey & @CRLF)
    EndIf
    EndIf
    EndIf
    $i += 1
    WEnd

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

    FileClose($hLogFile)
    ShellExecute(@ScriptDir & "\log.txt")

    [/autoit]


    Zur Not könnte man auch RegDelete für jeden Schlüssel solange ausführen, bis er nicht mehr existiert. Aber das ist wirklich nur eine unsaubere Notlösung (trotzdem besser als den Code einfach 6 mal auszuführen).

    • Offizieller Beitrag

    Hi,
    hier tritt folgendes Problem auf:
    Hier wird versucht mit dem Löschen eines Schlüssels auch die Unterschlüssel zu löschen --- DAS kann nicht gehen.
    Windows löscht intern zu jedem Parent.Key erstmal alle Sub.Keys, aus alten DOS-Zeiten bekannt: Verzeichnisse mit Inhalt kann man nicht Löschen. Die modernen Löschbefehle nehmen dem User die Arbeit ab, sodass man davon nichts mitbekommt.
    Es wird also eine rekursive Funktion benötigt, die für jeden Schlüssel prüft, ob er Unterschlüssel hat und erst bei "Nein" den Schlüssel löscht. Also von Innen nach Aussen Löschen.

  • Zitat


    Es wird also eine rekursive Funktion benötigt, die für jeden Schlüssel prüft, ob er Unterschlüssel hat und erst bei "Nein" den Schlüssel löscht. Also von Innen nach Aussen Löschen.


    Sowas hatte ich zwar vermutet, aber ich war irgendwie verwirrt, weil es bei ihm nach 6 Versuchen zu funktionieren scheint...

    • Offizieller Beitrag

    Hab mal die Delete-Funktion (per WMI) erstellt:

    btw.: Diese Funktion läuft ohne #RequireAdmin

    [autoit]


    ; Bsp.
    _RegDeleteKey("HKEY_CURRENT_USER", "TEST\BLA")

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

    Func _RegDeleteKey($HKEY, $strKeyPath)
    If StringRight($HKEY, 1) = '\' Then $HKEY = StringTrimRight($HKEY, 1)
    Select
    Case $HKEY = "HKEY_LOCAL_MACHINE" Or $HKEY = "HKLM"
    $HKEY = 0x80000002
    Case $HKEY = "HKEY_USERS" Or $HKEY = "HKU"
    $HKEY = 0x80000003
    Case $HKEY = "HKEY_CURRENT_USER" Or $HKEY = "HKCU"
    $HKEY = 0x80000001
    Case $HKEY = "HKEY_CLASSES_ROOT" Or $HKEY = "HKCR"
    $HKEY = 0x80000000
    Case $HKEY = "HKEY_CURRENT_CONFIG" Or $HKEY = "HKCC"
    $HKEY = 0x80000005
    EndSelect
    Local $sNames, $sKeyName
    Local $oReg = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
    Local $iRet = $oReg.DeleteKey($HKEY, $strKeyPath)
    If $iRet <> 0 Then
    $iRet = $oReg.EnumKey($HKEY, $strKeyPath, $sNames)
    For $sKeyName In $sNames
    $iRet = _RegDeleteKey($HKEY, $strKeyPath & "\" & $sKeyName)
    Next
    $oReg.DeleteKey($HKEY, $strKeyPath)
    EndIf
    EndFunc ;==>_RegDeleteKey

    [/autoit]