Jump to content

Recommended Posts

Posted

Hello,

I use WMI to retrieve OS version from remote computers . When one remote Pc is unreachable (off line, firewall, RPC service, ...) I get an error :

Variable must be of type : "Object"

and the script fails.

I would like to know how to handle this error case and continue the script like VBS "on error resume next" or "on error goto".

Here his a script sample :

$wbemFlagReturnImmediately = 0x10

$wbemFlagForwardOnly = 0x20

$colItems = ""

$strComputer = InputBox("Computer", "Name : ", "")

$Output=""

$Output = $Output & "Computer: " & $strComputer & @CRLF

$Output = $Output & "==========================================" & @CRLF

$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")

$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem", "WQL", _

$wbemFlagReturnImmediately + $wbemFlagForwardOnly)

If IsObj($colItems) then

For $objItem In $colItems

$Output = $Output & "Version: " & $objItem.Version & @CRLF

if Msgbox(1,"WMI Output",$Output) = 2 then ExitLoop

$Output=""

Next

Else

Msgbox(0,"WMI Output","No WMI Objects Found for class: " & "Win32_OperatingSystem" )

Endif

Thank's for your help.

<AN>

Posted

Welcome to the forums

use the AutoIt COM error handler

look up 'COM Error Handling' in the help file in 'Function Reference' section, subsection 'Obj/COM Reference'

here's an example with a COM error handler and use of 'IsObj()' to verify objects.

you may want to loop through machine names read from an ini or text file

and log the results to a file.

Global $oMyError = ObjEvent("AutoIt.Error", "ComErrorHandler")
If Not IsObj($oMyError) Then
    MsgBox(0, "AutoIt.Error", "Problem with COM error handler")
    Exit
EndIf
Global $wbemFlagReturnImmediately = 0x10
Global $wbemFlagForwardOnly = 0x20
Global $wbemFlag = BitOR($wbemFlagForwardOnly, $wbemFlagReturnImmediately)
Global $colItems = ""
Global $Output = ""
Global $strComputer, $ErrMsg

Do
    $strComputer = InputBox("Computer", "Name : " & $ErrMsg, "") ; cancel exits
    If @error Then Exit
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    ; check @error returned by COM error handler if machine is unreachable or does not exist
    If Not @error And IsObj($objWMIService) Then  ; can also check if variable is object
        Beep(1000, 5)
        ExitLoop
    Else
        $ErrMsg = @TAB & @TAB & $strComputer & @CRLF & "COM Error: " & @TAB & $oMyError.windescription
    EndIf
Until Not @error

$Output &= "Computer: " & $strComputer & @CRLF
$Output &= "==========================================" & @CRLF

; next line limits objects in collection to just 'Version'. can add additional objects separated by commas
;e.g. "SELECT Caption,Version FROM Win32_OperatingSystem"
$colItems = $objWMIService.ExecQuery("SELECT Version FROM Win32_OperatingSystem", "WQL", $wbemFlag)

If IsObj($colItems) Then
    For $objItem In $colItems
        ;$Output &= "Caption: " & $objItem.Caption & @CRLF
        $Output &= "Version: " & $objItem.Version & @CRLF
        If MsgBox(1, "WMI Output", $Output) = 2 Then ExitLoop
        $Output = ""
    Next
Else
    MsgBox(0, "WMI Output", "No WMI Objects Found for class: " & "Win32_OperatingSystem")
EndIf

Func ComErrorHandler()
    $HexNumber = Hex($oMyError.number, 8)
   ConsoleWrite("-> Debug:  Intercepted COM Error:  Number = " & $HexNumber & _
        "  Windescription = " & $oMyError.windescription & @LF)
    ;MsgBox(0, "COM Error", "We intercepted a COM Error !" & @CRLF & @CRLF & _
            ;"err.description is: " & @TAB & $oMyError.description & @CRLF & _
            ;"err.windescription:" & @TAB & $oMyError.windescription & @CRLF & _
            ;"err.number is: " & @TAB & $HexNumber & @CRLF & _
            ;"err.lastdllerror is: " & @TAB & $oMyError.lastdllerror & @CRLF & _
            ;"err.scriptline is: " & @TAB & $oMyError.scriptline & @CRLF & _
            ;"err.source is: " & @TAB & $oMyError.source & @CRLF & _
            ;"err.helpfile is: " & @TAB & $oMyError.helpfile & @CRLF & _
            ;"err.helpcontext is: " & @TAB & $oMyError.helpcontext _
            ;, 5) ; timeout after 5 seconds
    SetError(1) ; to check for after this function returns
