Share via


Récupération d’un code d’erreur

Comme pour toutes les applications, WMI reçoit les codes d’erreur du système d’exploitation Windows.

Lorsque vous recevez un code d’erreur, vous disposez des options suivantes :

  • Examinez le journal d’événements.

    WMI envoie des messages d’erreur au service Event Log qui vérifie les journaux des événements aidant à déterminer la cause d’une erreur. Vous pouvez utiliser les classes que le fournisseur Event Log prend en charge pour accéder aux journaux d’événements par programmation.

  • Récupérez le code d’erreur normalement.

    WMI prend en charge les techniques standard pour récupérer des codes d’erreur, qui sont des codes d’erreur COM pour C++, et des objets d’erreur natifs tels que Err Object (VBScript) ou SWbemLastError si le fournisseur fournit des informations d’erreur.

Pour plus d’informations, consultez Manipulation des informations sur les classes et les instances.

Les sections suivantes seront abordées dans cette rubrique :

Gestion d’une erreur avec VBScript

Si un appel à WMI via l’API de script pour WMI génère une erreur, vous disposez des options suivantes pour accéder aux informations d’erreur :

  • Utilisez des mécanismes d’erreur natifs du langage de script. Par exemple, dans VBScript, utilisez Err Object (VBScript) pour prendre en charge la gestion des erreurs.
  • Créez un objet SWbemLastError pour obtenir un rapport d’erreurs.

Le script suivant montre l’utilisation deErr Object (VBScript). Lorsqu'une valeur incorrecte est donnée pour l'identifiant du processus, une erreur est générée.

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

Notes

La propriété Description de Err Object (VBScript) est vide lors de la connexion à WMI via le moniker « winmgmts: ». Toutefois, si vous vous connectez à l’aide de SWbemLocator, la description est disponible.

Le tableau suivant répertorie les propriétés de Err Object (VBScript).

Propriété Contient
Description
Description de l'erreur à l'intention des utilisateurs.
Nombre
HRESULT retourné par l’API de script pour WMI.
Source
Objet ayant déclenché l'événement.

Le script suivant montre l’utilisation d’un objet SWbemLastError pour obtenir des informations détaillées sur les erreurs. Notez que tous les fournisseurs ne donnent pas d’informations à SWbemLastError. Pour plus d’informations sur les codes d’erreur dans le script, consultez 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

Gestion d’une erreur à l’aide de C++

Une application cliente WMI peut recevoir des erreurs spécifiques à COM ou À WMI. Les erreurs COM sont conformes à la structure des codes d’erreur COM. Toutes les interfaces WMI peuvent retourner une erreur spécifique à COM, à l’exception des interfaces IWbemContext, IWbemClassObject et IWbemQualifierSet. Pour plus d’informations sur les codes d’erreur COM, consultez Gestion des erreurs. Les pages de référence des interfaces WMI répertorient les codes d’erreur WMI appropriés dans la section Codes d’erreur.

Une application cliente doit suivre les normes COM pour la vérification de l’état et des codes de retours d’erreurs. La principale différence que vous devez choisir est de savoir si vous souhaitez récupérer le code d’erreur à partir d’un appel synchrone, semi-synchrone ou asynchrone.

Pour accéder aux messages d’erreur synchrones et semi-synchrones à l’aide de C++

  1. Récupérez les informations d’erreur avec un appel à la fonction COM GetErrorInfo.

    Veillez à appeler GetErrorInfo immédiatement après qu’une méthode d’interface ait indiqué une erreur. Ceci inclut toutes les méthodes IWbemCallResult que vous appelez lors du traitement d’un processus semi-synchrone.

  2. Examinez l’objet d’erreur COM retourné avec un appel à la méthode IErrorInterface::QueryInterface.

    Veillez à spécifier IID_WbemClassObject pour le paramètre riid dans l’appel QueryInterface. La méthode QueryInterface retourne une instance d’une classe WMI, généralement __ExtendedStatus.

WMI ne remet pas l’objet d’erreur via GetErrorInfo pour un appel asynchrone, car il n’existe aucun moyen de savoir quand ou sur quel thread l’appel asynchrone s’est produit. Par conséquent, votre code ne peut gérer que des erreurs spécifiques ou passer l’échec de l’appel via COM.

Notes

Étant donné que le rappel au récepteur peut ne pas être retourné au même niveau d’authentification que celui requis par le client, il est recommandé d’utiliser une communication semi-synchrone plutôt qu’une communication asynchrone. Pour plus d’informations, consultez Appel d’une méthode.

Pour accéder aux messages d’erreur asynchrones à l’aide de C++

  • Récupérez l’objet d’erreur COM à partir de votre implémentation de IWbemObjectSink::SetStatus.

    Le pseudocode suivant montre une implémentation de gestion des erreurs classique pour une application cliente.

    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))
    {
    
    }