Jump to content

Search word regedit HKEY_CLASSES_ROOT


Recommended Posts

36 minutes ago, mickdu59 said:

Hi, I would like to find a word in regedit ...

Are you looking for an AutoIt script that searches the registry?

RegEdit.exe from Microsoft has its own search function to find registry entries.

Musashi-C64.png

"In the beginning the Universe was created. This has made a lot of people very angry and been widely regarded as a bad move."

Link to comment
Share on other sites

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.

; 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 by Musashi

Musashi-C64.png

"In the beginning the Universe was created. This has made a lot of people very angry and been widely regarded as a bad move."

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...