Jump to content

Com Object unknown key and value.


jokke
 Share

Recommended Posts

Hi!

Im trying to write a com object where i want to fetch the key and value of the returned sql object.

Heres an failed atempt:

#include <array.au3>

$a = _querywmi("Win32_UserAccount")

_ArrayDisplay($a,"query")

Func _querywmi($class = "Win32_UserAccount", $strComputer = "localhost")
    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $specificObj = $objWMIService.ExecQuery("SELECT * FROM " & $class & "", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If isObj($specificObj) then
        For $obj In $specificObj
            If Not IsDeclared("r") Then
                Local $r[1][2]
                $r[0][0] = $obj.Key
                $r[0][0] = $obj.Value
            Else
                ReDim $r[UBound($r)+1][2]
                $r[UBound($r)-1][0] = $obj.Key
                $r[UBound($r)-1][1] = $obj.Value
            EndIf
        Next
    EndIf
    Return $r
EndFunc

All feedback appreciated :D

UDF:Crypter a file encrypt / decrypt tool with no need to remember a password again. Based on Caesar cipher using entire ASCII Table.Script's: PixelSearch Helper, quick and simple way to create a PixelSeach.Chatserver - simplified, not so complicated multi-socket server.AutoIT - Firewall, simple example on howto create a firewall with AutoIt.
Link to comment
Share on other sites

If I am not mistaken, you were trying to do something like this?

#include <array.au3>

$a = _querywmi("Win32_UserAccount")

_ArrayDisplay($a, "query")

Func _querywmi($class = "Win32_UserAccount", $strComputer = "localhost")
    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $specificObj = $objWMIService.ExecQuery("SELECT * FROM " & $class & "", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If IsObj($specificObj) Then
        ConsoleWrite("test 1" & @CRLF)
        For $obj In $specificObj
            For $objProperty In $obj.Properties_()
                If Not IsDeclared("r") Then
                    Local $r[1][2]
                    $r[0][0] = $objProperty.Name
                    $r[0][1] = $objProperty.Value
                Else
                    ReDim $r[UBound($r) + 1][2]
                    $r[UBound($r) - 1][0] = $objProperty.Name
                    $r[UBound($r) - 1][1] = $objProperty.Value
                EndIf
            Next
            ReDim $r[UBound($r) + 1][2]
            $r[UBound($r) - 1][0] = '---------------'
            $r[UBound($r) - 1][1] = '---------------'
        Next
    EndIf
    Return $r
EndFunc   ;==>_querywmi

Thanks to the Autoit Scriptomatic Tool source code for this:

For $objProperty in $objClass.Properties_() ; Must use (), because method ends with an underscore

EDIT:

There are many queries that will fail with this due to WMI returning an array of data. For a workaround, check out the Autoit Scriptomatic Tool source code. Specifically this portion:

For $objProperty In $objClass.Properties_() ; Must use (), because method ends with an underscore

    If $objProperty.IsArray = True Then
        $strScriptCode = $strScriptCode & "      $str" & $objProperty.Name & " = $objItem." & $objProperty.Name & "(0)" & @CRLF
        $strScriptCode = $strScriptCode & "      $Output = $Output & " & $strRowStart & $objProperty.Name & $strColumnSeparator & Chr(34) & " & $str" & $objProperty.Name & $strRowEnd & @CRLF
    ElseIf $objProperty.CIMTYPE = 101 Then
        $bHasDates = True
        $strScriptCode = $strScriptCode & "      $Output = $Output & " & $strRowStart & $objProperty.Name & $strColumnSeparator & Chr(34) & " & WMIDateStringToDate($objItem." & $objProperty.Name & ")" & $strRowEnd & @CRLF
    Else
        $strScriptCode = $strScriptCode & "      $Output = $Output & " & $strRowStart & $objProperty.Name & $strColumnSeparator & Chr(34) & " & $objItem." & $objProperty.Name & $strRowEnd & @CRLF
    EndIf
Next
Edited by danwilli
Link to comment
Share on other sites

-Added support for when the property returns an array as shown in the AutoIt Scriptomatic Tool source code.

-Added the WMIDateStringToDate() function from AutoIt Scriptomatic Tool source code.

#include <array.au3>

$a = _querywmi("Win32_BIOS")

_ArrayDisplay($a, "query")

Func _querywmi($class = "Win32_UserAccount", $strComputer = "localhost")
    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $specificObj = $objWMIService.ExecQuery("SELECT * FROM " & $class & "", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If IsObj($specificObj) Then
        ConsoleWrite("test 1" & @CRLF)
        For $obj In $specificObj
            For $objProperty In $obj.Properties_()
                If Not IsDeclared("r") Then
                    Local $r[1][2]
                Else
                    ReDim $r[UBound($r) + 1][2]
                EndIf
                $r[UBound($r) - 1][0] = $objProperty.Name
                If $objProperty.IsArray = True Then
                    $r[UBound($r) - 1][1] = $objProperty.Value(0)
                ElseIf $objProperty.CIMTYPE = 101 Then
                    $r[UBound($r) - 1][1] = WMIDateStringToDate($objProperty.Value)
                Else
                    $r[UBound($r) - 1][1] = $objProperty.Value
                EndIf
            Next
            ReDim $r[UBound($r) + 1][2]
            $r[UBound($r) - 1][0] = '---------------'
            $r[UBound($r) - 1][1] = '---------------'
        Next
    EndIf
    Return $r
EndFunc   ;==>_querywmi

Func WMIDateStringToDate($dtmDate)
    Return (StringMid($dtmDate, 5, 2) & "/" & _
    StringMid($dtmDate, 7, 2) & "/" & StringLeft($dtmDate, 4) _
    & " " & StringMid($dtmDate, 9, 2) & ":" & StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate,13, 2))
EndFunc
Link to comment
Share on other sites

Perfect thanks!!

UDF:Crypter a file encrypt / decrypt tool with no need to remember a password again. Based on Caesar cipher using entire ASCII Table.Script's: PixelSearch Helper, quick and simple way to create a PixelSeach.Chatserver - simplified, not so complicated multi-socket server.AutoIT - Firewall, simple example on howto create a firewall with AutoIt.
Link to comment
Share on other sites

This was actually my goal of this, making the wmi call more like how a regular SQL select is done.

#include <array.au3>

$a = _querywmi("SELECT * FROM Win32_OperatingSystem")

_ArrayDisplay($a, "query")

Func _querywmi($query, $strComputer = "localhost")
    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $specificObj = $objWMIService.ExecQuery($query, "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If IsObj($specificObj) Then
        For $obj In $specificObj
            For $objProperty In $obj.Properties_()
                If Not IsDeclared("r") Then
                    Local $r[1][2]
                Else
                    ReDim $r[UBound($r) + 1][2]
                EndIf
                $r[UBound($r) - 1][0] = $objProperty.Name
                If $objProperty.IsArray = True Then
                    $t = $objProperty.Value
                    $r[UBound($r) - 1][1] = _ArrayToString($t,@TAB)             
                ElseIf $objProperty.CIMTYPE = 101 Then
                    $r[UBound($r) - 1][1] = WMIDateStringToDate($objProperty.Value)
                Else
                    $r[UBound($r) - 1][1] = $objProperty.Value
                EndIf
            Next
        Next
    EndIf
    If IsDeclared("r") Then
        Return $r
    Else
        Return False
    EndIf
EndFunc   ;==>_querywmi

Func WMIDateStringToDate($dtmDate)
    Return (StringMid($dtmDate, 5, 2) & "/" & _
    StringMid($dtmDate, 7, 2) & "/" & StringLeft($dtmDate, 4) _
    & " " & StringMid($dtmDate, 9, 2) & ":" & StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate,13, 2))
EndFunc
Edited by jokke
UDF:Crypter a file encrypt / decrypt tool with no need to remember a password again. Based on Caesar cipher using entire ASCII Table.Script's: PixelSearch Helper, quick and simple way to create a PixelSeach.Chatserver - simplified, not so complicated multi-socket server.AutoIT - Firewall, simple example on howto create a firewall with AutoIt.
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...