SWbemServices.ExecQuery-Methode
Die ExecQuery-Methode des SWbemServices-Objekts führt eine Abfrage aus, um Objekte abzurufen. Diese Objekte sind über die zurückgegebene SWbemObjectSet-Sammlung verfügbar.
Diese Methode wird im halbsynchronen Modus aufgerufen. Weitere Informationen finden Sie unter Aufrufen einer Methode.
Eine Erläuterung dieser Syntax finden Sie unter Dokumentkonventionen für die Skript-API.
Syntax
objWbemObjectSet = .ExecQuery( _
ByVal strQuery, _
[ ByVal strQueryLanguage ], _
[ ByVal iFlags ], _
[ ByVal objWbemNamedValueSet ] _
)
Parameter
-
strQuery
-
Erforderlich. Eine Zeichenfolge, die den Text der Abfrage enthält. Dieser Parameter darf nicht leer sein. Weitere Informationen zum Erstellen von WMI-Abfragezeichenfolgen finden Sie unter Abfragen mit WQL sowie in der Referenz zu WQL.
-
strQueryLanguage [optional]
-
Zeichenfolge, die die zu verwendende Abfragesprache enthält. Wenn angegeben, muss dieser Wert „WQL“ sein.
-
iFlags [optional]
-
Ganze Zahl, die das Verhalten der Abfrage bestimmt und steuert, ob dieser Aufruf sofort abgeschlossen wird. Der Standardwert für diesen Parameter lautet wbemFlagReturnImmediately. Dieser Parameter kann folgende Werte akzeptieren:
-
wbemFlagForwardOnly (32 (0x20))
-
Bewirkt, dass ein Forward-Only-Enumerator zurückgegeben wird. Forward-Only-Enumeratoren sind normalerweise viel schneller und beanspruchen weniger Arbeitsspeicher als herkömmliche Enumeratoren, lassen aber keine Aufrufe von SWbemObject.Clone_ zu.
-
wbemFlagBidirectional (0 (0x0))
-
Bewirkt, dass WMI Zeiger auf Objekte der Enumeration so lange beibehält, bis der Client den Enumerator freigibt.
-
wbemFlagReturnImmediately (16 (0x10))
-
Bewirkt, dass der Aufruf sofort abgeschlossen wird.
-
wbemFlagReturnWhenComplete (0 (0x0))
-
Bewirkt, dass dieser Aufruf so lange blockiert wird, bis die Abfrage abgeschlossen ist. Dieses Flag ruft die Methode im synchronen Modus auf.
-
wbemQueryFlagPrototype (2 (0x2))
-
Wird für die Prototyperstellung verwendet. Dieses Flag verhindert, dass die Abfrage ausgeführt wird, und gibt ein Objekt zurück, das wie ein typisches Ergebnisobjekt aussieht.
-
wbemFlagUseAmendedQualifiers (131072 (0x20000))
-
Bewirkt, dass WMI Klassenänderungsdaten mit der Basisklassendefinition zurückgibt. Weitere Informationen finden Sie unter Lokalisieren von WMI-Klasseninformationen.
objWbemNamedValueSet [optional]
Dies ist in der Regel nicht definiert. Andernfalls handelt es sich um ein SWbemNamedValueSet-Objekt, dessen Elemente die Kontextinformationen darstellen, die von dem Anbieter verwendet werden können, der die Anforderung verarbeitet. Ein Anbieter, der solche Informationen unterstützt oder benötigt, muss die erkannten Wertnamen, den Datentyp des Werts, die zulässigen Werte und die Semantik dokumentieren.
Rückgabewert
Wenn kein Fehler auftritt, gibt diese Methode ein SWbemObjectSet-Objekt zurück. Hierbei handelt es sich um eine Objektsammlung, die das Resultset der Abfrage enthält. Der Aufrufer kann die Sammlung mithilfe der Implementierung von Sammlungen für die von Ihnen verwendete Programmiersprache untersuchen. Weitere Informationen finden Sie unter Zugreifen auf eine WMI-Sammlung.
Fehlercodes
Nach Abschluss der ExecQuery-Methode enthält das Err-Objekt möglicherweise einen der Fehlercodes aus der folgenden Liste:
-
wbemErrAccessDenied – 2147749891 (0x80041003)
-
Der aktuelle Benutzer bzw. die aktuelle Benutzerin verfügt nicht über die erforderlichen Berechtigungen zum Anzeigen des Resultsets.
-
wbemErrFailed – 2147749889 (0x80041001)
-
Unbekannter Fehler.
-
wbemErrInvalidParameter – 2147749896 (0x80041008)
-
Ein ungültiger Parameter wurde angegeben.
-
wbemErrInvalidQuery – 2147749911 (0x80041017)
-
Die Abfragesyntax ist ungültig.
-
wbemErrInvalidQueryType – 2147749912 (0x80041018)
-
Die angeforderte Abfragesprache wird nicht unterstützt.
-
wbemErrOutOfMemory – 2147749894 (0x80041006)
-
Es ist nicht genügend Arbeitsspeicher zum Abschließen des Vorgangs vorhanden.
Bemerkungen
ExecQuery ist einer der am häufigsten verwendeten Aufrufe zum Abrufen von WMI-Informationen. Ein Standardaufruf von ExecQuery sieht wie folgt aus:
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
Beachten Sie, dass Sie das SWbemServices-Objekt mit einem Moniker erstellen, der den passenden Namespace und die entsprechende Sicherheit darstellt, und dann den ExecQuery-Aufruf über den Dienst durchführen. Eine detaillierte Erläuterung finden Sie unter Erstellen eines WMI-Skripts sowie unter WMI-Enumeration.
Die ExecQuery-Methode gibt genau wie die InstancesOf-Methode immer eine SWbemObjectSet-Sammlung zurück. Daher muss Ihr WMI-Skript die von ExecQuery zurückgegebene Sammlung aufzählen, um auf jede Instanz einer verwalteten Ressource in der Sammlung zugreifen zu können, wie hier gezeigt:
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
Andere SWbemServices-Methoden, die SWbemObjectSet zurückgeben, sind AssociatorsOf, ReferencesTo und SubclassesOf.
Die Rückgabe eines leeren Resultsets durch die Abfrage ist kein Fehler. Die ExecQuery-Methode gibt Schlüsseleigenschaften zurück, auch wenn die Schlüsseleigenschaft im strQuery-Argument nicht angefordert wurde. Wenn beim Ausführen dieser Methode ein Fehler auftritt und Sie das Flag wbemFlagReturnImmediately nicht verwenden, wird das Err-Objekt erst festgelegt, wenn Sie versuchen, auf den zurückgegebenen Objektsatz zuzugreifen. Bei Verwendung des Flags wbemFlagReturnWhenComplete wird das Err-Objekt dagegen festgelegt, wenn die ExecQuery-Methode aufgerufen wird.
Es gibt Grenzwerte für die Anzahl von AND- und OR-Schlüsselwörtern, die in WQL-Abfragen verwendet werden können. Wenn in einer komplexen Abfrage eine große Anzahl von WQL-Schlüsselwörtern verwendet wird, gibt WMI möglicherweise den Fehlercode WBEM_E_QUOTA_VIOLATION als HRESULT-Wert zurück. Der Grenzwert für WQL-Schlüsselwörter hängt davon ab, wie komplex die Abfrage ist.
Beispiele
Das folgende VBScript-Codebeispiel sucht alle Datenträger auf dem lokalen Computer und zeigt die Geräte-ID und die Art des Datenträgerlaufwerks an:
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
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) |
Windows Vista |
Unterstützte Mindestversion (Server) |
Windows Server 2008 |
Header |
|
Typbibliothek |
|
DLL |
|
CLSID |
CLSID_SWbemServices |
IID |
IID_ISWbemServices |