Also so dämlich bin ich dann doch nicht :p
Und nein da steht nichts
Anzahl von Registrierungseinträgen auslesen
-
- [ offen ]
-
Gabbadome -
2. November 2012 um 11:40 -
Geschlossen -
Erledigt
-
-
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
[/autoit] [autoit][/autoit] [autoit]
$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)
EndIfIf StringInStr($sKey, "Citrix.ICAClient") Then
[/autoit]
ConsoleWrite('!' & "HKCR\" & $sKey & @CRLF)
Else
ConsoleWrite($i & ': ' & $sKey & @CRLF)
EndIf
$i += 1
WEnd
Mit Adminrechten:Spoiler anzeigen
[autoit]#RequireAdmin
[/autoit] [autoit][/autoit] [autoit]
$i = 1$hLogFile = FileOpen(@ScriptDir & "\log.txt", 2)
[/autoit] [autoit][/autoit] [autoit]While True
[/autoit] [autoit][/autoit] [autoit]
$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
EndIfIf StringInStr($sKey, "Citrix.ICAClient") Then
[/autoit] [autoit][/autoit] [autoit]
FileWrite($hLogFile, '!' & "HKCR\" & $sKey & @CRLF)
Else
FileWrite($hLogFile, $i & ': ' & $sKey & @CRLF)
EndIf
$i += 1
WEndFileClose($hLogFile)
[/autoit]
ShellExecute(@ScriptDir & "\log.txt")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
[/autoit] [autoit][/autoit] [autoit]
While 1
$var = RegEnumKey("HKCR", $i)
If @error Then ExitLoop
If StringInStr ($var, "Citrix") Then RegDelete ("HKCR\" & $var)
$var = ""
$i += 1
WEnd$var = ""
[/autoit] [autoit][/autoit] [autoit]
$i = ""$i = 1
[/autoit] [autoit][/autoit] [autoit]
While 1
$var = RegEnumKey("HKCR", $i)
If @error Then ExitLoop
If StringInStr ($var, "Citrix") Then RegDelete ("HKCR\" & $var)
$var = ""
$i += 1
WEnd$var = ""
[/autoit] [autoit][/autoit] [autoit]
$i = ""$i = 1
[/autoit] [autoit][/autoit] [autoit]
While 1
$var = RegEnumKey("HKCR", $i)
If @error Then ExitLoop
If StringInStr ($var, "Citrix") Then RegDelete ("HKCR\" & $var)
$var = ""
$i += 1
WEnd$var = ""
[/autoit] [autoit][/autoit] [autoit]
$i = ""$i = 1
[/autoit] [autoit][/autoit] [autoit]
While 1
$var = RegEnumKey("HKCR", $i)
If @error Then ExitLoop
If StringInStr ($var, "Citrix") Then RegDelete ("HKCR\" & $var)
$var = ""
$i += 1
WEnd$var = ""
[/autoit] [autoit][/autoit] [autoit]
$i = ""$i = 1
[/autoit] [autoit][/autoit] [autoit]
While 1
$var = RegEnumKey("HKCR", $i)
If @error Then ExitLoop
If StringInStr ($var, "Citrix") Then RegDelete ("HKCR\" & $var)
$var = ""
$i += 1
WEnd$var = ""
[/autoit] [autoit][/autoit] [autoit]
$i = ""$i = 1
[/autoit] [autoit][/autoit] [autoit]
While 1
$var = RegEnumKey("HKCR", $i)
If @error Then ExitLoop
If StringInStr ($var, "Citrix") Then RegDelete ("HKCR\" & $var)
$var = ""
$i += 1
WEnd$var = ""
[/autoit] [autoit][/autoit] [autoit]
$i = ""$i = 1
[/autoit] [autoit][/autoit] [autoit]
While 1
$var = RegEnumKey("HKCR", $i)
If @error Then ExitLoop
If StringInStr ($var, "Citrix") Then RegDelete ("HKCR\" & $var)
$var = ""
$i += 1
WEnd$var = ""
[/autoit] [autoit][/autoit] [autoit]
$i = ""$i = 1
[/autoit] [autoit][/autoit] [autoit]
While 1
$var = RegEnumKey("HKCR", $i)
If @error Then ExitLoop
If StringInStr ($var, "Citrix") Then RegDelete ("HKCR\" & $var)
$var = ""
$i += 1
WEnd$var = ""
[/autoit]
$i = "" -
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
[/autoit] [autoit][/autoit] [autoit]
$i = 1$hLogFile = FileOpen(@ScriptDir & "\log.txt", 2)
[/autoit] [autoit][/autoit] [autoit]While True
[/autoit] [autoit][/autoit] [autoit]
$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
EndIfIf StringInStr($sKey, "Citrix.ICAClient") Then
[/autoit] [autoit][/autoit] [autoit]
$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
WEndFileClose($hLogFile)
[/autoit]
ShellExecute(@ScriptDir & "\log.txt")
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]
[/autoit][autoit][/autoit][autoit]
; Bsp.
_RegDeleteKey("HKEY_CURRENT_USER", "TEST\BLA")Func _RegDeleteKey($HKEY, $strKeyPath)
[/autoit]
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 -