Registry-Funktionen per Objekt

    • Offizieller Beitrag

    Hi,
    3 nützliche "Helferlein":

    _GetRegSubKeys($HKEY)
    Ermittelt die Unterschlüssel für den übergebenen Schlüssel

    _GetRegRights($HKEY)
    Ermittelt die Rechte des Abfragenden für den übergebenen Schlüssel

    _GetRegValues($HKEY)
    Ermittelt alle Namen, Typen und Werte in einem gegebenen Schlüssel

    Spoiler anzeigen
    [autoit]

    #include<Array.au3>
    $ar = _GetRegSubKeys('HKLM\Software')
    _ArrayDisplay($ar, "SubKeys von Software")
    MsgBox(0, 'Rechte für Software', _GetRegRights('HKLM\Software'))
    $ar = _GetRegValues('HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\Autoit')
    If IsArray($ar) Then
    _ArrayDisplay($ar)
    Else
    MsgBox(0, '', 'Fehler')
    EndIf
    ;========================================================================================
    ; Function Name: _GetRegSubKeys($HKEY)
    ; Description: Ermittelt die Unterschlüssel für den übergebenen Schlüssel
    ; Parameter(s): $HKEY der Registryschlüssel
    ; Return Value(s): Erfolg Array mit den Unterschlüsseln
    ; Fehler Leerstring (keine Unterschlüssel vorhanden oder Schlüssel existiert nicht)
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;========================================================================================
    Func _GetRegSubKeys($HKEY)
    If StringInStr($HKEY, '\') Then
    If StringRight($HKEY, 1) = '\' Then
    $HKEY = StringTrimRight($HKEY, 1)
    Local $strKeyPath = ''
    Else
    Local $strKeyPath = StringRight($HKEY, StringLen($HKEY)-StringInStr($HKEY, '\') )
    $HKEY = StringLeft($HKEY, StringInStr($HKEY, '\')-1)
    EndIf
    Else
    Local $strKeyPath = ''
    EndIf
    Select
    Case $HKEY = "HKEY_LOCAL_MACHINE" Or $HKEY = "HKLM"
    $HKEY = 0x80000002
    Case $HKEY = "HKEY_USERS" Or $HKEY = "HKU"
    $HKEY = 0x80000003
    Case $HKEY = "HKEY_CURRENT_USER" Or $HKEY = "HKCU"
    $HKEY = 0x80000001
    Case $HKEY = "HKEY_CLASSES_ROOT" Or $HKEY = "HKCR"
    $HKEY = 0x80000000
    Case $HKEY = "HKEY_CURRENT_CONFIG" Or $HKEY = "HKCC"
    $HKEY = 0x80000005
    EndSelect
    Local $arrSubKeys = '', $subkey
    Local $oReg = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
    $oReg.EnumKey ($HKEY, $strKeyPath, $arrSubKeys)
    Return $arrSubKeys
    EndFunc ;==>_GetRegSubKeys

    [/autoit] [autoit][/autoit] [autoit]

    ;========================================================================================
    ; Function Name: _GetRegRights($HKEY)
    ; Description: Ermittelt die Rechte des Abfragenden für den übergebenen Schlüssel
    ; Parameter(s): $HKEY der zu prüfende Registryschlüssel
    ; Return Value(s): String mit Auflistung der Rechte:
    ; Q Key Query Value
    ; S Key Set Value
    ; C Key Create Sub Key
    ; D Delete
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;========================================================================================
    Func _GetRegRights($HKEY)
    Local $bHasAccessRight, $sRights = ''
    If StringInStr($HKEY, '\') Then
    If StringRight($HKEY, 1) = '\' Then
    $HKEY = StringTrimRight($HKEY, 1)
    Local $strKeyPath = ''
    Else
    Local $strKeyPath = StringRight($HKEY, StringLen($HKEY)-StringInStr($HKEY, '\') )
    $HKEY = StringLeft($HKEY, StringInStr($HKEY, '\')-1)
    EndIf
    Else
    Local $strKeyPath = ''
    EndIf
    Select
    Case $HKEY = "HKEY_LOCAL_MACHINE" Or $HKEY = "HKLM"
    $HKEY = 0x80000002
    Case $HKEY = "HKEY_USERS" Or $HKEY = "HKU"
    $HKEY = 0x80000003
    Case $HKEY = "HKEY_CURRENT_USER" Or $HKEY = "HKCU"
    $HKEY = 0x80000001
    Case $HKEY = "HKEY_CLASSES_ROOT" Or $HKEY = "HKCR"
    $HKEY = 0x80000000
    Case $HKEY = "HKEY_CURRENT_CONFIG" Or $HKEY = "HKCC"
    $HKEY = 0x80000005
    EndSelect
    Local $oReg = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
    $oReg.CheckAccess($HKEY, $strKeyPath, 0x0001, $bHasAccessRight)
    If $bHasAccessRight = True Then $sRights &= 'Q'
    $oReg.CheckAccess($HKEY, $strKeyPath, 0x0002, $bHasAccessRight)
    If $bHasAccessRight = True Then $sRights &= 'S'
    $oReg.CheckAccess($HKEY, $strKeyPath, 0x0004, $bHasAccessRight)
    If $bHasAccessRight = True Then $sRights &= 'C'
    $oReg.CheckAccess($HKEY, $strKeyPath, 0x00010000, $bHasAccessRight)
    If $bHasAccessRight = True Then $sRights &= 'D'
    Return $sRights
    EndFunc ;==>_GetRegRights

    [/autoit] [autoit][/autoit] [autoit]

    ;========================================================================================
    ; Function Name: _GetRegValues($HKEY)
    ; Description: Ermittelt alle Namen, Typen und Werte in einem gegebenen Schlüssel
    ; Parameter(s): $HKEY der Registryschlüssel
    ; Return Value(s): Erfolg Array[i][0] = Name
    ; Array[i][1] = Typ
    ; Array[i][2] = Wert
    ; Fehler Leerstring (Schlüssel existiert nicht oder ist ohne Einträge)
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;========================================================================================
    Func _GetRegValues($HKEY)
    Local $oMyError = ObjEvent("AutoIt.Error","MyErrFunc")
    If StringInStr($HKEY, '\') Then
    If StringRight($HKEY, 1) = '\' Then
    $HKEY = StringTrimRight($HKEY, 1)
    Local $strKeyPath = ''
    Else
    Local $strKeyPath = StringRight($HKEY, StringLen($HKEY)-StringInStr($HKEY, '\') )
    $HKEY = StringLeft($HKEY, StringInStr($HKEY, '\')-1)
    EndIf
    Else
    Local $strKeyPath = ''
    EndIf
    Select
    Case $HKEY = "HKEY_LOCAL_MACHINE" Or $HKEY = "HKLM"
    $HKEY = 0x80000002
    Case $HKEY = "HKEY_USERS" Or $HKEY = "HKU"
    $HKEY = 0x80000003
    Case $HKEY = "HKEY_CURRENT_USER" Or $HKEY = "HKCU"
    $HKEY = 0x80000001
    Case $HKEY = "HKEY_CLASSES_ROOT" Or $HKEY = "HKCR"
    $HKEY = 0x80000000
    Case $HKEY = "HKEY_CURRENT_CONFIG" Or $HKEY = "HKCC"
    $HKEY = 0x80000005
    EndSelect
    Local $oReg = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
    Local $arrValueNames, $arrValueTypes, $strValue
    $oReg.EnumValues($HKEY, $strKeyPath, $arrValueNames, $arrValueTypes)
    $OEvent = ObjEvent($oReg, "EnumValues")
    If Not IsArray($arrValueNames) Then Return ''
    Local $arOut[UBound($arrValueNames)][3]
    For $i = 0 To UBound($arrValueNames) -1
    $arOut[$i][0] = $arrValueNames[$i]
    Switch $arrValueTypes[$i]
    Case 1
    $arOut[$i][1] = 'REG_SZ'
    $oReg.GetStringValue($HKEY, $strKeyPath, $arrValueNames[$i], $strValue)
    Case 2
    $arOut[$i][1] = 'REG_EXPAND_SZ'
    $oReg.GetExpandedStringValue($HKEY, $strKeyPath, $arrValueNames[$i], $strValue)
    Case 3
    $arOut[$i][1] = 'REG_BINARY'
    $oReg.GetBinaryValue($HKEY, $strKeyPath, $arrValueNames[$i], $strValue)
    Case 4
    $arOut[$i][1] = 'REG_DWORD'
    $oReg.GetStringValue($HKEY, $strKeyPath, $arrValueNames[$i], $strValue)
    Case 7
    $arOut[$i][1] = 'REG_MULTI_SZ'
    $oReg.GetMultiStringValue($HKEY, $strKeyPath, $arrValueNames[$i], $strValue)
    EndSwitch
    $arOut[$i][2] = $strValue
    Next
    Return $arOut
    EndFunc ;==>_GetRegValues
    Func MyErrFunc()
    Return
    Endfunc

    [/autoit]
  • Hallo BugFix.

    Ich habe ein Problem mit der Funktion :/

    ich möchte alle werte die in den:

    HKEY_USERS\***SID***\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer

    auslesen, die SID habe ich mit der Funktion _GetSID() bereits, nur leider halt nicht die werte
    aus Explorer, grund ist ich möchte ein Programm/script schreiben, welches dann mit Disallowrun
    bestimmte programme sperren/entsperren möchte.
    und diese dementsprechend auslesen muss, welche bereits vorhanden sind und welche nicht.

    Hoffe auf schnelle anzwort!
    vielen dank schon mal für deine anderen hilfreichen beiträge, die mir schon einige male geholfen haben!

  • :) stimmt!

    Also wenn ich das richtig verstanden habe, dann sollte diese Funktion:
    _GetRegValues($HKEY)

    diese werte auflisten können, allerdings muss ich gestehen,
    das ist die syntax nicht verstehe. leider. was eigendlich nicht oft so ist.
    also ich wäre für ein beispiel, welches ich verstehe einfach ein praktischen beispiel,
    wie diese funktion die Namen in einem array speichert, dann sollte ich das auch verstehen :/

    • Offizieller Beitrag

    also ich wäre für ein beispiel, welches ich verstehe einfach ein praktischen beispiel,
    wie diese funktion die Namen in einem array speichert, dann sollte ich das auch verstehen :/


    Hast du überhaupt angeschaut, was ich gepostet habe? Ist doch folgendes Bsp. dabei:

    [autoit]

    $ar = _GetRegValues('HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\Autoit')
    If IsArray($ar) Then
    _ArrayDisplay($ar)
    Else
    MsgBox(0, '', 'Fehler')
    EndIf

    [/autoit]

    Was soll man da noch groß erklären? :wacko:
    Schlüssel übergeben, Array wird zurückgegeben, das wars.