Метод SWbemServices.ExecQuery
Метод ExecQuery объекта SWbemServices выполняет запрос для получения объектов. Эти объекты доступны через возвращенную коллекцию SWbemObjectSet .
Этот метод вызывается в полусинхронном режиме. Дополнительные сведения см. в разделе Вызов метода .
Описание этого синтаксиса см. в разделе Соглашения о документах для API сценариев.
Синтаксис
objWbemObjectSet = .ExecQuery( _
ByVal strQuery, _
[ ByVal strQueryLanguage ], _
[ ByVal iFlags ], _
[ ByVal objWbemNamedValueSet ] _
)
Параметры
-
strQuery
-
Обязательный. Строка, содержащая текст запроса. Этот параметр не может быть пустым. Дополнительные сведения о создании строк запросов WMI см. в разделах Запросы с помощью WQL и Справочник по WQL .
-
strQueryLanguage [необязательно]
-
Строка, содержащая используемый язык запросов. Если он указан, это значение должно быть WQL.
-
iFlags [необязательно]
-
Целое число, которое определяет поведение запроса и определяет, возвращается ли этот вызов немедленно. Значение по умолчанию для этого параметра — wbemFlagReturnImmediately. Этот параметр может принимать следующие значения.
-
wbemFlagForwardOnly (32 (0x20))
-
Возвращает перечислитель только для прямого доступа. Перечислители только вперед обычно выполняются гораздо быстрее и используют меньше памяти, чем обычные перечислители, но не разрешают вызовы SWbemObject.Clone_.
-
wbemFlagBidirectional (0 (0x0))
-
Заставляет WMI сохранять указатели на объекты перечисления до тех пор, пока клиент не отпустит перечислитель.
-
wbemFlagReturnImmediately (16 (0x10))
-
Вызывает немедленный возврат вызова.
-
wbemFlagReturnWhenComplete (0 (0x0))
-
Вызывает блокировку этого вызова до завершения запроса. Этот флаг вызывает метод в синхронном режиме.
-
wbemQueryFlagPrototype (2 (0x2))
-
Используется для создания прототипов. Этот флаг останавливает выполнение запроса и возвращает объект, который выглядит как типичный результирующий объект.
-
wbemFlagUseAmendedQualifiers (131072 (0x20000))
-
Заставляет WMI возвращать данные о поправках класса с определением базового класса. Дополнительные сведения см. в разделе Локализация сведений о классе WMI.
objWbemNamedValueSet [необязательно]
Как правило, это не определено. В противном случае это объект SWbemNamedValueSet , элементы которого представляют сведения контекста, которые могут использоваться поставщиком, обслуживающим запрос. Поставщик, поддерживающий или требующий таких сведений, должен документировать имена распознаваемых значений, тип данных значения, допустимые значения и семантику.
Возвращаемое значение
Если ошибки не возникает, этот метод возвращает объект SWbemObjectSet . Это коллекция объектов, содержащая результирующий набор запроса. Вызывающий объект может проверить коллекцию, используя реализацию коллекций для используемого языка программирования. Дополнительные сведения см. в разделе Доступ к коллекции.
Коды ошибок
После завершения метода ExecQuery объект Err может содержать один из кодов ошибок в следующем списке.
-
wbemErrAccessDenied — 2147749891 (0x80041003)
-
Текущий пользователь не имеет разрешения на просмотр результирующих наборов.
-
wbemErrFailed — 2147749889 (0x80041001)
-
Незаданная ошибка.
-
wbemErrInvalidParameter — 2147749896 (0x80041008)
-
Указан недопустимый параметр.
-
wbemErrInvalidQuery — 2147749911 (0x80041017)
-
Недопустимый синтаксис запроса.
-
wbemErrInvalidQueryType — 2147749912 (0x80041018)
-
Запрошенный язык запросов не поддерживается.
-
wbemErrOutOfMemory — 2147749894 (0x80041006)
-
Недостаточно памяти для завершения операции.
Комментарии
ExecQuery является одним из наиболее часто используемых вызовов для получения сведений О WMI. Стандартный вызов ExecQuery выглядит следующим образом:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServices = objWMIService.ExecQuery ("Select * from Win32_Service where Name='Alerter'")
For Each objService in colServices
Return = objService.StopService()
If Return <> 0 Then
Wscript.Echo "Failed " &VBNewLine & "Error code = " & Return
Else
WScript.Echo "Succeeded"
End If
Next
Обратите внимание, что вы создаете объект SWbemServices с моникером, представляющим соответствующее пространство имен и безопасность, а затем выполняете вызов ExecQuery через службу. Более подробное обсуждение см. в разделах Создание скрипта WMI и Перечисление WMI.
Как и метод InstancesOf , метод ExecQuery всегда возвращает коллекцию SWbemObjectSet . Таким образом, скрипт WMI должен перечислить возвращаемую коллекцию ExecQuery, чтобы получить доступ к каждому экземпляру управляемого ресурса в коллекции, как показано ниже:
strComputer = "."
Set objSWbemServices = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colSWbemObjectSet = objSWbemServices.ExecQuery _
("SELECT * FROM Win32_Service")
For Each objSWbemObject In colSWbemObjectSet
Wscript.Echo "Name: " & objSWbemObject.Name
Next
Другие методы SWbemServices , возвращающие SWbemObjectSet , включают AssociatorsOf, ReferencesTo и SubclassesOf.
Запрос не возвращает пустой результирующий набор. Метод ExecQuery возвращает свойства ключа независимо от того, запрашивается ли свойство ключа в аргументе strQuery . Если при выполнении этого метода возникает ошибка и вы не используете флаг wbemFlagReturnImmediately , объект Err не устанавливается, пока не будет предпринята попытка получить доступ к возвращенным набору объектов. Однако при использовании флага wbemFlagReturnWhenComplete объект Err устанавливается при вызове метода ExecQuery .
Существуют ограничения на количество ключевых слов AND и OR , которые можно использовать в WQL-запросах. Большое количество ключевых слов WQL, используемых в сложном запросе, может привести к тому, что WMI возвращает код ошибки WBEM_E_QUOTA_VIOLATION в качестве значения HRESULT . Ограничение ключевых слов WQL зависит от сложности запроса.
Примеры
В следующем примере кода VBScript показано, как найти все диски на локальном компьютере и отобразить идентификатор устройства и тип диска.
Set colDisks = GetObject( _
"Winmgmts:").ExecQuery("Select * from Win32_LogicalDisk")
For Each objDisk in colDisks
Select Case objDisk.DriveType
Case 1
Wscript.Echo "No root directory. Drive type could not be determined."
Case 2
Wscript.Echo "DeviceID= "& objDisk.DeviceID & " DriveType = Removable drive"
Case 3
Wscript.Echo "DeviceID= "& objDisk.DeviceID & " DriveType = Local hard disk"
Case 4
Wscript.Echo "DeviceID= "& objDisk.DeviceID & " DriveType = Network disk"
Case 5
Wscript.Echo "DeviceID= "& objDisk.DeviceID & " DriveType = Compact disk"
Case 6
Wscript.Echo "DeviceID= "& objDisk.DeviceID & " DriveType = RAM disk"
Case Else
Wscript.Echo "Drive type could not be determined."
End Select
Next
Требования
Требование | Значение |
---|---|
Минимальная версия клиента |
Windows Vista |
Минимальная версия сервера |
Windows Server 2008 |
Заголовок |
|
Библиотека типов |
|
DLL |
|
CLSID |
CLSID_SWbemServices |
IID |
IID_ISWbemServices |