Метод 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
Wbemdisp.h
Библиотека типов
Wbemdisp.tlb
DLL
Wbemdisp.dll
CLSID
CLSID_SWbemServices
IID
IID_ISWbemServices

См. также раздел

SWbemServices

SWbemServices.Get

Запросы с помощью WQL

Создание скрипта WMI

Перечисление WMI