29.07.2017, 21:50 
	
	
	(29.07.2017, 18:31)Gorathan schrieb: Und so wie Du das umgesetzt hast, ist das mit den Checkboxen ja ein "entweder/oder". Dafür würde man aber keine Checkboxen verwenden, sondern Radio-Controls oder eine Combo-Box (die besitzen das von Haus aus).
Bei Checkboxen würde ich erwarten, dass in beiden Zweigen gesucht wird und auch alle Ergebnisse in eine Datei geschrieben werden.
Hallo,
ich habe jetzt Radiocontrols verwendet. Ich gebe zu, das ist sinnvoller. Aber jetzt habe ich das Problem, dass mir der aktuelle Stand mit " _GUICtrlStatusBar_SetText($hStatus, " HKLM ausgewählt", 1)" nicht in die Statusbar geschrieben wird und irgendwie der GUIOnEventMode nicht richtig funktioniert. Würdest Du bitte über den Code schauen was ich falsch mache?
Show ContentRegSearch:
		
#NoTrayIcon
#RequireAdmin
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
#include <AutoItConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <FileConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <Misc.au3>
#include <StatusBarConstants.au3>
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Opt('MustDeclareVars', 1) ; Variablen müssen deklariert werden.
Opt('GUIOnEventMode', 1) ; Eventmode aktivieren.
AutoItSetOption("GUICloseOnESC", 1) ; Wenn ESC gedrückt wird, Gui beenden.
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Global $sInput1, $sstart, $nMsg, $sString, $hgui, $idHKLM, $idHKCU, $outfile
Global $sTitle = 'RegSearch'
Global $sVersion = '1.0.0.3'
Global $sAuthor = 'Bazii'
Global $sDate = '28.07.2017'
Global $sFound = ''
Global $hDLL = DllOpen("user32.dll")
Global $outfile = (@ScriptDir & '\RegSearch.exe')
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
If _Singleton($sTitle, 1) = 0 Then ; Wenn eine Instanz dieses Programms läuft, dann Meldung ausgeben ...
    MsgBox(64, "Achtung", " -RegSearch- wurde bereits gestartet und kann nicht ein zweites Mal gestartet werden!", 10) ; Meldung ausgeben (Teil 1)
    Exit ; Programm beenden
EndIf; Ende der If-Abfrage: Läuft bereits eine weitere Instanz?
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
$hgui= GUICreate($sTitle & ' ' & $sVersion, 300, 150, -1, -1)
GUISetIcon("..\..\ICON\logo_FTP.ico", -1)
GUICtrlSetFont(-1, 9, 500, "Arial")
GUISetBkColor(0xD7E4F2)
GUISetOnEvent($gui_EVENT_CLOSE, "__GUI_EVENT_CLOSE_")
$sInput1 = GUICtrlCreateInput("", 8, 10, 280, 21)
GUICtrlSendMsg(-1, $EM_SETCUEBANNER, 0, "Registry Suchwort-Eingabe") ; <- besser die Konstante benutzen
GUICtrlCreateLabel("Durchsuchen von:", 10, 50, 100, 15)
GUICtrlSetFont(-1, 9, 500, "Arial")
$idHKLM = GUICtrlCreateRadio('HKLM', 120, 50, 60, 15, $BS_DEFPUSHBUTTON)
GUICtrlSetTip(-1, "Computer\HKEY_LOCAL_MACHINE ", "HKLM = ", 1, 1)
GUICtrlSetFont(-1, 9, 500, "Arial")
GUICtrlSetState(-1, $gui_CHECKED)
$idHKCU = GUICtrlCreateRadio('HKCU', 180, 50, 60, 15, $BS_DEFPUSHBUTTON)
GUICtrlSetTip(-1, "Computer\HKEY_CURRENT_USER ", "HKCU = ", 1, 1)
GUICtrlSetFont(-1, 9, 500, "Arial")
$sstart = GUICtrlCreateButton("Suche starten!", 8, 85, 280, 25)
GUICtrlSetState($sstart, BitOR($gui_FOCUS, $gui_DEFBUTTON)) ; <- besser die Konstanten benutzen
GUICtrlSetOnEvent($sstart, _RegSearch_Start)
GUICtrlSetOnEvent($idHKLM, _id_Checkbox_HKLM)
GUICtrlSetOnEvent($idHKCU, _id_Checkbox_HKCU)
GUISetState(@SW_SHOW)
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Global $hStatus = _GUICtrlStatusBar_Create($hGUI, -1, "", $SBARS_TOOLTIPS)
_GUICtrlStatusBar_SetMinHeight($hStatus, 20)
Global $iPart[3]= [1, 300, -1]
_GUICtrlStatusBar_SetParts($hStatus, $iPart)
_GUICtrlStatusBar_SetText($hStatus, "   Registrypfad bitte auswählen", 1)
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
While Sleep(100)
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $gui_EVENT_CLOSE
            DllClose($hDLL)
            Exit
    EndSwitch
