Récupération d’un code d’erreur
comme avec 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 des événements.
WMI envoie des messages d’erreur au service journal des événements qui vérifie les journaux des événements pour déterminer la cause d’une erreur. Vous pouvez utiliser les classes prises en charge par le fournisseur de journaux des événements pour accéder aux journaux des événements par programmation.
Récupérez le code d’erreur normalement.
WMI prend en charge les techniques standard pour récupérer les 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 sur l’erreur.
Pour plus d’informations, consultez manipulation d’informations sur les classes et les instances.
Les sections suivantes sont présentées dans cette rubrique :
Gestion d’une erreur avec VBScript
Si un appel à WMI par le biais de l’API de script pour WMI provoque 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 recevoir un rapport d’erreurs.
Le script suivant illustre l’utilisation de l' objet Native Err (VBScript). Lorsqu’une valeur incorrecte pour le handle de processus est spécifiée, 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 l' objet Err (VBScript) est vide lors de la connexion à WMI par le biais du 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 l' objet Err (VBScript).
| Propriété | Contient |
|---|---|
| Description |
Description localisée et explicite de l’erreur. |
| Nombre |
HRESULT retourné par l’API de script pour WMI. |
| Source |
Identifie l’objet qui a déclenché l’erreur. |
Le script suivant illustre l’utilisation d’un objet SWbemLastError pour obtenir des informations détaillées sur l’erreur. Notez que tous les fournisseurs ne fournissent 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, IWbemClassObjectet 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 vérifier l’État et les codes de retour d’erreur. 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++
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 indique une erreur. Cela comprend l’une des méthodes IWbemCallResult que vous appelez lors du traitement d’un processus semi-synchrone.
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 peut uniquement gérer des erreurs spécifiques ou passer l’échec de l’appel par le biais de 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 le mode semi-synchrone au lieu de la 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 pseudo-code suivant illustre une implémentation de gestion des erreurs typique 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)) { }