Метод 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)
-
Недостаточно памяти для завершения операции.
Remarks
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 |
Header |
|
Библиотека типов |
|
DLL |
|
CLSID |
CLSID_SWbemServices |
IID |
IID_ISWbemServices |