Suche nach Registryeinträgen einer bestimmten Software in HKLM - Bazii - 26.07.2017
Hallo,
ich habe ein keines Tool geschrieben, mit dem ich rekursiv alle Einträge einer bestimmten Software aus der Registry auslesen kann. Wie kann ich es nun schaffen, wie es der Export aus der Registry es kann, die gefundenen Einträge mit allen Schlüsseln wie es die Registry auch tut, zu exportieren? Der Export soll mit allen gefundenen Einträgen in eine einzige .txt und .reg Datei geschrieben werden. Allerdings eben so wie es die Registry exportiert und nicht wie in meinem Beispielcode zu sehen ist.
Anbei mein Code. Es wäre klasse wenn mir weitergeholfen werden könnte.
Show ContentRegSearch:
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
#NoTrayIcon
#RequireAdmin
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <Misc.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
Global $sTitle = 'RegSearch'
Global $sVersion = '1.0.0.0'
Global $sAuthor = 'Bazii'
Global $sDate = '26.07.2017'
Global $sFound = ''
Global $hDLL = DllOpen("user32.dll")
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
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?
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
GUICreate($sTitle & ' ' & $sVersion, 300, 90, -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, 8, 280, 21)
GUICtrlSendMsg(-1, 0x1501, 0, "HKLM Suchwort-Eingabe")
$sstart = GUICtrlCreateButton("Start!", 8, 56, 280, 25)
GUICtrlSetState($sstart, 768) ; Focus + Defbutton
GUICtrlSetOnEvent($sstart, _RegSearch_Start)
GUISetState(@SW_SHOW)
While Sleep(100)
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func _RegSearch_Start()
Local $sString = GUICtrlRead($sInput1)
Local $sfile = @ScriptDir & '\txt\' & $sString & '.txt'
Local $sfile2 = @ScriptDir & '\reg\' & $sString & '.reg'
If $sString = '' Then
MsgBox(16,"Fehler","Bitte Suchwort eingeben")
GUICtrlSetData($sString, "HKLM Suchwort-Eingabe")
Return 0
EndIf
ToolTip('bitte warten...', @DesktopWidth / 1.8, @DesktopHeight / 2, 'Suche nach ' & $sString & ' ...', 1, 5)
_RegSearch($sFound, 'HKEY_LOCAL_MACHINE', $sString)
If _IsPressed("1B", $hDLL) Then
MsgBox(64, "Achtung", "Abbruch durch Benutzer", 10)
DllClose($hDLL)
Exit
EndIf
FileOpen($sfile, 2)
FileWrite($sfile, $sFound)
FileClose ($sfile)
FileOpen($sfile2, 2)
FileWrite($sfile2, $sFound)
FileClose ($sfile2)
;~ MsgBox(64, 'Hinweis', 'Registry erfolgreich ausgelesen', 10, $sfile)
ShellExecute($sfile, @SW_MAXIMIZE)
Exit
EndFunc ;==>_RegSearch1
Func _RegSearch(ByRef $sFound, $sRegPath, $sSearch) ; Funktion von Oscar
Local $sKey, $sVal, $sVar, $i = 0, $j = 0
While True
$i += 1
$sKey = RegEnumKey($sRegPath, $i)
If @error Then ExitLoop
_RegSearch($sFound, $sRegPath & '\' & $sKey, $sSearch)
$j = 0
While True
$j += 1
$sVal = RegEnumVal($sRegPath & '\' & $sKey, $j)
If @error Then ExitLoop
$sVar = RegRead($sRegPath & '\' & $sKey, $sVal)
If StringInStr($sVar, $sSearch, 2) Then $sFound &= $sRegPath & '\' & $sKey & '\' & $sVal & @CRLF
WEnd
WEnd
Return
EndFunc ;==>_RegSearch
Func __GUI_EVENT_CLOSE_()
Exit
EndFunc ;==>__GUI_EVENT_CLOSE_
Ferner möchte ich jetzt mal der erste sein, der hier eine Frage stellt . Die Forensoftware und das Erscheinungsbild dieses Forums finde ich klasse.
RE: Suche nach Registryeinträgen einer bestimmten Software in HKLM - Gorathan - 27.07.2017
Das war jetzt eine Herausforderung, weil ich vom Export-/Importformat von RegEdit keine Ahnung habe.
Zu einigen Registry-Typen konnte ich auch nicht das passende Format herausfinden (mit Kommentar im Script).
Ansonsten habe ich Dir mal das Script etwas angepasst (kommentiert):
Show ContentScript:
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
#NoTrayIcon
#RequireAdmin
#include <AutoItConstants.au3>
#include <EditConstants.au3>
#include <FileConstants.au3>
#include <GUIConstantsEx.au3>
#include <Math.au3>
#include <Misc.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
Global $sTitle = 'RegSearch'
Global $sVersion = '1.0.0.0'
Global $sAuthor = 'Bazii'
Global $sDate = '26.07.2017'
Global $sFound = ''
Global $hDLL = DllOpen("user32.dll")
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
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?
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
GUICreate($sTitle & ' ' & $sVersion, 300, 90, -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, 8, 280, 21)
GUICtrlSendMsg(-1, $EM_SETCUEBANNER, 0, "HKLM Suchwort-Eingabe") ; <- besser die Konstante benutzen
$sstart = GUICtrlCreateButton("Start!", 8, 56, 280, 25)
GUICtrlSetState($sstart, BitOR($GUI_FOCUS, $GUI_DEFBUTTON)) ; <- besser die Konstanten benutzen
GUICtrlSetOnEvent($sstart, _RegSearch_Start)
GUISetState(@SW_SHOW)
While Sleep(100)
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
DllClose($hDLL)
Exit
EndSwitch
WEnd
Func _RegSearch_Start()
Local $sString = GUICtrlRead($sInput1)
Local $sfile = @ScriptDir & '\txt\' & $sString & '.txt'
Local $sfile2 = @ScriptDir & '\reg\' & $sString & '.reg'
If $sString = '' Then
MsgBox(16, "Fehler", "Bitte Suchwort eingeben")
GUICtrlSetState($sstart, $GUI_FOCUS) ; $EM_SETCUEBANNER sorgt automatisch dafür,
; dass wieder "HKLM Suchwort-Eingabe" ins Inputfeld eingetragen wird, sobald der
; Focus nicht auf dem Inputfeld liegt. Es reicht also, den Focus auf den Button zu legen.
Return 0
EndIf
ToolTip('bitte warten...', @DesktopWidth / 1.8, @DesktopHeight / 2, 'Suche nach ' & $sString & ' ...', 1, 5)
_RegSearch($sFound, 'HKEY_LOCAL_MACHINE', $sString)
; Wenn Du eine Datei oeffnen willst, die in einem Unterverzeichnis liegt,
; dann solltest Du zusätzlich $FO_CREATEPATH angeben, damit das Verzeichnis
; erstellt wird, wenn es nicht existiert.
Local $hFile = FileOpen($sfile, BitOR($FO_CREATEPATH, $FO_OVERWRITE)) ; <- FileOpen liefert ein Handle zurueck
If $hFile <> -1 Then ; <- nur ausfuehren, wenn FileOpen erfolgreich war
FileWrite($hFile, $sFound) ; <- FileWrite mit dem Handle (nicht mit dem Dateinamen!) ausfuehren
FileClose($hFile) ; <- das Handle wieder schliessen
EndIf
$hFile = FileOpen($sfile2, BitOR($FO_CREATEPATH, $FO_OVERWRITE)) ; <- FileOpen liefert ein Handle zurueck
If $hFile <> -1 Then ; <- nur ausfuehren, wenn FileOpen erfolgreich war
FileWriteLine($hFile, 'Windows Registry Editor Version 5.00' & @CRLF & @CRLF)
FileWrite($hFile, $sFound) ; <- FileWrite mit dem Handle (nicht mit dem Dateinamen!) ausfuehren
FileClose($hFile) ; <- das Handle wieder schliessen
EndIf
ToolTip('')
;~ MsgBox(64, 'Hinweis', 'Registry erfolgreich ausgelesen', 10, $sfile)
ShellExecute($sfile, @SW_MAXIMIZE)
EndFunc ;==>_RegSearch_Start
Func _RegSearch(ByRef $sFound, $sRegPath, $sSearch) ; Funktion von Oscar
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)
Return SetError(1, 0, 0)
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
$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_()
Exit
EndFunc ;==>__GUI_EVENT_CLOSE_
RE: Suche nach Registryeinträgen einer bestimmten Software in HKLM - Bazii - 27.07.2017
Hallo Gorathan,
vielen Dank für die Ergänzung und Verbesserung des Codes und die gleichsam wichtigen Verbesserungshinweise. Es funktioniert bestens mit Deinem Code. Herzlichen Dank.
Zitat:Zu einigen Registry-Typen konnte ich auch nicht das passende Format herausfinden (mit Kommentar im Script).
Das muss mal getestet werden. Ich hätte gar nicht gewusst wie man da weitermachen hätte können.
Vielen Dank nochmal!
Eine Frage noch:
Was meinst Du? Wäre es denn sinvoll, dass mit mit dem Skript zusätzlich zum auslesen der Einträge noch auf Benutzerwunsch die entsprechenden Einträge aus der Registry entfernen lassen kann oder ist das eher naiv gedacht? Der Startbutton ist ja eher groß. Da passen locken 2 hin . Somit könnte man sich auf das Suchwort hin noch die registry cleanen lassen.
RE: Suche nach Registryeinträgen einer bestimmten Software in HKLM - Gorathan - 27.07.2017
(27.07.2017, 17:43)Bazii schrieb: Eine Frage noch:
Was meinst Du? Wäre es denn sinvoll, dass mit mit dem Skript zusätzlich zum auslesen der Einträge noch auf Benutzerwunsch die entsprechenden Einträge aus der Registry entfernen lassen kann oder ist das eher naiv gedacht? Der Startbutton ist ja eher groß. Da passen locken 2 hin . Somit könnte man sich auf das Suchwort hin noch die registry cleanen lassen.
Das würde ich (erstmal) lassen.
Solange die erstellte Regdatei nicht 100% fehlerfrei ist, solltest Du das löschen lieber dem Anwender überlassen.
Es gibt schon genug "Reg-Cleaner"-Programme, die mehr schaden als nutzen, weil sie (versehentlich) Registry-Einträge löschen.
RE: Suche nach Registryeinträgen einer bestimmten Software in HKLM - Bazii - 27.07.2017
(27.07.2017, 18:47)Gorathan schrieb: Das würde ich (erstmal) lassen.
Solange die erstellte Regdatei nicht 100% fehlerfrei ist, solltest Du das löschen lieber dem Anwender überlassen.
Es gibt schon genug "Reg-Cleaner"-Programme, die mehr schaden als nutzen, weil sie (versehentlich) Registry-Einträge löschen.
Ja, das ist richtig. Danke für Deine Einschätzung. Von "Reg-Cleaner"-Programmen habe ich auch die Faxen dicke. Es gibt genug Benutzer die mich privat schon angesprochen haben, dass nach Ausführung diverser "Reg-Cleaner"-Programme das eine oder andere nicht mehr richtig funktioniert hat.
Ich danke Dir für die kompetente Hilfe und die Zeit, die Du für mich investiert hast.
Noch eine Frage zum Forum: Gibt es irgendwo die Möglichkeit für den Benutzer das Thema als gelöst zu markieren?
Noch eine Frage zum Skript: Soll ich das Skript unter dem Skriptbereich "Scripte" noch bereitsstellen bzw. das Skript im Autoitforum bekanntmachen? Was meinst Du, ob es noch weitere Benutzer gibt die meine bzw. Deine erweiterte Version brauchen könnten?
RE: Suche nach Registryeinträgen einer bestimmten Software in HKLM - Gorathan - 28.07.2017
(27.07.2017, 19:56)Bazii schrieb: Noch eine Frage zum Forum: Gibt es irgendwo die Möglichkeit für den Benutzer das Thema als gelöst zu markieren?
Noch eine Frage zum Skript: Soll ich das Skript unter dem Skriptbereich "Scripte" noch bereitsstellen bzw. das Skript im Autoitforum bekanntmachen? Was meinst Du, ob es noch weitere Benutzer gibt die meine bzw. Deine erweiterte Version brauchen könnten?
Das Thema als gelöst markieren, kannst Du im ersten Post. Einfach auf bearbeiten klicken, das Beitrags-Icon oben auf das "Haken-Icon" setzen und "Antwort absenden" anklicken (das habe ich jetzt mal für Dich getan).
Du kannst das Script auch gern im "Scripte"-Forum posten. Vielleicht möchtest Du es noch erweitern (nicht nur HKLM, sondern auch HKCU)?
Vielleicht mit Checkboxen auswählbar. Außerdem vielleicht noch den Suchbegriff erweitern (Platzhalter und/oder RegExp).
RE: Suche nach Registryeinträgen einer bestimmten Software in HKLM - Bazii - 28.07.2017
(28.07.2017, 05:27)Gorathan schrieb: Das Thema als gelöst markieren, kannst Du im ersten Post. Einfach auf bearbeiten klicken, das Beitrags-Icon oben auf das "Haken-Icon" setzen und "Antwort absenden" anklicken (das habe ich jetzt mal für Dich getan).
Dank' Dir für die Antwort. Für das nächste Mal hab' ich dann den Haken raus .
(28.07.2017, 05:27)Gorathan schrieb: Du kannst das Script auch gern im "Scripte"-Forum posten. Vielleicht möchtest Du es noch erweitern (nicht nur HKLM, sondern auch HKCU)?
Vielleicht mit Checkboxen auswählbar. Außerdem vielleicht noch den Suchbegriff erweitern (Platzhalter und/oder RegExp).
Gute Idee! Das wäre eine gute Übung für mich in meinem Augusturlaub. Die Checkboxen oder eine Combobox zur Auswahl der Registryzweige bekomme ich hin.
Aber bei Platzhalter und/oder RegExp würde ich gerne auf Dich zurückkommen, wenn es soweit wäre.
RE: Suche nach Registryeinträgen einer bestimmten Software in HKLM - Bazii - 29.07.2017
Hallo Gorathan,
Regsearch Script aktualisiert auf V.1.0.0.2
Changelog:
- Durchsuchen von HKLM und HKCU möglich.
- Speicherung nach getrennten Verzeichnissen (HKLM und HKCU) eingefügt.
- Intelligente Checkboxen (HKLM und HKCU) eingefügt.
- Statusbar mit Meldungen eingefügt.
- Tooltip bei Programmausführung entfernt.
- Errorhandling in der GUI verbessert. So kann nun bei der Programmausführung nicht mehr auf die GUI zugegriffen werden
Show ContentRegSearch:
#NoTrayIcon
#RequireAdmin
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
#include <AutoItConstants.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
Global $sTitle = 'RegSearch'
Global $sVersion = '1.0.0.2'
Global $sAuthor = 'Bazii'
Global $sDate = '29.07.2017'
Global $sFound = ''
Global $hDLL = DllOpen("user32.dll")
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
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 = GUICtrlCreateCheckbox("HKLM", 120, 50, 60, 15)
GUICtrlSetTip(-1, "Computer\HKEY_LOCAL_MACHINE ", "HKLM = ", 1, 1)
GUICtrlSetFont(-1, 9, 500, "Arial")
GUICtrlSetState(-1, $gui_CHECKED)
$idHKCU = GUICtrlCreateCheckbox("HKCU", 180, 50, 60, 15)
GUICtrlSetState($idHKCU, $gui_DISABLE)
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, " HKLM ausgewählt", 1)
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
While Sleep(100)
$nMsg = GUIGetMsg()
Switch $nMsg
Case $gui_EVENT_CLOSE
DllClose($hDLL)
Exit
EndSwitch
WEnd
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Func _id_Checkbox_HKLM()
If GuiCtrlRead($idHKLM) = $gui_CHECKED Then
GUICtrlSetState($idHKCU, $gui_DISABLE)
GUICtrlSetState($idHKCU, $gui_UNCHECKED)
ElseIf GuiCtrlRead($idHKLM) = $gui_UNCHECKED Then
GUICtrlSetState($idHKLM, $gui_DISABLE)
GUICtrlSetState($idHKCU, $gui_ENABLE)
GUICtrlSetState($idHKCU, $gui_CHECKED)
_GUICtrlStatusBar_SetText($hStatus, " HKCU ausgewählt", 1)
EndIf
EndFunc ;==>_id_Checkbox_HKLM
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Func _id_Checkbox_HKCU()
If GuiCtrlRead($idHKCU) = $gui_UNCHECKED Then
GUICtrlSetState($idHKLM, $gui_ENABLE)
GUICtrlSetState($idHKLM, $gui_CHECKED)
_GUICtrlStatusBar_SetText($hStatus, " HKLM ausgewählt", 1)
GUICtrlSetState($idHKCU, $gui_DISABLE)
ElseIf GuiCtrlRead($idHKLM) = $gui_UNCHECKED Then
GUICtrlSetState($idHKCU, $gui_ENABLE)
GUICtrlSetState($idHKCU, $gui_CHECKED)
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))
If $hFile_txt_hklm <> -1 Then
FileWrite($hFile_txt_hklm, $sFound)
FileClose($hFile_txt_hklm)
EndIf
Local $hFile_reg_hklm = FileOpen($sfile_reg_hklm, BitOR($FO_CREATEPATH, $FO_OVERWRITE))
If $hFile_reg_hklm <> -1 Then
FileWriteLine($hFile_reg_hklm, 'Windows Registry Editor Version 5.00' & @CRLF & @CRLF)
FileWrite($hFile_reg_hklm, $sFound)
FileClose($hFile_reg_hklm)
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))
If $hFile_txt_hkcu <> -1 Then
FileWrite($hFile_txt_hkcu, $sFound)
FileClose($hFile_txt_hkcu)
EndIf
Local $hFile_reg_hkcu = FileOpen($sfile_reg_hkcu, BitOR($FO_CREATEPATH, $FO_OVERWRITE))
If $hFile_reg_hkcu <> -1 Then
FileWriteLine($hFile_reg_hkcu, 'Windows Registry Editor Version 5.00' & @CRLF & @CRLF)
FileWrite($hFile_reg_hkcu, $sFound)
FileClose($hFile_reg_hkcu)
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, " HKCU ausgewählt", 1)
ShellExecute($sfile_txt_hkcu, @SW_MAXIMIZE)
EndIf
GUISetState(@SW_ENABLE, $hgui)
GUISetState(@SW_RESTORE, $hgui)
;~ _GUICtrlStatusBar_SetText($hStatus, " Fortschrittsanzeige", 1)
Return 0
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)
;~ _WinAPI_DestroyIcon($hIcon)
_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
;~ Return SetError(1, 0, 0)
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
$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_()
;~ _WinAPI_DestroyIcon($hIcon)
_GUICtrlStatusBar_Destroy ($hStatus)
Exit
EndFunc ;==>__GUI_EVENT_CLOSE_
Jetzt würde noch die Möglichkeit eines erweiterten Suchbegriffes fehlen (Platzhalter und/oder RegExp). Damit kenne ich mich aber gar nicht aus. Würdest Du mir dabei bitte wieder unter die Arme greifen?
RE: Suche nach Registryeinträgen einer bestimmten Software in HKLM - Gorathan - 29.07.2017
Ich verstehe nicht so ganz, warum Du beim "Abbrechen" der Suche mit "ESC" das Programm ganz beendest.
Nur die Suche abbrechen reicht doch. Man könnte vielleicht noch verhindern, dass dann die Dateien geschrieben werden, aber das Programm komplett beenden würde ich nicht.
Das erwartet man als Anwender nicht, IMHO.
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.
Nochwas: Warum eigentlich die Ergebnisse zwei mal schreiben (".txt" und ".reg")?
RE: Suche nach Registryeinträgen einer bestimmten Software in HKLM - Bazii - 29.07.2017
(29.07.2017, 18:31)Gorathan schrieb: Ich verstehe nicht so ganz, warum Du beim "Abbrechen" der Suche mit "ESC" das Programm ganz beendest.
Nur die Suche abbrechen reicht doch. Man könnte vielleicht noch verhindern, dass dann die Dateien geschrieben werden, aber das Programm komplett beenden würde ich nicht.
Das erwartet man als Anwender nicht, IMHO.
Ja das stimmt. Ich konnte nur das Programm nicht mehr sinnvoll und funktional nach meiner Bearbeitung und nach Abschluss einer Auswertung erneut aufrufen. Ich weis nicht wie ich es besser machen könnte. Ich nutze jetzt sogar um das Programm nach einer Auswertung neu zu starten am Ende den Befehl, "Exit Run ($outfile)". Wenn ich das Programm nicht beende, schreibt mir die erneute Auswertung beide Registry-Pfade in eine Textdatei und möchte ich ja nicht haben.
(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.
Das wußte ich nicht. Ich wollte ein entweder / oder haben. Daher habe ich die Pfade und die Textdateien so in Checkboxen eingebaut. War das falsch? Was wäre richtig?
(29.07.2017, 18:31)Gorathan schrieb: Nochwas: Warum eigentlich die Ergebnisse zwei mal schreiben (".txt" und ".reg")?
Die .reg Dateien benötige ich für eine Weiterverarbeitung der Dateien in ein PE-System.
|