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 |
|
Biblioteca de tipos |
|
Archivo DLL |
|
CLSID |
CLSID_SWbemServices |
IID |
IID_ISWbemServices |