Abrufen eines Fehlercodes

Wie alle anderen Anwendungen auch empfängt WMI Fehlercodes vom Windows-Betriebssystem.

Wenn Sie einen Fehlercode erhalten, haben Sie folgende Optionen:

  • Sehen Sie sich das Ereignisprotokoll an.

    WMI sendet Fehlermeldungen an den Ereignisprotokolldienst, der die Ereignisprotokolle überprüft, um die Ursache eines Fehlers zu ermitteln. Sie können mithilfe der vom Anbieter Ereignisprotokoll unterstützten Klassen programmgesteuert auf Ereignisprotokolle zugreifen.

  • Rufen Sie den Fehlercode wie gewohnt ab.

    WMI unterstützt die Standardverfahren zum Abrufen von Fehlercodes, bei denen es sich um COM-Fehlercodes für C++ sowie um native Fehlerobjekte wie das Err-Objekt (VBScript) oder SWbemLastError handelt, wenn der Anbieter Fehlerinformationen bereitstellt.

Weitere Informationen finden Sie unter Bearbeiten von Klassen- und Instanzinformationen.

Dieses Thema umfasst die folgenden Abschnitte:

Behandeln eines Fehlers mit VBScript

Wenn ein WMI-Aufruf über die Skript-API für WMI einen Fehler verursacht, haben Sie die folgenden Möglichkeiten, um auf die Fehlerinformationen zuzugreifen:

  • Verwenden Sie zur Unterstützung der Fehlerbehandlung die nativen Fehlermechanismen der Skriptsprache, in VBScript z. B. das Err-Objekt (VBScript).
  • Erstellen Sie ein SWbemLastError-Objekt, um einen Fehlerbericht abzurufen.

Das folgende Skript zeigt die Verwendung des nativen Err-Objekts (VBScript). Wenn ein falscher Wert für das Prozesshandle angegeben wird, wird ein Fehler generiert.

On Error Resume Next
Set objProcess = GetObject( _
    "winmgmts:root\cimv2:Win32_Process.Handle='one'")
Wscript.Echo Err.Number

Hinweis

Die Description-Eigenschaft des Err-Objekts (VBScript) ist leer, wenn Sie über den Moniker „winmgmts:“ eine Verbindung mit WMI herstellen. Wenn Sie die Verbindung jedoch über SWbemLocator herstellen, ist die Beschreibung verfügbar.

In der folgenden Tabelle finden Sie die Eigenschaften für das Err-Objekt (VBScript).

Eigenschaft Enthält
Beschreibung
Lokalisierte, lesbare Beschreibung des Fehlers.
Number
HRESULT wird von der Skript-API für WMI zurückgegeben.
Quelle
Identifiziert das Objekt, das den Fehler ausgelöst hat.

Das folgende Skript zeigt die Verwendung eines SWbemLastError-Objekts zum Abrufen detaillierter Fehlerinformationen. Beachten Sie, dass nicht alle Anbieter Informationen zu SWbemLastError liefern. Weitere Informationen zu Fehlercodes in Skripts finden Sie unter WbemErrorEnum.

On Error Resume Next
Set obj = GetObject("winmgmts:root\cimv2:Win32_Process.Handle='one'")
Set LastError = createobject("wbemscripting.swbemlasterror")
Wscript.Echo "Operation = " & LastError.operation & VBCRLF & "ParameterInfo = " _
            & LastError.ParameterInfo & VBCRLF & "ProviderName = " & LastError.ProviderName

Behandeln eines Fehlers mit C++

Eine WMI-Clientanwendung kann entweder COM-spezifische oder WMI-spezifische Fehler empfangen. Die COM-Fehler entsprechen der Struktur von COM-Fehlercodes. Mit Ausnahme der Schnittstellen IWbemContext, IWbemClassObject und IWbemQualifierSet können alle WMI-Schnittstellen einen COM-spezifischen Fehler zurückgeben. Weitere Informationen zu COM-Fehlercodes finden Sie unter Fehlerbehandlung. Auf den Referenzseiten der WMI-Schnittstellen werden die entsprechenden WMI-Fehlercodes im Abschnitt „Fehlercodes“ aufgeführt.

Eine Clientanwendung muss die COM-Standards für die Überprüfung von Status- und Fehlerrückgabecodes befolgen. Der entscheidende Unterschied ist, ob Sie den Fehlercode über einen synchronen, halbsynchronen oder asynchronen Aufruf abrufen möchten.

So greifen Sie mithilfe von C++ auf synchrone und halbsynchrone Fehlermeldungen zu

  1. Rufen Sie die Fehlerinformationen durch einen Aufruf der COM-Funktion GetErrorInfo ab.

    Rufen Sie GetErrorInfo sofort auf, nachdem eine Schnittstellenmethode einen Fehler gemeldet hat. Dies schließt alle IWbemCallResult-Methoden ein, die Sie während der Verarbeitung eines halbsynchronen Prozesses aufrufen.

  2. Untersuchen Sie das zurückgegebene COM-Fehlerobjekt durch einen Aufruf der IErrorInterface::QueryInterface-Methode.

    Stellen Sie sicher, dass Sie im QueryInterface-Aufruf für den Parameter riid den Wert „IID_WbemClassObject“ angeben. Die QueryInterface-Methode gibt eine Instanz einer WMI-Klasse zurück, typischerweise __ExtendedStatus.

WMI stellt das Fehlerobjekt für einen asynchronen Aufruf nicht über GetErrorInfo bereit, da nicht festgestellt werden kann, wann oder in welchem Thread der asynchrone Aufruf erfolgte. Deshalb kann Ihr Code nur bestimmte Fehler behandeln oder das Fehlschlagen des Aufrufs über COM weiterleiten.

Hinweis

Da der Rückruf an die Senke möglicherweise nicht auf der Authentifizierungsebene zurückgegeben wird, die der Client benötigt, empfiehlt es sich, anstelle der asynchronen Kommunikation eine halbsynchrone Kommunikation zu verwenden. Weitere Informationen finden Sie unter Aufrufen einer Methode.

So greifen Sie mithilfe von C++ auf asynchrone Fehlermeldungen zu

  • Rufen Sie das COM-Fehlerobjekt aus Ihrer Implementierung von IWbemObjectSink::SetStatus ab.

    Der folgende Pseudocode zeigt eine typische Implementierung einer Fehlerbehandlung für eine Clientanwendung.

    HRESULT hRes = SomeMethod;
    
    // Check for specific error and status codes.
    if (hRes == WBEM_E_NOT_FOUND)
    {
    // Processing to handle specific error code
    }
    else if hRes == WBEM_S_DUPLICATE_OBJECTS
    {
    // All other cases, including errors specific to COM
    }
    else if (FAILED(hRes))
    {
    
    }