Problem mit einem Fehler in _GetRegValues

  • hallo community!
    Ich benutze die Funktion _GetRegValues von BugFix .... leider hab ich ein Problem, welches ich einfach nicht reproduzieren konnte, ausser auf dem Rechner eines Freundes per Teamviewer.
    Ich habe keine ahnung warum er dort immer wieder mit folgender fehlermeldung crashte:
    http://puu.sh/2FDJJ.jpg (Error: Variable must be type object)

    ich benötige tipps wie ich das ganze am glücklichsten abfange, da ich nicht erwarte, dass jemand einen fehler in dieser funktion bzw an dieser stelle ausmachen kann und andererseits auch keinen fehler beim
    abfangen des fehlers machen möchte.
    der Ursprung für dem Fehlermeldung liegt genau in der Zeile:
    Local $oReg = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")


    hier benutze ich die Funktion um _GetRegValues aufzurufen:

    [autoit]

    Func _add_to_autostart_Taskplaner()
    $taskname = StringReplace(@ScriptFullPath,"\","")
    $taskname = StringReplace($taskname,":","")
    $taskname = _Crypt_HashData($taskname, $CALG_MD5)
    $regkeys = _GetRegSubKeys("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks")
    for $z = 0 to UBound($regkeys) -1
    $regvalues = _GetRegValues("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks\"&$regkeys[$z])
    $regentryfound = _ArraySearch($regvalues, "\"&$taskname)
    if $regentryfound >= 0 Then Return 1
    Next
    $result000 = ShellExecute("schtasks.exe",'/create /sc ONLOGON /tn '&'"'&$taskname&'"'&' /rl HIGHEST /tr '&'"\"'&@ScriptFullPath&'\"',"","",@SW_HIDE)
    EndFunc

    [/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[0] = Name
    ; Array[1] = Typ
    ; Array[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") ;hier cracht es!
    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]
  • Also evtl war es nicht so ganz deutlich ... das script ist hier nur auszugsweise gepostet, da viel zu lang .... es fordert natürlich per #RequireAdmin die entsprechenden rechte an. daran scheint es nicht zu liegen. leider trat das problem nur einmal/sich immer wiederholen bei jemanden auf. ich möchte natürlich verhindern das es erneut bei anderen passiert.
    deshalb möchte ich den fehler möglichst abfangen, weiss aber nicht wie bzw ob es überhaupt geht die besagte fehlermeldung abzufangen.
    wäre das eine mögliche lösung ?

    [autoit]


    If Not IsObj("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv") Then
    ;MsgBox(0, "FEHLER", "Ist kein Objekt.")
    return 0
    Else
    Local $oReg = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv") ;hier cracht es!
    ....
    EndIf

    [/autoit]
  • [autoit]

    $oReg = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")

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

    If Not IsObj($oReg) Then
    MsgBox(16, "Error", "$oReg ist kein Objekt.")
    ; bla blub
    Else
    MsgBox(0, "Erfolgreich", "$oReg ist ein Objekt.")
    ; bla blub
    EndIf

    [/autoit]

    So kannst du den (eventuellen) Fehler abfangen.

    MfG

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • PainTain
    Ich glaube nicht das deine variante funktioniert, da der Fehler ja aus der Zeile 1 (dein script) bereits entsteht und geworfen wird (siehe fehlermeldung und post 1).
    da nützt es doch nichts, wenn ich danach eine abfrage mache, deswegen hab ich meine variante im post über deinem anders gestaltet,
    bin mir aber nicht sicher dabei.

  • PainTain
    Ich glaube nicht das deine variante funktioniert, da der Fehler ja aus der Zeile 1 (dein script) bereits entsteht und geworfen wird (siehe fehlermeldung und post 1).
    da nützt es doch nichts, wenn ich danach eine abfrage mache, deswegen hab ich meine variante im post über deinem anders gestaltet,
    bin mir aber nicht sicher dabei.


    Schau dir mal in der Hilfe den Befehl "IsObj" genauer an. ;)
    Dann wirst du (hoffentlich) verstehen, warum deine Variante nicht funktionieren kann. :rolleyes:

    MfG

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski