Получение кода ошибки

Как и все приложения, WMI получает коды ошибок из операционной системы Windows.

При получении кода ошибки доступны следующие варианты:

  • Просмотрите журнал событий.

    WMI отправляет сообщения об ошибках в службу журналов событий, которая проверяет журналы событий, чтобы определить причину ошибки. Для программного доступа к журналам событий можно использовать классы, поддерживаемые поставщиком журналов событий.

  • Обычно извлекает код ошибки.

    WMI поддерживает стандартные методы извлечения кодов ошибок, которые являются кодами com-ошибок для C++, и собственных объектов ошибок, таких как объект Err (VBScript) или SWbemLastError , если поставщик предоставляет сведения об ошибке.

Дополнительные сведения см. в разделе Управление сведениями о классах и экземплярах.

В этом разделе рассматриваются следующие разделы:

Обработка ошибки с помощью VBScript

Если вызов WMI через API скриптов для WMI вызывает ошибку, вы можете получить доступ к сведениям об ошибке следующим образом:

  • Используйте собственные механизмы ошибок языка сценариев, например, в VBScript используйте объект Err (VBScript) для поддержки обработки ошибок.
  • Создайте объект SWbemLastError , чтобы получить отчет об ошибке.

В следующем скрипте показано использование собственного объекта Err (VBScript). При указании неверного значения дескриптора процесса возникает ошибка.

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

Примечание

Свойство Descriptionобъекта Err (VBScript) пусто при подключении к WMI с помощью моникера "winmgmts:". Однако при подключении с помощью SWbemLocator доступно описание.

В следующей таблице перечислены свойства объекта Err (VBScript).

Свойство Содержит
Описание
Локализованное, доступное для чтения описание ошибки.
Число
HRESULT , возвращенный API скриптов для WMI.
Источник
Идентифицирует объект, который вызвал ошибку.

В следующем сценарии показано использование объекта 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-ошибок. Все интерфейсы WMI могут возвращать ошибки, относящиеся к COM, за исключением интерфейсов IWbemContext, IWbemClassObject и IWbemQualifierSet . Дополнительные сведения о кодах ошибок COM см. в разделе Обработка ошибок. На справочных страницах интерфейсов WMI перечислены соответствующие коды ошибок WMI в разделе Коды ошибок.

Клиентское приложение должно соответствовать стандартам COM для проверки кодов возврата состояния и ошибок. Разница main заключается в том, что вы хотите получить код ошибки из синхронного, полусинхронного или асинхронного вызова.

Доступ к синхронным и полусинхронным сообщениям об ошибках с помощью C++

  1. Получите сведения об ошибке с помощью вызова com-функции GetErrorInfo .

    Обязательно вызовите GetErrorInfo сразу после того, как метод интерфейса указывает на ошибку. Сюда входит любой из методов IWbemCallResult , вызываемых при обработке полусинхронного процесса.

  2. Проверьте возвращенный объект ошибки COM с помощью вызова метода IErrorInterface::QueryInterface .

    Обязательно укажите IID_WbemClassObject для параметра riid в вызове QueryInterface . Метод QueryInterface возвращает экземпляр класса WMI, обычно __ExtendedStatus.

WMI не доставляет объект ошибки через GetErrorInfo для асинхронного вызова, так как невозможно узнать, когда или в каком потоке произошел асинхронный вызов. Таким образом, код может обрабатывать только определенные ошибки или передавать сбой вызова через COM.

Примечание

Так как обратный вызов в приемник может быть возвращен не на том же уровне проверки подлинности, который требуется клиенту, рекомендуется использовать полусинхронный режим вместо асинхронного взаимодействия. Дополнительные сведения см. в разделе Вызов метода .

Доступ к асинхронным сообщениям об ошибках с помощью C++

  • Получите объект ошибки COM из реализации IWbemObjectSink::SetStatus.

    В следующем псевдокоде показана типичная реализация обработки ошибок для клиентского приложения.

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