WEnd
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Func _id_Checkbox_HKLM()
    If $idHKLM = True Then
        $idHKCU = False
        _GUICtrlStatusBar_SetText($hStatus, "   HKLM ausgewählt", 1)
    EndIf
EndFunc
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Func _id_Checkbox_HKCU()
    If $idHKCU = True Then
        $idHKLM = False
        _GUICtrlStatusBar_SetText($hStatus, "   HKCU ausgewählt", 1)
    EndIf
EndFunc   ;==>_id_Checkbox_HKCU
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Func _RegSearch_Start()
    Local $sString = GUICtrlRead($sInput1)
    Local $sfile_txt_hklm = @ScriptDir & '\hklm\' & '\txt\' & $sString & '.txt'
    Local $sfile_reg_hklm = @ScriptDir & '\hklm\' & '\reg\' & $sString & '.reg'
    Local $sfile_txt_hkcu = @ScriptDir & '\hkcu\' & '\txt\' & $sString & '.txt'
    Local $sfile_reg_hkcu = @ScriptDir & '\hkcu\' & '\reg\' & $sString & '.reg'
    If $sString = '' Then
        MsgBox(64, "Hinweis", "Bitte Suchwort eingeben")
        Return 0
    EndIf
    GUISetState(@SW_DISABLE, $hgui)
;~     ToolTip('bitte warten...', @DesktopWidth / 1.8, @DesktopHeight / 2, 'Suche nach ' & $sString & ' ...', 1, 5)
    _GUICtrlStatusBar_SetText($hStatus, ' Suche nach -' & $sString & '- bitte warten!', 1)
    If GuiCtrlRead($idHKLM) = $gui_CHECKED Then
        _RegSearch($sFound, 'HKEY_LOCAL_MACHINE', $sString)
        Local $hFile_txt_hklm = FileOpen($sfile_txt_hklm, BitOR($FO_CREATEPATH, $FO_OVERWRITE)) ; <- FileOpen liefert ein Handle zurueck
        If $hFile_txt_hklm <> -1 Then ; <- nur ausfuehren, wenn FileOpen erfolgreich war
            FileWrite($hFile_txt_hklm, $sFound) ; <- FileWrite mit dem Handle (nicht mit dem Dateinamen!) ausfuehren
            FileClose($hFile_txt_hklm) ; <- das Handle wieder schliessen
        EndIf
        Local $hFile_reg_hklm = FileOpen($sfile_reg_hklm, BitOR($FO_CREATEPATH, $FO_OVERWRITE)) ; <- FileOpen liefert ein Handle zurueck
        If $hFile_reg_hklm <> -1 Then ; <- nur ausfuehren, wenn FileOpen erfolgreich war
            FileWriteLine($hFile_reg_hklm, 'Windows Registry Editor Version 5.00' & @CRLF & @CRLF)
            FileWrite($hFile_reg_hklm, $sFound) ; <- FileWrite mit dem Handle (nicht mit dem Dateinamen!) ausfuehren
            FileClose($hFile_reg_hklm) ; <- das Handle wieder schliessen
        EndIf
    ElseIf GuiCtrlRead($idHKCU) = $gui_CHECKED Then
        _RegSearch($sFound, 'HKEY_CURRENT_USER', $sString)
        Local $hFile_txt_hkcu = FileOpen($sfile_txt_hkcu, BitOR($FO_CREATEPATH, $FO_OVERWRITE)) ; <- FileOpen liefert ein Handle zurueck
        If $hFile_txt_hkcu <> -1 Then ; <- nur ausfuehren, wenn FileOpen erfolgreich war
            FileWrite($hFile_txt_hkcu, $sFound) ; <- FileWrite mit dem Handle (nicht mit dem Dateinamen!) ausfuehren
            FileClose($hFile_txt_hkcu) ; <- das Handle wieder schliessen
        EndIf
        Local $hFile_reg_hkcu = FileOpen($sfile_reg_hkcu, BitOR($FO_CREATEPATH, $FO_OVERWRITE)) ; <- FileOpen liefert ein Handle zurueck
        If $hFile_reg_hkcu <> -1 Then ; <- nur ausfuehren, wenn FileOpen erfolgreich war
            FileWriteLine($hFile_reg_hkcu, 'Windows Registry Editor Version 5.00' & @CRLF & @CRLF)
            FileWrite($hFile_reg_hkcu, $sFound) ; <- FileWrite mit dem Handle (nicht mit dem Dateinamen!) ausfuehren
            FileClose($hFile_reg_hkcu) ; <- das Handle wieder schliessen
        EndIf
    EndIf