EndFunc   ;==>COMErrFunc

I see fascists...

Posted

Welcome to the forums

use the AutoIt COM error handler

look up 'COM Error Handling' in the help file in 'Function Reference' section, subsection 'Obj/COM Reference'

here's an example with a COM error handler and use of 'IsObj()' to verify objects.

you may want to loop through machine names read from an ini or text file

and log the results to a file.

Global $oMyError = ObjEvent("AutoIt.Error", "ComErrorHandler")
If Not IsObj($oMyError) Then
    MsgBox(0, "AutoIt.Error", "Problem with COM error handler")
    Exit
EndIf
Global $wbemFlagReturnImmediately = 0x10
Global $wbemFlagForwardOnly = 0x20
Global $wbemFlag = BitOR($wbemFlagForwardOnly, $wbemFlagReturnImmediately)
Global $colItems = ""
Global $Output = ""
Global $strComputer, $ErrMsg

Do
    $strComputer = InputBox("Computer", "Name : " & $ErrMsg, "") ; cancel exits
    If @error Then Exit
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    ; check @error returned by COM error handler if machine is unreachable or does not exist
    If Not @error And IsObj($objWMIService) Then  ; can also check if variable is object
        Beep(1000, 5)
        ExitLoop
    Else
        $ErrMsg = @TAB & @TAB & $strComputer & @CRLF & "COM Error: " & @TAB & $oMyError.windescription
    EndIf
Until Not @error

$Output &= "Computer: " & $strComputer & @CRLF
$Output &= "==========================================" & @CRLF

; next line limits objects in collection to just 'Version'. can add additional objects separated by commas
;e.g. "SELECT Caption,Version FROM Win32_OperatingSystem"
$colItems = $objWMIService.ExecQuery("SELECT Version FROM Win32_OperatingSystem", "WQL", $wbemFlag)

If IsObj($colItems) Then
    For $objItem In $colItems
        ;$Output &= "Caption: " & $objItem.Caption & @CRLF
        $Output &= "Version: " & $objItem.Version & @CRLF
        If MsgBox(1, "WMI Output", $Output) = 2 Then ExitLoop
        $Output = ""
    Next
Else
    MsgBox(0, "WMI Output", "No WMI Objects Found for class: " & "Win32_OperatingSystem")
EndIf

Func ComErrorHandler()
    $HexNumber = Hex($oMyError.number, 8)
   ConsoleWrite("-> Debug:  Intercepted COM Error:  Number = " & $HexNumber & _
        "  Windescription = " & $oMyError.windescription & @LF)
    ;MsgBox(0, "COM Error", "We intercepted a COM Error !" & @CRLF & @CRLF & _
            ;"err.description is: " & @TAB & $oMyError.description & @CRLF & _
            ;"err.windescription:" & @TAB & $oMyError.windescription & @CRLF & _
            ;"err.number is: " & @TAB & $HexNumber & @CRLF & _
            ;"err.lastdllerror is: " & @TAB & $oMyError.lastdllerror & @CRLF & _
            ;"err.scriptline is: " & @TAB & $oMyError.scriptline & @CRLF & _
            ;"err.source is: " & @TAB & $oMyError.source & @CRLF & _
            ;"err.helpfile is: " & @TAB & $oMyError.helpfile & @CRLF & _
            ;"err.helpcontext is: " & @TAB & $oMyError.helpcontext _
            ;, 5) ; timeout after 5 seconds
    SetError(1) ; to check for after this function returns
EndFunc   ;==>COMErrFunc
Wonderfull ! Many thanks !

It works fine.

I tried the AutoIt COM error handler but without succes because I placed the check in a wrong place (after the query, too late... :D ).

Your example is very complete and usefull.

In fact, I get my computers list from Active Directory and I need to know the OS version to select the right way to continue with each of them.

Thanks for the councils (Select limit).

<AN>

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
  • Recently Browsing   0 members

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