Wie ermitteln dass WMI-Abfrage via ExecQuery leer ist?

  • Hallo Leute,

    ich habe nun schon viele Themen durchsucht und gelesen... Aber irgendwie ist alles Megakompliziert, am Thema vorbei oder was weiß ich....

    Eigentlich ist es ganz einfach: Ich möchte per WMI-Abfrage die MAC einer 'evtl' vorhandenen WLAN-Karte auslesen.
    Das klappt in der Regel auch einwandfrei mit

    SELECT * FROM Win32_NetworkAdapter WHERE ServiceName=NETwNs64

    [autoit]

    $wmi_obj = ObjGet('winmgmts:\\' & $wmi_node & '\' & $wmi_namespace)
    $wmi_qry = $wmi_obj.ExecQuery($wmi_query)

    [/autoit]

    Mein Problem:
    Wenn keine WLAN-Karte vorhanden ist (zB. DesktopPC), dann landen mit der Abfrage auch keine Ergebnisse in der Collection.
    Mit IsObj($wmi_qry) bekomme ich trotzdem eine '1', das kann ich also nicht als Prüfwert nehmen.
    Mit $wmi_qry.Count bekomme ich allerdings dann einen Fehler :(

    Muss ich wirklich ein komplettes ErrorHandling einbauen nur um festzustellen ob die Abfrage Ergebnisse brachte oder nicht?
    Das muss doch einfacher gehen... ?(

    Wäre toll wenn mir jemand einen Tip geben könnte! :thumbup:

    Gruß Mike

  • Scriptomatic generiert folgenden code. Must also nur noch das Select statement anpassen.

    Spoiler anzeigen
    [autoit]

    ; Generated by AutoIt Scriptomatic

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

    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $strComputer = "."

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

    $Output=""
    $Output = $Output & "Computer: " & $strComputer & @CRLF
    $Output = $Output & "==========================================" & @CRLF
    $objWMIService = ObjGet("winmgmts:" & $strComputer & "")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter", "WQL", _
    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

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

    If IsObj($colItems) then
    For $objItem In $colItems
    $Output = $Output & "AdapterType: " & $objItem.AdapterType & @CRLF
    $Output = $Output & "AdapterTypeId: " & $objItem.AdapterTypeId & @CRLF
    $Output = $Output & "AutoSense: " & $objItem.AutoSense & @CRLF
    $Output = $Output & "Availability: " & $objItem.Availability & @CRLF
    $Output = $Output & "Caption: " & $objItem.Caption & @CRLF
    $Output = $Output & "ConfigManagerErrorCode: " & $objItem.ConfigManagerErrorCode & @CRLF
    $Output = $Output & "ConfigManagerUserConfig: " & $objItem.ConfigManagerUserConfig & @CRLF
    $Output = $Output & "CreationClassName: " & $objItem.CreationClassName & @CRLF
    $Output = $Output & "Description: " & $objItem.Description & @CRLF
    $Output = $Output & "DeviceID: " & $objItem.DeviceID & @CRLF
    $Output = $Output & "ErrorCleared: " & $objItem.ErrorCleared & @CRLF
    $Output = $Output & "ErrorDescription: " & $objItem.ErrorDescription & @CRLF
    $Output = $Output & "GUID: " & $objItem.GUID & @CRLF
    $Output = $Output & "Index: " & $objItem.Index & @CRLF
    $Output = $Output & "InstallDate: " & WMIDateStringToDate($objItem.InstallDate) & @CRLF
    $Output = $Output & "Installed: " & $objItem.Installed & @CRLF
    $Output = $Output & "InterfaceIndex: " & $objItem.InterfaceIndex & @CRLF
    $Output = $Output & "LastErrorCode: " & $objItem.LastErrorCode & @CRLF
    $Output = $Output & "MACAddress: " & $objItem.MACAddress & @CRLF
    $Output = $Output & "Manufacturer: " & $objItem.Manufacturer & @CRLF
    $Output = $Output & "MaxNumberControlled: " & $objItem.MaxNumberControlled & @CRLF
    $Output = $Output & "MaxSpeed: " & $objItem.MaxSpeed & @CRLF
    $Output = $Output & "Name: " & $objItem.Name & @CRLF
    $Output = $Output & "NetConnectionID: " & $objItem.NetConnectionID & @CRLF
    $Output = $Output & "NetConnectionStatus: " & $objItem.NetConnectionStatus & @CRLF
    $Output = $Output & "NetEnabled: " & $objItem.NetEnabled & @CRLF
    $strNetworkAddresses = $objItem.NetworkAddresses(0)
    $Output = $Output & "NetworkAddresses: " & $strNetworkAddresses & @CRLF
    $Output = $Output & "PermanentAddress: " & $objItem.PermanentAddress & @CRLF
    $Output = $Output & "PhysicalAdapter: " & $objItem.PhysicalAdapter & @CRLF
    $Output = $Output & "PNPDeviceID: " & $objItem.PNPDeviceID & @CRLF
    $strPowerManagementCapabilities = $objItem.PowerManagementCapabilities(0)
    $Output = $Output & "PowerManagementCapabilities: " & $strPowerManagementCapabilities & @CRLF
    $Output = $Output & "PowerManagementSupported: " & $objItem.PowerManagementSupported & @CRLF
    $Output = $Output & "ProductName: " & $objItem.ProductName & @CRLF
    $Output = $Output & "ServiceName: " & $objItem.ServiceName & @CRLF
    $Output = $Output & "Speed: " & $objItem.Speed & @CRLF
    $Output = $Output & "Status: " & $objItem.Status & @CRLF
    $Output = $Output & "StatusInfo: " & $objItem.StatusInfo & @CRLF
    $Output = $Output & "SystemCreationClassName: " & $objItem.SystemCreationClassName & @CRLF
    $Output = $Output & "SystemName: " & $objItem.SystemName & @CRLF
    $Output = $Output & "TimeOfLastReset: " & WMIDateStringToDate($objItem.TimeOfLastReset) & @CRLF
    if Msgbox(1,"WMI Output",$Output) = 2 then ExitLoop
    $Output=""
    Next
    Else
    Msgbox(0,"WMI Output","No WMI Objects Found for class: " & "Win32_NetworkAdapter" )
    Endif

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

    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

    [/autoit]
  • Danke... aber hilft nur bedingt bis gar nicht. Mit Scriptomatic hatte ich es auch schon probiert...

    Erst einmal ist hier der GetObj() schon falsch bzw unvollständig und ob ExecQuery dann was liefert oder leer bleibt ist auch nicht gelöst... 8|
    Werde mir wohl ne Schleife zum Zählen einbauen und danach auswerten...

  • Wieso soll ObjGet falsch sein?
    Ich habe bei mir das Select statement angepasst ("SELECT * FROM Win32_NetworkAdapter WHERE ServiceName=NETwNs64"). Da kommt kein Satz zurück. Das Skript beendet daher ohne eine Ausgabe aber auch ohne Fehler.

    Welche AutoIt version, welche Betriebssystem version verwendest Du?

  • Wieso soll ObjGet falsch sein?


    Hat bei mir halt nicht funktioniert. So sollte es richtiger sein...

    [autoit]

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

    [/autoit]

    Das Skript beendet daher ohne eine Ausgabe aber auch ohne Fehler.

    Da kommt kein Satz zurück. Das Skript beendet daher ohne eine Ausgabe aber auch ohne Fehler.


    Richtig: Es kommt kein Satz zurück... Und wie frage ich genau das ab? Habe es jetzt so gelöst:

    [autoit]

    $wmi_count=0
    if IsObj($wmi_qry) Then
    For $item in $wmi_qry
    $wmi_count=$wmi_count+1
    Next
    endif

    If $wmi_count>0 Then
    ....
    else
    ....
    endif

    [/autoit]
  • Du brauchst keinen eigenen Zähler zu implementieren.
    Es gibt extra dafür ein Count-Attribut bei den WMI-Mengen.
    Hierzu darf man aber nicht $wbemFlagForwardOnly setzen.

    Beispiel:

    Spoiler anzeigen
    [autoit]

    Global $s_Query = "SELECT * FROM Win32_NetworkAdapter WHERE ServiceName='NETwNs64'"

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

    Global $o_WMI = ObjGet("winmgmts:\\localhost\root\CIMV2")
    Global $o_Items = $o_WMI.ExecQuery($s_Query, "WQL", 0)

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

    If $o_Items.Count > 0 Then
    For $o_Item In $o_Items
    ConsoleWrite($o_Item.Name & @CRLF)
    Next
    Else
    ConsoleWrite("leer" & @CRLF)
    EndIf

    [/autoit]
  • Es gibt extra dafür ein Count-Attribut bei den WMI-Mengen.


    Danke... Stimmt. Aber wie bereits beschrieben liefert .count NUR einen Wert wenn auch die Collection Werte enthält.
    Ist die Collection leer, bringt die Abfrage auf .count einen Fehler. Daher kommt ja erst das Problem.
    Mit meiner eigenen Zählroutine klappts jetzt ganz wunderbar.

  • Aber wie bereits beschrieben liefert .count NUR einen Wert wenn auch die Collection Werte enthält.

    Nein wenn keine Ergebnisse gefunden werden liefert Count den Wert 0 und keinen Fehler.
    Einen Fehler erhälst du wenn du meinen Text nur halb gelesen hast und meinen Hinweis auf die Flags ignoriert hast.

    Zeig also mal ein Minimalskript welches andere bei sich direkt ausführen können um die von dir beschrieben Fehler nachzuvollziehen.

  • Hier ein MinimalScript:

    [autoit]

    $wmi_node = @computername
    $wmi_obj = ObjGet('winmgmts:\\' & $wmi_node & '\root\cimv2')

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

    ;findet alle NICs
    $wmi_qry = $wmi_obj.ExecQuery("SELECT * FROM Win32_NetworkAdapter", "WQL")
    ConsoleWrite($wmi_qry.count) ;<<<< Zeigt bei mir 16

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

    ;Nur Wifi
    $wmi_qry = $wmi_obj.ExecQuery("SELECT * FROM Win32_NetworkAdapter WHERE ServiceName=NETwNs64", "WQL")
    ConsoleWrite($wmi_qry.count) ;<<<< Fehler

    [/autoit]