WMI - überprüfen ob $objItem vorhanden ist

  • Hi zusammen,

    ich frage in meinem Script diverse Informationen (z.B. Hardware, BIOS, ...) über WMI ab:

    [autoit]


    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_BaseBoard", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If IsObj($colItems) Then
    For $objItem In $colItems
    $lResult = "MB" & "Manufacturer" & "|" & $objItem.Manufacturer
    _Array2DAdd($lArray, $lResult)
    $lResult = "MB" & "Name" & "|" & $objItem.Name
    _Array2DAdd($lArray, $lResult)
    $lResult = "MB" & "Version" & "|" & $objItem.Version
    _Array2DAdd($lArray, $lResult)
    $lResult = "MB" & "Serialnumber" & "|" & $objItem.SerialNumber
    _Array2DAdd($lArray, $lResult)
    Next
    _WriteDebug('INFO;_EnumerateHardwareWmi;"Win32_BaseBoard" read successfully')
    Else
    _WriteDebug('ERR ;_EnumerateHardwareWmi;No WMI Objects Found for class: "Win32_BaseBoard"')
    SetError(1)
    EndIf

    [/autoit]

    Dies funktioniert soweit auch ohne Probleme. Wenn z.B. $objItem.Version über WMI nicht gefunden werden kann, fange ich dies über einen eigenen Error Handler ab. Dies würde ich nach Möglichkeit gerne vermeiden.
    Gibt es die Möglichkeit, vor dem Aufruf von z.B.

    [autoit]

    $lResult = "MB" & "Manufacturer" & "|" & $objItem.Manufacturer
    _Array2DAdd($lArray, $lResult)

    [/autoit]


    zu überprüfen, ob $objItem.Manufacturer vorhanden ist und falls nicht zu überspringen?

    Danke und Gruß
    phr3n1c

    Einmal editiert, zuletzt von phr3n1c (24. August 2012 um 14:12)

  • Probiere es mal damit:

    [autoit]


    If ($objItem.Manufacturer <> "") Then $lResult = "MB" & "Manufacturer" & "|" & $objItem.Manufacturer

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Ich glaube er meint eher das die komplette Eigenschaft "Manufacturer" nicht in der Klasse Win32_BaseBoard enthalten ist anstatt dass nur deren Inhalt leer ist.
    In dem Fall würde das Skript auch weiterhin mit einer Fehlermeldung abbrechen.

    Du hast tatsächlich 2 Möglichkeiten:
    Einmal der Error-Handler wie du es ja bereits schon machst und die Alternative ist die Eigenschaften durchzugehen und zu schauen ob ein Feld vorkommt.
    Hier mal ein Beispiel:

    Überprüfung ob Property in WMI-Class enthalten ist
    [autoit]

    Global $o_WMI = ObjGet("winmgmts:\\localhost\")

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

    Global $s_Klasse = "Win32_BIOS"
    Global $s_Eigenschaft = "InstallDate"

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

    If wmiPropertyExists($o_WMI, $s_Klasse, $s_Eigenschaft) Then
    MsgBox(0,"", $s_Eigenschaft & " ist in " & $s_Klasse & " enthalten.")
    Else
    If @error Then
    MsgBox(48,"", "Fehler beim Öffnen der Klasse " & $s_Klasse & @CRLF & "Fehlercode: " & @error & @CRLF & "WMI-Fehlercode: " & @extended)
    Else
    MsgBox(0,"", $s_Eigenschaft & " ist nicht in " & $s_Klasse & " enthalten.")
    EndIf
    EndIf

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

    ; Prüft ob eine bestimmte Eigenschaft in einer WMI-Klasse enthalten ist
    Func wmiPropertyExists(ByRef $o_WMI, Const $s_Class, Const $s_Property)
    ;by AspirinJunkie
    If Not wmiClassExists($o_WMI, $s_Class) Then Return SetError(1,0,False)
    Local $o_Class = $o_WMI.Get($s_Class)
    If @error Then Return SetError(2, @error, False)
    For $i in $o_Class.Properties_()
    If $i.Name = $s_Property Then Return True
    Next
    Return False
    EndFunc

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

    ; prüft ob eine bestimmte Klasse in einem WMI-Objekt enthalten ist
    Func wmiClassExists(ByRef $o_WMI, Const $s_Class)
    for $i in $o_WMI.SubclassesOf()
    If $i.Path_.Class = $s_Class Then Return True
    Next
    Return False
    EndFunc

    [/autoit]
  • Ich glaube er meint eher das die komplette Eigenschaft "Manufacturer" nicht in der Klasse Win32_BaseBoard enthalten ist anstatt dass nur deren Inhalt leer ist.
    In dem Fall würde das Skript auch weiterhin mit einer Fehlermeldung abbrechen.

    Du hast tatsächlich 2 Möglichkeiten:
    Einmal der Error-Handler wie du es ja bereits schon machst und die Alternative ist die Eigenschaften durchzugehen und zu schauen ob ein Feld vorkommt.
    Hier mal ein Beispiel [...]


    Perfekt, vielen Dank. Genau das, was ich gesucht habe! :)

    Viele Grüße
    phr3n1c