RE: Suche nach Registryeinträgen einer bestimmten Software in HKLM - Bazii - 29.07.2017
(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/showthread.php?tid=23&pid=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.
RE: Suche nach Registryeinträgen einer bestimmten Software in HKLM - Gorathan - 30.07.2017
Zitat:Würdest Du bitte über den Code schauen was ich falsch mache?
Du darfst auf jeden Fall nicht den OnEventModus benutzen und dann in der Endlos-Schleife eine GuiGetMsg-Abfrage einbauen.
Beide Modi gleichzeitig funktioniert nicht!
Den Rest muss ich erst noch weiter bearbeiten. Da gibt es noch einiges, was man besser (nicht böse gemeint) machen kann.
RE: Suche nach Registryeinträgen einer bestimmten Software in HKLM - Gorathan - 30.07.2017
Ich habe Dein Script jetzt mal überarbeitet.
Auswahl ob Suchbegriff "Normal" (mit Platzhalter) oder als "RegExp" (muss ein gültiges RegExp-Pattern sein).
Außerdem eine Listview mit den Fundstellen und in der Statuszeile die momentane Position der Suche, sowie die Anzahl der Fundstellen.
Und ich habe das Script mal etwas verkleinert. Man muss nicht alles doppelt schreiben. Es reicht oft, an den richtigen Stellen eine Auswahl zu treffen.
Show ContentRegSearch:
#include <AutoItConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <FileConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiStatusBar.au3>
#include <ListViewConstants.au3>
#include <Math.au3>
#include <Misc.au3>
#include <MsgBoxConstants.au3>
#include <StatusBarConstants.au3>
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
#NoTrayIcon
;~ #RequireAdmin
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Opt('MustDeclareVars', 1) ; Variablen müssen deklariert werden.
Opt('GUIOnEventMode', 1) ; Eventmode aktivieren.
Opt('GUICloseOnESC', 1) ; Wenn ESC gedrückt wird, Gui beenden.
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Global $idInput, $idNormal, $idRegExp, $idListview, $idStart, $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 = '', $iFoundCount = 0
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, 640, 150, -1, -1)
GUISetIcon("..\..\ICON\logo_FTP.ico", -1)
GUICtrlSetFont(-1, 9, 500, "Arial")
GUISetBkColor(0xD7E4F2)
GUISetOnEvent($GUI_EVENT_CLOSE, "__GUI_EVENT_CLOSE_")
$idInput = GUICtrlCreateInput("", 10, 10, 240, 21)
GUICtrlSendMsg(-1, $EM_SETCUEBANNER, 0, "Registry Suchwort-Eingabe") ; <- besser die Konstante benutzen
GUICtrlCreateLabel("Suchbegriff ist", 10, 45, 100, 15)
GUICtrlSetFont(-1, 9, 500, "Arial")
GUIStartGroup()
$idNormal = GUICtrlCreateRadio("Normal", 120, 45, 60, 15)
GUICtrlSetFont(-1, 9, 500, "Arial")
GUICtrlSetTip(-1, "Platzhalter erlaubt:" & @CRLF & "? = ein beliebiges Zeichen" & @CRLF & "* = (k)ein oder mehrere beliebige Zeichen", "Normal", 1, 1)
GUICtrlSetState(-1, $GUI_CHECKED)
$idRegExp = GUICtrlCreateRadio("RegExp", 190, 45, 60, 15)
GUICtrlSetFont(-1, 9, 500, "Arial")
GUICtrlSetTip(-1, "Es muss ein gültiges RegExp-Pattern in das Suchfeld eingegeben werden!", "RegExp", 1, 1)
$idListview = GUICtrlCreateListView('Gefundene Registry-Schlüssel', 260, 10, 370, 110)
_GUICtrlListView_SetColumnWidth($idListview, 0, 350)
GUICtrlCreateLabel("Durchsuchen von:", 10, 70, 100, 15)
GUICtrlSetFont(-1, 9, 500, "Arial")
GUIStartGroup()
$idHKLM = GUICtrlCreateRadio('HKLM', 120, 70, 60, 15)
GUICtrlSetOnEvent(-1, '_id_Checkbox_HKLM')
GUICtrlSetTip(-1, "Computer\HKEY_LOCAL_MACHINE ", "HKLM = ", 1, 1)
GUICtrlSetFont(-1, 9, 500, "Arial")
GUICtrlSetState(-1, $GUI_CHECKED)
$idHKCU = GUICtrlCreateRadio('HKCU', 190, 70, 60, 15)
GUICtrlSetOnEvent(-1, '_id_Checkbox_HKCU')
GUICtrlSetTip(-1, "Computer\HKEY_CURRENT_USER ", "HKCU = ", 1, 1)
GUICtrlSetFont(-1, 9, 500, "Arial")
$idStart = GUICtrlCreateButton("Suche starten!", 10, 95, 240, 25)
GUICtrlSetState(-1, BitOR($GUI_FOCUS, $GUI_DEFBUTTON)) ; <- besser die Konstanten benutzen
GUICtrlSetOnEvent(-1, '_RegSearch_Start')
GUISetState(@SW_SHOW)
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Global $hStatus = _GUICtrlStatusBar_Create($hgui, -1, "", $SBARS_TOOLTIPS)
_GUICtrlStatusBar_SetMinHeight($hStatus, 20)
Global $iPart[3] = [1, 560, -1]
_GUICtrlStatusBar_SetParts($hStatus, $iPart)
_GUICtrlStatusBar_SetText($hStatus, " Registrypfad bitte auswählen", 1)
_GUICtrlStatusBar_SetText($hStatus, $iFoundCount, 2)
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
While Sleep(100)
WEnd
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Func _id_Checkbox_HKLM()
_GUICtrlStatusBar_SetText($hStatus, " HKLM ausgewählt", 1)
EndFunc ;==>_id_Checkbox_HKLM
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Func _id_Checkbox_HKCU()
_GUICtrlStatusBar_SetText($hStatus, " HKCU ausgewählt", 1)
EndFunc ;==>_id_Checkbox_HKCU
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Func _RegSearch_Start()
Local $sString = GUICtrlRead($idInput)
Local $bHKLM = BitAND(GUICtrlRead($idHKLM), $GUI_CHECKED) == $GUI_CHECKED ; True = HKLM, False = HKCU
Local $bRegExp = BitAND(GUICtrlRead($idRegExp), $GUI_CHECKED) == $GUI_CHECKED ; True = RegExp, False = Normal
Local $sFilename = StringRegExpReplace($sString, '\W', '') ; evtl. Platzhalter aus dem String entfernen
Local $sTxtFilename = StringFormat('%s\\%s\\txt\\%s.txt', @ScriptDir, ($bHKLM ? 'hklm' : 'hkcu'), $sFilename)
Local $sRegFilename = StringFormat('%s\\%s\\reg\\%s.reg', @ScriptDir, ($bHKLM ? 'hklm' : 'hkcu'), $sFilename)
If $sString = '' Then
MsgBox(64, "Hinweis", "Bitte Suchwort eingeben")
Return
EndIf
Opt('GUICloseOnESC', 0)
_GUICtrlListView_DeleteAllItems($idListview)
$iFoundCount = 0
_GUICtrlStatusBar_SetText($hStatus, $iFoundCount, 2)
GUICtrlSetState($idNormal, $GUI_DISABLE) ; Normal-Radio deaktivieren
GUICtrlSetState($idRegExp, $GUI_DISABLE) ; RegExp-Radio deaktivieren
GUICtrlSetState($idHKLM, $GUI_DISABLE) ; HKLM-Radio deaktivieren
GUICtrlSetState($idHKCU, $GUI_DISABLE) ; HKCU-Radio deaktivieren
GUICtrlSetState($idInput, $GUI_DISABLE) ; Inputfeld deaktivieren
GUICtrlSetState($idStart, $GUI_DISABLE) ; Startbutton deaktivieren
_GUICtrlStatusBar_SetText($hStatus, ' Suche nach -' & $sString & '- bitte warten!', 1)
_RegSearch($sFound, ($bHKLM ? 'HKLM' : 'HKCU'), $sString, $bRegExp)
If @error Then
_GUICtrlStatusBar_SetText($hStatus, ' Die Suche wurde abgebrochen!', 1) ; Statusmeldung ausgeben
GUICtrlSetState($idNormal, $GUI_ENABLE) ; Normal-Radio aktivieren
GUICtrlSetState($idRegExp, $GUI_ENABLE) ; RegExp-Radio aktivieren
GUICtrlSetState($idHKLM, $GUI_ENABLE) ; HKLM-Radio aktivieren
GUICtrlSetState($idHKCU, $GUI_ENABLE) ; HKCU-Radio aktivieren
GUICtrlSetState($idInput, $GUI_ENABLE) ; Inputfeld aktivieren
GUICtrlSetState($idStart, $GUI_ENABLE) ; Startbutton aktivieren
Opt('GUICloseOnESC', 1)
Return ; und die Funktion (ohne zu speichern) verlassen
EndIf
If $iFoundCount > 0 Then _GUICtrlListView_SetColumnWidth($idListview, 0, $LVSCW_AUTOSIZE)
Local $hFile_txt = FileOpen($sTxtFilename, BitOR($FO_CREATEPATH, $FO_OVERWRITE)) ; <- FileOpen liefert ein Handle zurueck
If $hFile_txt <> -1 Then ; <- nur ausfuehren, wenn FileOpen erfolgreich war
FileWrite($hFile_txt, $sFound) ; <- FileWrite mit dem Handle (nicht mit dem Dateinamen!) ausfuehren
FileClose($hFile_txt) ; <- das Handle wieder schliessen
EndIf
Local $hFile_reg = FileOpen($sRegFilename, BitOR($FO_CREATEPATH, $FO_OVERWRITE)) ; <- FileOpen liefert ein Handle zurueck
If $hFile_reg <> -1 Then ; <- nur ausfuehren, wenn FileOpen erfolgreich war
FileWriteLine($hFile_reg, 'Windows Registry Editor Version 5.00' & @CRLF & @CRLF)
FileWrite($hFile_reg, $sFound) ; <- FileWrite mit dem Handle (nicht mit dem Dateinamen!) ausfuehren
FileClose($hFile_reg) ; <- das Handle wieder schliessen
EndIf
Local $iMsgBoxAnswer = MsgBox(68, "Hinweis", "Auftrag erledigt. Die Auswertung wird nachfolgend angezeigt." & @CRLF & "Soll -RegSearch- für weitere Auswertungen geöffnet bleiben?", 0, $hgui)
Switch $iMsgBoxAnswer ; Switch ist schneller und einfacher, wenn Du sowieso nur auf eine Variable testest
Case $IDYES ;Ja (wenn Du statt der Zahl 6 die Konstante verwendest, brauchst Du das nicht mit "Ja" kommentieren)
_GUICtrlStatusBar_SetText($hStatus, ' ' & ($bHKLM ? 'HKLM' : 'HKCU') & " ausgewählt", 1)
ShellExecute($sTxtFilename, @SW_MAXIMIZE)
GUICtrlSetState($idNormal, $GUI_ENABLE) ; Normal-Radio aktivieren
GUICtrlSetState($idRegExp, $GUI_ENABLE) ; RegExp-Radio aktivieren
GUICtrlSetState($idHKLM, $GUI_ENABLE) ; HKLM-Radio aktivieren
GUICtrlSetState($idHKCU, $GUI_ENABLE) ; HKCU-Radio aktivieren
GUICtrlSetState($idInput, $GUI_ENABLE) ; Inputfeld aktivieren
GUICtrlSetState($idStart, $GUI_ENABLE) ; Startbutton aktivieren
Opt('GUICloseOnESC', 1)
Return
Case $IDNO ;Nein (wenn Du statt der Zahl 7 die Konstante verwendest, brauchst Du das nicht mit "Nein" kommentieren)
ShellExecute($sTxtFilename, @SW_MAXIMIZE)
__GUI_EVENT_CLOSE_()
EndSwitch
EndFunc ;==>_RegSearch_Start
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Func _RegSearch(ByRef $sFound, $sRegPath, $sSearch, $bStringRegExp = False, $bRek = False) ; Funktion von Gorathan (https://forum.technik-hobby.de/showthrea...d=24#pid24)
Local $iValType, $sKeyName, $sValName, $vRegVal, $iEnumKey = 0, $iEnumVal = 0, $aTmp, $sTmp, $iRow, $sValidate
Local $iTimer = TimerInit(), $iTimerDiff = TimerDiff($iTimer)
If Not $bRek And Not $bStringRegExp Then ; wenn der Suchbegriff !kein! RegExp-Pattern enthält, dann die Platzhalter in RegExp wandeln
$sSearch = StringReplace($sSearch, '?', '.') ; "?" steht fuer ein beliebiges Zeichen, in RegExp ist das ein "."
$sSearch = StringReplace($sSearch, '*', '.*?') ; "*" steht fuer (k)ein oder mehrere beliebige Zeichen, in RegExp ist das ein ".*?"
$sSearch = '(?i)' & $sSearch ; Gross-/Kleinschreibung !nicht! beachten = "(?i)" an den Anfang des Suchbegriffs setzen
EndIf
While True
If _IsPressed("1B", $hDLL) Then ; die Abbruchbedingung muss in die Schleife, die abgebrochen werden soll
If MsgBox($MB_ICONQUESTION + $MB_YESNO, "Achtung", "Soll die Suche abgebrochen werden?", 0, $hgui) = $IDYES Then
Return SetError(1) ; Funktion mit Fehler 1 verlassen, damit alle rekursiven Aufrufe beendet werden
EndIf
EndIf
$iEnumKey += 1
$sKeyName = RegEnumKey($sRegPath, $iEnumKey)
If @error Then ExitLoop ; wenn kein weiterer RegKey gefunden wurde, dann Schleife verlassen
If TimerDiff($iTimer) - $iTimerDiff > 100 Then ; die Statuszeile nur alle 100ms aktualisieren
$iTimerDiff = TimerDiff($iTimer)
_GUICtrlStatusBar_SetText($hStatus, $sRegPath & '\' & $sKeyName, 1)
EndIf
$sValidate = StringReplace($sRegPath & '\' & $sKeyName, '\', '\\') ; Backslashes maskieren
If StringRegExp($sValidate, $sSearch) Then ; wenn Key gefunden, dann RegVals einfuegen -ANFANG-
$sFound &= '[' & $sRegPath & '\' & $sKeyName & ']' & @CRLF ; den RegKey merken
GUICtrlCreateListViewItem($sRegPath & '\' & $sKeyName, $idListview)
$iFoundCount += 1
_GUICtrlStatusBar_SetText($hStatus, $iFoundCount, 2)
$iEnumVal = 0
While True ; alle RegVals durchgehen
$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, $bStringRegExp, True) ; rekursiver Aufruf des gefundenen RegKeys
If @error Then Return SetError(1) ; Funktion mit Fehler 1 verlassen, damit alle rekursiven Aufrufe beendet werden
WEnd
Return
EndFunc ;==>_RegSearch
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Func __GUI_EVENT_CLOSE_()
_GUICtrlStatusBar_Destroy($hStatus)
DllClose($hDLL)
Exit
EndFunc ;==>__GUI_EVENT_CLOSE_
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
RE: Suche nach Registryeinträgen einer bestimmten Software in HKLM - Bazii - 30.07.2017
Hallo,
vielen Dank für die Überarbeitung.
Du schreibst:
Zitat:Da gibt es noch einiges, was man besser (nicht böse gemeint) machen kann.
Zitat:Man muss nicht alles doppelt schreiben. Es reicht oft, an den richtigen Stellen eine Auswahl zu treffen.
Das Gegenteil ist der Fall. Ich bin Dir sehr dankbar was Du an Verbesserungen bislang vorgeschlagen oder eingearbeitet hast. Ich ein Programm zur Erstellung eines FTP Server-Index gescrieben und auf meiner Homepage veröffentlicht. Das habe ich ähnlich wie RegSearch 1.0.0.2 aufgebaut. Es funktioniert bestens aber Dich würde wahrscheinlich bei der Codekontrolle der Schlag treffen bzw. Du würdest es auf die Hälfte des Codes kürzen.
Zum Skript:
Es schaut sehr gut aus, jetzt mit Listview und der Statusbar im Fortschritt der Suche. Vielen Dank für die Einarbeitungen.
Was allerdings negativ geblieben ist: Wenn man die Gui nicht neustartet aber nach einer Auswertung von HKLM auf eine HKCU Auswertung wechselt, werden in der .txt Datei die Einträge von HKLM in die Auswertung von HKCU geschrieben / übernommen. Wie kann man das noch bereinigen? Ich finde den Fehler einfach nicht. Daher habe ich das Programm immer nach einer Auswertung neugestartet.
RE: Suche nach Registryeinträgen einer bestimmten Software in HKLM - Gorathan - 31.07.2017
Zitat:Wie kann man das noch bereinigen? Ich finde den Fehler einfach nicht. Daher habe ich das Programm immer nach einer Auswertung neugestartet.
Ah, übersehen! $sFound ist eine globale Variable und muss vor einem erneuten Aufruf geleert werden.
Füge mal in Zeile 122 ein: $sFound = ''
RE: Suche nach Registryeinträgen einer bestimmten Software in HKLM - Bazii - 31.07.2017
(31.07.2017, 05:17)Gorathan schrieb: $sFound ist eine globale Variable und muss vor einem erneuten Aufruf geleert werden.
Genial !
Das muss man erst mal wissen. Da wäre ich nie drauf gekommen. Das zu wissen ist auch enorm nützlich für meine anderen Skripte.
Vielen Dank nochmal für alles. Ich denke, jetzt kann ich das Proggi demnächst unter "Scripte" veröffentlichen oder was meinst Du?
|