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


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

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

SWbemServices

SWbemServices.Get

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

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

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