Получение кода ошибки
Как и все приложения, 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++
Получите сведения об ошибке с помощью вызова com-функции GetErrorInfo .
Обязательно вызовите GetErrorInfo сразу после того, как метод интерфейса указывает на ошибку. Сюда входит любой из методов IWbemCallResult , вызываемых при обработке полусинхронного процесса.
Проверьте возвращенный объект ошибки 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)) { }