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.