擷取錯誤碼

如同所有應用程式,WMI 會從 Windows 作業系統收到錯誤碼。

當您收到錯誤碼時,您有下列選項:

  • 查看事件記錄檔。

    WMI 會將錯誤訊息傳送至事件記錄服務,以檢查事件記錄檔,以協助判斷錯誤的原因。 您可以使用 事件記錄 提供者支援的類別,以程式設計方式存取事件記錄。

  • 通常擷取錯誤碼。

    WMI 支援標準技術來擷取錯誤碼,也就是 C++ 的 COM 錯誤碼,以及原生錯誤物件,例如 Err 物件 (VBScript) SWbemLastError ,如果提供者提供錯誤資訊。

如需詳細資訊,請參閱 操作類別和實例資訊

本主題將討論下列各節:

使用 VBScript 處理錯誤

如果透過 WMI 的腳本 API 呼叫 WMI 會造成錯誤,您有下列選項可存取錯誤資訊:

下列腳本示範如何使用原生 Err 物件 (VBScript) 。 當指定進程控制碼的不正確值時,會產生錯誤。

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

注意

透過 「winmgmts:」 Moniker 連線到 WMI 時,Err Object (VBScript) 的 Description屬性是空的。 不過,如果您使用 SWbemLocator 進行連線,則可以使用描述。

下表列出 Err Object (VBScript) 的屬性。

屬性 包含
說明
當地語系化、人類看得懂的錯誤描述。
Number
WMI 腳本 API 所傳回的HRESULT
來源
識別引發錯誤的 物件。

下列腳本示範如何使用 SWbemLastError 物件來取得詳細的錯誤資訊。 請注意,並非所有提供者都會提供資訊給 SWbemLastError。 如需腳本中錯誤碼的詳細資訊,請參閱 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

使用 C++ 處理錯誤

WMI 用戶端應用程式可以接收 COM 特定或 WMI 特定錯誤。 COM 錯誤符合 COM 錯誤碼的結構。 除了 IWbemCoNtextIWbemClassObjectIWbemQualifierSet 介面以外,所有 WMI 介面都可以傳回 COM 特定的錯誤。 如需 COM 錯誤碼的詳細資訊,請參閱 錯誤處理。 WMI 介面的參考頁面會在 [錯誤碼] 區段中列出適當的 WMI 錯誤碼。

用戶端應用程式必須遵循 COM 標準來檢查狀態和錯誤傳回碼。 您必須選擇的主要差異是您想要從同步、半同步或非同步呼叫擷取錯誤碼。

使用 C++ 存取同步和半同步錯誤訊息

  1. 使用 呼叫 GetErrorInfo COM 函式來擷取錯誤資訊。

    請務必在介面方法指出錯誤之後立即呼叫 GetErrorInfo 。 這包括您在處理半同步處理常式時呼叫的任何 IWbemCallResult 方法。

  2. 檢查傳回的 COM 錯誤物件,並呼叫 IErrorInterface::QueryInterface 方法。

    請務必在QueryInterface呼叫中指定riid參數的IID_WbemClassObject。 QueryInterface方法會傳回 WMI 類別的實例,通常__ExtendedStatus

WMI 不會透過 GetErrorInfo 傳遞錯誤物件以進行非同步呼叫,因為無法知道非同步呼叫的時機或發生執行緒。 因此,您的程式碼只能處理特定錯誤,或透過 COM 傳遞呼叫失敗。

注意

由於對接收的回呼可能不會在用戶端所需的相同驗證層級傳回,因此建議您使用半同步而非非同步通訊。 如需詳細資訊,請參閱 呼叫方法

使用 C++ 存取非同步錯誤訊息

  • IWbemObjectSink::SetStatus實作擷取 COM 錯誤物件。

    下列虛擬程式碼顯示用戶端應用程式的一般錯誤處理實作。

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