WMI-Error abfangen

  • Hallo,
    ich habe hier 2 Funktionen (keine Ahnung mehr woher).
    Die erste funktioniert unter windows 7 nur bedingt, da wenn keine Seriennummer abgefragt werden kann, er in Zeile 8 bei

    [autoit]

    For $colItems In $WMIWmiMonitorID

    [/autoit]


    abbricht.
    Die 2.te Funktion unten bringt mir unter Windows 7 nicht immer eine Seriennummer, obwohl eine eingetragen ist. Wenn eine da ist, bringt mir die obere Funktion ebenso die Serial.
    Ich würde gerne die obere nutzen, aber weiss grad nicht wie ich den Fehler oben abfangen soll, da ich mit WMI und dergleichen auf Kriegsfuss stehe.

    Spoiler anzeigen
    [autoit]

    Func _CI_GetMonitor($LHost)
    Local $colItems, $objWMIService, $WMIWmiMonitorID, $sMonitorInfo; $objItem,

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

    $objWMIService = ObjGet('winmgmts:\\' & $LHost & '\root\wmi')
    If Not IsObj($objWMIService) Then Return SetError(1, 0, 0)
    $WMIWmiMonitorID = $objWMIService.ExecQuery("SELECT * FROM WmiMonitorID WHERE Active='True'")
    If IsObj($WMIWmiMonitorID) Then
    For $colItems In $WMIWmiMonitorID
    For $i = 0 To UBound($colItems.SerialNumberID) - 1
    Local $sSerialNumberID = $colItems.SerialNumberID($i)
    If StringLen($sSerialNumberID) <> 0 Then
    $sMonitorInfo = $sMonitorInfo & String(Chr($sSerialNumberID))
    EndIf
    Next
    Next
    EndIf
    Return $sMonitorInfo
    EndFunc ;==>_CI_GetMonitor

    [/autoit]
    Spoiler anzeigen
    [autoit]


    Func Monitor_XP($strComputer = $LHost)
    Local $wbemFlagReturnImmediately = 0x10
    Local $wbemFlagForwardOnly = 0x20

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

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

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

    If Not IsObj($objWMIService) Then Return

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

    Local $colItems = $objWMIService.ExecQuery ("SELECT * FROM Win32_DesktopMonitor", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    Local $j = 0

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

    If IsObj ($colItems) Then
    For $objItem In $colItems
    Local $PNPDeviceID = $objItem.PNPDeviceID
    Local $screenwidth = $objItem.ScreenWidth
    If $screenwidth = 0 Then ExitLoop
    Local $monedid = RegRead("\\" & $strComputer & "\HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\" & $PNPDeviceID & "\Device Parameters", "EDID")
    if StringLen($monedid) >0 Then
    Dim $edidarray[StringLen($monedid) ]
    Else
    Dim $edidarray[1]
    EndIf
    $edidarray[0]= (StringLen($monedid) / 2) + 1
    For $i = 1 To StringLen($monedid) Step 2
    $j = $j + 1
    $edidarray[$j] = Dec(StringMid($monedid, $i, 2))
    Next
    Next

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

    Local $sernumstr = ""
    Local $sernum = 0
    For $i = 1 To (UBound($edidarray) / 2) - 4
    If $edidarray[$i] = "0" And $edidarray[$i + 1] = "0" And $edidarray[$i + 2] = "0" And $edidarray[$i + 3] = "255" And $edidarray[$i + 4] = "0" Then
    $sernum = $i + 4
    EndIf
    Next
    If $sernum <> 0 Then
    Local $endstr = 0
    $sernumstr = ""
    For $i = 1 To 13
    If $edidarray[$sernum + $i] = "10" Then
    $endstr = 1
    Else
    If $endstr = 0 Then
    $sernumstr = $sernumstr & Chr($edidarray[$sernum + $i])
    EndIf
    EndIf
    Next
    Else
    $sernumstr = ""
    EndIf
    EndIf

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

    Return $sernumstr
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von Torni (18. Oktober 2012 um 06:10)

  • Ein COM error handler wirkt hier Wunder. Siehe ObjEvent. Hier gibt's ein Beispielscript.

    Der Fehlercode steht für "Nicht unterstützt". Details gibt's hier .

  • Danke für die Antworten.

    water: wenn ich deinen 2.ten link richtig deute hat das was mit der Server-Architektur von uns zu tun (wo wirklich noch 2003) läuft.

    Werde ich dann wohl abfangen müssen..