Поделиться через


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

Как и во всех приложениях, 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

Заметка

Свойство описания объекта 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 для проверки состояния и кодов возврата ошибок. Основное различие заключается в том, хотите ли вы получить код ошибки из синхронного, полусинхронного или асинхронного вызова.

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

  1. Получите сведения об ошибке, вызвав функцию GetErrorInfo COM.

    Не забудьте вызвать 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))
    {
    
    }