Método SWbemServices.ExecQuery

El método ExecQuery del objeto SWbemServices ejecuta una consulta para recuperar objetos. Estos objetos están disponibles a través de la colección SWbemObjectSet devuelta.

Se llama a este método en el modo semisincrónico. Para más información, vea Llamada a un método.

Para obtener una explicación de esta sintaxis, vea Convenciones de documentación para la API de scripting.

Sintaxis

objWbemObjectSet = .ExecQuery( _
  ByVal strQuery, _
  [ ByVal strQueryLanguage ], _
  [ ByVal iFlags ], _
  [ ByVal objWbemNamedValueSet ] _
)

Parámetros

strQuery

Necesario. Cadena que contiene el texto de la consulta. Este parámetro no puede estar en blanco. Para más información sobre la creación de cadenas de consulta WMI, vea Consulta con WQL y la referencia WQL.

strQueryLanguage [opcional]

Cadena que contiene el lenguaje de consulta que se va a usar. Si se especifica, este valor debe ser "WQL".

iFlags [opcional]

Entero que determina el comportamiento de la consulta y determina si esta llamada se devuelve inmediatamente. El valor predeterminado de este parámetro es wbemFlagReturnImmediately. Este parámetro puede aceptar los valores siguientes.

wbemFlagForwardOnly (32 (0x20))

Provoca la devolución de un enumerador de solo avance. Los enumeradores de solo avance suelen ser mucho más rápidos y usan menos memoria que los enumeradores convencionales, pero no permiten llamadas a SWbemObject.Clone_.

wbemFlagBidirectional (0 (0x0))

Hace que WMI conserve los punteros a objetos de la enumeración hasta que el cliente libere el enumerador.

wbemFlagReturnImmediately (16 (0x10))

Hace que la llamada se devuelva inmediatamente.

wbemFlagReturnWhenComplete (0 (0x0))

Hace que esta llamada se bloquee hasta que se complete la consulta. Esta marca llama al método en el modo sincrónico.

wbemQueryFlagPrototype (2 (0x2))

Se usa para la creación de prototipos. Esta marca impide que se produzca la consulta y devuelve un objeto similar a un objeto de resultado típico.

wbemFlagUseAmendedQualifiers (131072 (0x20000))

Hace que WMI devuelva datos de modificación de clase con la definición de clase base. Para más información, vea Localización de información de clases WMI.

objWbemNamedValueSet [opcional]

Normalmente, esto no está definido. De lo contrario, se trata de un objeto SWbemNamedValueSet cuyos elementos representan la información de contexto que puede usar el proveedor que atiende la solicitud. Un proveedor que admita o necesite esa información debe documentar los nombres de valor reconocidos, el tipo de datos del valor, los valores permitidos y la semántica.

Valor devuelto

Si no se produce ningún error, este método devuelve un objeto SWbemObjectSet. Se trata de una colección de objetos que contiene el conjunto de resultados de la consulta. El autor de la llamada puede examinar la colección mediante la implementación de colecciones para el lenguaje de programación que está usando. Para más información, vea Acceso a una colección.

Códigos de error

Después de completar el método ExecQuery, el objeto Err puede contener uno de los códigos de error de la lista siguiente.

wbemErrAccessDenied: 2147749891 (0x80041003)

El usuario actual no tiene el permiso para ver el conjunto de resultados.

wbemErrFailed: 2147749889 (0x80041001)

Error no especificado.

wbemErrInvalidParameter: 2147749896 (0x80041008)

Se ha especificado un parámetro no válido.

wbemErrInvalidQuery: 2147749911 (0x80041017)

La sintaxis de la consulta no es válida.

wbemErrInvalidQueryType: 2147749912 (0x80041018)

El lenguaje de la consulta solicitada no se admite.

wbemErrOutOfMemory: 2147749894 (0x80041006)

No hay suficiente memoria para completar la operación.

Comentarios

ExecQuery es una de las llamadas más usadas para recuperar información de WMI. Una llamada estándar a ExecQuery tiene el siguiente aspecto:

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

Tenga en cuenta que crea el objeto SWbemServices con un moniker que representa el espacio de nombres y la seguridad adecuados y, a continuación, realiza la llamada execQuery a través del servicio. Para obtener una explicación más completa, vea Crear un script WMI y Enumerar WMI.

Al igual que el método InstancesOf, el método ExecQuery siempre devuelve una colección SWbemObjectSet. Por lo tanto, su script WMI debe enumerar la colección que devuelve ExecQuery para acceder a cada instancia de recurso administrado de la colección, como se muestra aquí:

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

Otros métodos SWbemServices que devuelven un SWbemObjectSet son AssociatorsOf, ReferencesTo y SubclassesOf.

No es un error que la consulta devuelva un conjunto de resultados vacío. El método ExecQuery devuelve propiedades clave tanto si se solicita la propiedad clave en el argumento strQuery como si no. Si se produce un error al ejecutar este método y no se usa la marca wbemFlagReturnImmediately, el objeto Err no se establece hasta que se intenta obtener acceso al conjunto de objetos devuelto. Sin embargo, si usa la marca wbemFlagReturnWhenComplete, el objeto Err se establece cuando se llama al método ExecQuery.

Existe un límite en el número de palabras clave AND y OR que pueden utilizarse en las consultas WQL. Un gran número de palabras clave WQL utilizadas en una consulta compleja puede hacer que WMI devuelva el código de error WBEM_E_QUOTA_VIOLATION como valor HRESULT. El límite de palabras clave WQL que pueda usarse dependerá de la complejidad de la consulta.

Ejemplos

En el siguiente ejemplo de código vbScript se localizan todas las unidades de disco del equipo local y se muestra el identificador del dispositivo y el tipo de unidad de disco.

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

Requisitos

Requisito Value
Cliente mínimo compatible
Windows Vista
Servidor mínimo compatible
Windows Server 2008
Encabezado
Wbemdisp.h
Biblioteca de tipos
Wbemdisp.tlb
Archivo DLL
Wbemdisp.dll
CLSID
CLSID_SWbemServices
IID
IID_ISWbemServices

Consulte también

SWbemServices

SWbemServices.Get

Consulta con WQL

Creación de un script de WMI

Enumeración de WMI