mickdu59 Posted July 10, 2020 Posted July 10, 2020 Hi, I would like to find a word in regedit HKEY_CLASSES_ROOT \ if it is possible (for example: I am looking for the word DesktopAppInstaller)
Musashi Posted July 10, 2020 Posted July 10, 2020 On 7/10/2020 at 4:12 PM, mickdu59 said: Hi, I would like to find a word in regedit ... Expand Are you looking for an AutoIt script that searches the registry? RegEdit.exe from Microsoft has its own search function to find registry entries. "In the beginning the Universe was created. This has made a lot of people very angry and been widely regarded as a bad move."
mickdu59 Posted July 10, 2020 Author Posted July 10, 2020 Yes I am looking for an Autoit script which can search in regedit in HKEY_CLASSES_ROOT
Musashi Posted July 10, 2020 Posted July 10, 2020 (edited) Here is a nice function from @PsaltyDS (with demo). https://www.autoitscript.com/forum/topic/9588-searchreg-example/?do=findComment&comment=811325 I have re-posted the code, as forum updates can occasionally corrupt older links. expandcollapse popup; Source : https://www.autoitscript.com/forum/topic/9588-searchreg-example/?do=findComment&comment=811325 ; From : @PsaltyDS Version 2.1.0.0: #include <Array.au3>; Only for _ArrayDisplay() in demo ; ==================================================== ; ==> DEMO SCRIPT 1 : ; ==================================================== $SearchKey = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion" $SearchString = "Wall" ; Find all $Timer = TimerInit() $Results = _RegSearch($SearchKey, $SearchString) $Timer = TimerDiff($Timer) / 1000 MsgBox(64, "_RegSearch() Test", "Results of searching registry (all):" & @CRLF & _ "In: " & $SearchKey & @CRLF & _ "For: " & $SearchString & @CRLF & _ "Time taken (in seconds): " & $Timer & @CRLF & _ "---------------------------------------" & @CRLF & _ $Results) ; Find only key names $Timer = TimerInit() $Results = _RegSearch($SearchKey, $SearchString, 1) $Timer = TimerDiff($Timer) / 1000 MsgBox(64, "_RegSearch() Test", "Results of searching registry (Keys names only):" & @CRLF & _ "In: " & $SearchKey & @CRLF & _ "For: " & $SearchString & @CRLF & _ "Time taken (in seconds): " & $Timer & @CRLF & _ "---------------------------------------" & @CRLF & _ $Results) ; Find only Value names $Timer = TimerInit() $Results = _RegSearch($SearchKey, $SearchString, 2) $Timer = TimerDiff($Timer) / 1000 MsgBox(64, "_RegSearch() Test", "Results of searching registry (value names only):" & @CRLF & _ "In: " & $SearchKey & @CRLF & _ "For: " & $SearchString & @CRLF & _ "Time taken (in seconds): " & $Timer & @CRLF & _ "---------------------------------------" & @CRLF & _ $Results) ; Find only data, return as an array $Timer = TimerInit() $Results = _RegSearch($SearchKey, $SearchString, 4, 1) $Timer = TimerDiff($Timer) / 1000 _ArrayDisplay($Results, "Results (data only)") ; ==================================================== ; ==> DEMO SCRIPT 2 (only shows new functionallity) : ; ==================================================== $SearchKey = "HKLM\SOFTWARE\AutoIt v3" ; Find only values, return as an array $SearchString = "*" ; find all values $Timer = TimerInit() $Results = _RegSearch($SearchKey, $SearchString, 2, 1) $Timer = TimerDiff($Timer) / 1000 _ArrayDisplay($Results, "Results (data only) in " & $Timer & " seconds") ; Find only values, by RegExp, return as an array $SearchString = "(?<=Install)Dir" ; find "Dir", only where preceded by "Install", using a RegExp look-behind assertion $Timer = TimerInit() $Results = _RegSearch($SearchKey, $SearchString, 2+8, 1) $Timer = TimerDiff($Timer) / 1000 _ArrayDisplay($Results, "Results (data only) in " & $Timer & " seconds") ; ==================================================== ; ==> FUNCTION : ; ==================================================== ;***************************************************** ; Function: _RegSearch ; ; Purpose: Performs a recursive search of the registry starting at $sStartKey, looking for $sSearchVal ; ; Syntax: _RegSearch($sStartKey, $sSearchVal, $iType = 0x07, $fArray = False) ; ; Where: $sStartKey = Reg path at which to begin search ; $sSearchVal = The string to search for, or RegExp pattern to use if $iType bit 3 is set ; $iType = Matching types to return: ; 1 = Key names ; 2 = Value names ; 4 = Value data ; 8 = $sSearchVal is a RegExp pattern (default is StringInStr) ; Add bits together for multiple match types, default is 7 (all types, StringInStr matching) ; $fArray = Return an array of results vice the string ([0] = count) ; ; Return value: On success, returns a string containing a @LF delimited list of matching key names and values: ; Where a key name matches, it is listed as a reg path with trailing backslash: ; i.e. HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ ; Where a value name matches, it is listed as a reg path without trailing backslash: ; i.e. HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WallPaperDir ; Where the data matches, the format is path = data: ; i.e. HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WallPaperDir = %SystemRoot%\Web\Wallpaper ; On failure, returns 0 and sets @error. ; ; Notes: No matches is not an error, returns "" or an array with [0] = 0 depending on $fArray ; Default StringInStr() matches are not case sensitive. ;***************************************************** ; Change Log: ; v1.0.0.0 | 03/17/05 | Original SearchReg() by Holger ; v2.0.0.0 | 08/10/06 | Native AutoIt version by PsaltyDS ; v2.0.0.1 | 08/16/06 | Fixed bug reported by markloman ; v2.0.1.0 | 07/30/08 | Added $iType and $fArray parameters ; v2.0.2.0 | 11/12/08 | Fixed bug returning array [0] = 1 vice 0 for none found ; v2.0.3.0 | 06/22/10 | Fixed bug appending some result strings together reported by squid808 ; v2.1.0.0 | 06/23/10 | Added $iType option for RegExp patterns, and pseudo wildcard "*" ;***************************************************** Func _RegSearch($sStartKey, $sSearchVal, $iType = 0x07, $fArray = False) Local $v, $sVal, $k, $sKey, $sFound = "", $sFoundSub = "", $avFound[1] = [0] ; Trim trailing backslash, if present If StringRight($sStartKey, 1) = "\" Then $sStartKey = StringTrimRight($sStartKey, 1) ; Generate type flags If Not BitAND($iType, 0x07) Then Return SetError(1, 0, 0); No returns selected Local $fKeys = BitAND($iType, 0x1), $fValue = BitAND($iType, 0x2), $fData = BitAND($iType, 0x4), $fRegExp = BitAND($iType, 0x8) ; Check for wildcard If (Not $fRegExp) And ($sSearchVal == "*") Then ; Use RegExp pattern "." to match anything $iType += 0x8 $fRegExp = 0x8 $sSearchVal = "." EndIf ; This checks values and data in the current key If ($fValue Or $fData) Then $v = 1 While 1 $sVal = RegEnumVal($sStartKey, $v) If @error = 0 Then ; Valid value - test its name If $fValue Then If $fRegExp Then If StringRegExp($sVal, $sSearchVal, 0) Then $sFound &= $sStartKey & "\" & $sVal & @LF Else If StringInStr($sVal, $sSearchVal) Then $sFound &= $sStartKey & "\" & $sVal & @LF EndIf EndIf ; test its data If $fData Then $readval = RegRead($sStartKey, $sVal) If $fRegExp Then If StringRegExp($readval, $sSearchVal, 0) Then $sFound &= $sStartKey & "\" & $sVal & " = " & $readval & @LF Else If StringInStr($readval, $sSearchVal) Then $sFound &= $sStartKey & "\" & $sVal & " = " & $readval & @LF EndIf EndIf $v += 1 Else ; No more values here ExitLoop EndIf WEnd EndIf ; This loop checks subkeys $k = 1 While 1 $sKey = RegEnumKey($sStartKey, $k) If @error = 0 Then ; Valid key - test it's name If $fKeys Then If $fRegExp Then If StringRegExp($sKey, $sSearchVal, 0) Then $sFound &= $sStartKey & "\" & $sKey & "\" & @LF Else If StringInStr($sKey, $sSearchVal) Then $sFound &= $sStartKey & "\" & $sKey & "\" & @LF EndIf EndIf ; Now search it $sFoundSub = _RegSearch($sStartKey & "\" & $sKey, $sSearchVal, $iType, False) ; use string mode to test sub keys If $sFoundSub <> "" Then $sFound &= $sFoundSub & @LF Else ; No more keys here ExitLoop EndIf $k += 1 WEnd ; Return results If StringRight($sFound, 1) = @LF Then $sFound = StringTrimRight($sFound, 1) If $fArray Then If StringStripWS($sFound, 8) <> "" Then $avFound = StringSplit($sFound, @LF) Return $avFound Else Return $sFound EndIf EndFunc ;==>_RegSearch @mickdu59 : EDIT ==> I have added the more general demo part (DEMO 1) to the script. Or have a look at : https://www.autoitscript.com/forum/topic/189296-complete-registry-search/https://www.autoitscript.com/forum/topic/191757-search-registry-keys-using-_regenumkeyvalexau3/ Edited July 10, 2020 by Musashi "In the beginning the Universe was created. This has made a lot of people very angry and been widely regarded as a bad move."
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now