;~     ToolTip('')
    Local $iMsgBoxAnswer = MsgBox(68,"Hinweis", "Auftrag erledigt. Die Auswertung wird nachfolgend angezeigt." & @CRLF & "Soll -RegSearch- für weitere Auswertungen geöffnet bleiben?")
        Select
            Case $iMsgBoxAnswer = 6 ;Ja
                If GuiCtrlRead($idHKLM) = $gui_CHECKED Then
                    _GUICtrlStatusBar_SetText($hStatus, "   HKLM ausgewählt", 1)
                    ShellExecute($sfile_txt_hklm, @SW_MAXIMIZE)
                EndIf
                If GuiCtrlRead($idHKCU) = $gui_CHECKED Then
                    _GUICtrlStatusBar_SetText($hStatus, "   HKLM ausgewählt", 1)
                    ShellExecute($sfile_txt_hkcu, @SW_MAXIMIZE)
                EndIf
                GUISetState(@SW_ENABLE, $hgui)
                GUISetState(@SW_RESTORE, $hgui)
                If @error Then Return SetError(1, 0, 0)
;~                 Exit Run ($outfile)
            Case $iMsgBoxAnswer = 7 ;Nein
                If GuiCtrlRead($idHKLM) = $gui_CHECKED Then    ShellExecute($sfile_txt_hklm, @SW_MAXIMIZE)
                If GuiCtrlRead($idHKCU) = $gui_CHECKED Then    ShellExecute($sfile_txt_hkcu, @SW_MAXIMIZE)
                _GUICtrlStatusBar_Destroy ($hStatus)
                __GUI_EVENT_CLOSE_()
        EndSelect
EndFunc   ;==>_RegSearch_Start
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Func _RegSearch(ByRef $sFound, $sRegPath, $sSearch) ; Funktion von Gorathan (https://forum.technik-hobby.de/showthrea...d=24#pid24)
    Local $iValType, $sKeyName, $sValName, $vRegVal, $iEnumKey = 0, $iEnumVal = 0, $aTmp, $sTmp, $iRow
    While True
        If _IsPressed("1B", $hDLL) Then ; die Abbruchbedingung muss in die Schleife, die abgebrochen werden soll
            MsgBox(64, "Achtung", "Abbruch durch Benutzer", 10)
            Exit
        EndIf
        $iEnumKey += 1
        $sKeyName = RegEnumKey($sRegPath, $iEnumKey)
        If @error Then ExitLoop ; wenn kein weiterer RegKey gefunden wurde, dann Schleife verlassen
        If StringInStr($sRegPath & '\' & $sKeyName, $sSearch, 2) Then ; wenn Key gefunden, dann RegVals einfuegen -ANFANG-
            $sFound &= '[' & $sRegPath & '\' & $sKeyName & ']' & @CRLF ; den RegKey merken
            $iEnumVal = 0
            While True ; alle RegVals durchgehen
;~                 _GUICtrlStatusBar_SetText($hStatus, $sFound, 1)
                $iEnumVal += 1
                $sValName = RegEnumVal($sRegPath & '\' & $sKeyName, $iEnumVal)
                If @error Then ExitLoop ; wenn kein weiterer RegVal gefunden wurde, dann Schleife verlassen
                $iValType = @extended ; den Registry-Typ merken
                $vRegVal = RegRead($sRegPath & '\' & $sKeyName, $sValName) ; den Inhalt des RegVals auslesen
                Switch $iValType ; versuche das Export-Registry-Format zu erstellen (ohne Gewaehr!)
                    Case $REG_NONE
                        $vRegVal = 'hex(0):' & $vRegVal
                    Case $REG_SZ
                        $vRegVal = StringReplace($vRegVal, '\', '\\') ; Backslashes maskieren
                        $vRegVal = StringReplace($vRegVal, '"', '\"') ; Anfuehrungszeichen maskieren
                        $vRegVal = '"' & $vRegVal & '"' ; String in Anfuehrungszeichen setzen
                    Case $REG_EXPAND_SZ
                        $vRegVal = StringToBinary($vRegVal, 2)
                        $aTmp = StringRegExp(Hex($vRegVal, 16), '[[:xdigit:]]{2}', 3)
                        $vRegVal = 'hex(2):'
                        $iRow = 0
                        For $i = 0 To UBound($aTmp) - 1
                            $vRegVal &= $aTmp[$i] & ','
                            If Int((StringLen($sValName) + StringLen($vRegVal) + 6) / 80) > $iRow And $i < UBound($aTmp) - 2 Then
                                $vRegVal &= '\' & @CRLF & '  '
                                $iRow += 1
                            EndIf
                        Next
                        $vRegVal &= '00,00'
                    Case $REG_BINARY
                        $aTmp = StringRegExp(Hex($vRegVal, 8), '[[:xdigit:]]{2}', 3)
                        $vRegVal = 'hex:'
                        $iRow = 0
                        For $i = 0 To UBound($aTmp) - 1
                            $vRegVal &= $aTmp[$i] & ','
                            If Int((StringLen($sValName) + StringLen($vRegVal) + 6) / 80) > $iRow And $i < UBound($aTmp) - 2 Then
                                $vRegVal &= '\' & @CRLF & '  '
                                $iRow += 1
                            EndIf
                        Next
                        $vRegVal = StringTrimRight($vRegVal, 1)
                    Case $REG_DWORD
                        $vRegVal = 'dword:' & Hex($vRegVal, 8)
                    Case $REG_DWORD_BIG_ENDIAN ; keine Ahnung!
                        $vRegVal = '$REG_DWORD_BIG_ENDIAN ' & $vRegVal
                    Case $REG_LINK ; keine Ahnung!
                        $vRegVal = '$REG_LINK ' & $vRegVal
                    Case $REG_MULTI_SZ
                        $vRegVal = StringToBinary($vRegVal, 2)
                        $aTmp = StringRegExp(Hex($vRegVal, 16), '[[:xdigit:]]{2}', 3)
                        $vRegVal = 'hex(7):'
                        $iRow = 0
                        For $i = 0 To UBound($aTmp) - 1
                            $vRegVal &= $aTmp[$i] & ','
                            If Int((StringLen($sValName) + StringLen($vRegVal) + 6) / 80) > $iRow And $i < UBound($aTmp) - 2 Then
                                $vRegVal &= '\' & @CRLF & '  '
                                $iRow += 1
                            EndIf
                        Next
                        $vRegVal &= '00,00'
                    Case $REG_RESOURCE_LIST ; keine Ahnung!
                        $vRegVal = '$REG_RESOURCE_LIST ' & $vRegVal
                    Case $REG_FULL_RESOURCE_DESCRIPTOR ; keine Ahnung!
                        $vRegVal = '$REG_FULL_RESOURCE_DESCRIPTOR ' & $vRegVal
                    Case $REG_RESOURCE_REQUIREMENTS_LIST ; keine Ahnung!
                        $vRegVal = '$REG_RESOURCE_REQUIREMENTS_LIST ' & $vRegVal
                    Case $REG_QWORD
                        $aTmp = StringRegExp(Hex($vRegVal, 16), '[[:xdigit:]]{2}', 3)
                        $sTmp = ''
                        For $i = UBound($aTmp) - 1 To 0 Step -1
                            $sTmp &= $aTmp[$i] & ','
                        Next
                        $vRegVal = 'hex(b):' & StringTrimRight($sTmp, 1)
                EndSwitch
                $sValName = ($sValName = '' ? '@=' : '"' & $sValName & '"=') ; Wenn RegVal = Leerstring, dann "@", ansonsten der ValName
                $sFound &= $sValName & $vRegVal & @CRLF
            WEnd
            $sFound &= @CRLF
        EndIf ; RegVals einfuegen -ENDE-
        _RegSearch($sFound, $sRegPath & '\' & $sKeyName, $sSearch) ; rekursiver Aufruf des gefundenen RegKeys
        If @error Then Return SetError(1, 0, 0)
    WEnd
    Return
EndFunc   ;==>_RegSearch
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Func __GUI_EVENT_CLOSE_()
        _GUICtrlStatusBar_Destroy ($hStatus)
    Exit
EndFunc   ;==>__GUI_EVENT_CLOSE_
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Außerdem würde ich gerne in der Statusbar den Status der Suche ablichten, aber das bekomme ich mit "_GUICtrlStatusBar_SetText($hStatus, $sFound, 1)" irgendwie nicht hin.

