SELECT-Anweisung für Schemaabfragen
Abfragen von Schemadaten verwenden die SELECT-Anweisung mit einer Syntax, die der für Datenabfragen ähnlich ist. Der Unterschied besteht in der Verwendung einer speziellen Klasse namens "meta_class", die die Abfrage als Schemaabfrage identifiziert.
Im folgenden Beispiel werden alle Klassendefinitionen im aktuellen Namespace angefordert.
SELECT * FROM meta_class
Schemaabfragen unterstützen nur "*". Um den Bereich der zurückgegebenen Definitionen einzugrenzen, kann ein Anbieter eine WHERE-Klausel hinzufügen, die eine bestimmte Klasse angibt.
Das folgende Beispiel zeigt, wie Sie eine WHERE-Klausel hinzufügen, um eine bestimmte Klasse anzugeben.
SELECT * FROM meta_class WHERE __this ISA "Win32_LogicalDisk"
Die spezielle Eigenschaft namens __this identifiziert die Zielklasse für eine Schemaabfrage. Beachten Sie, dass der ISA-Operator mit der Eigenschaft __this verwendet werden muss, um Definitionen für die Unterklassen der Zielklasse anzufordern. Die vorherige Abfrage gibt die Definition für die Klasse Win32_LogicalDisk und Definitionen für alle zugehörigen Unterklassen zurück.
Im folgenden Beispiel wird gezeigt, wie eine Klassendefinition für eine einzelne Klasse mithilfe der Systemeigenschaft __Class angefordert wird.
SELECT * FROM meta_class WHERE __Class = "Win32_LogicalDisk"
Diese Abfrage entspricht dem Aufrufen von IWbemServices::GetObject oder der Methode IWbemServices::GetObjectAsync, wobei der Parameter object path auf "Win32_LogicalDisk" festgelegt ist.
Im folgenden VBScript-Codebeispiel werden alle untergeordneten Klassen einer WMI-Klasse der obersten Ebene abgerufen. Die WMI-Systemeigenschaft __Dynasty enthält den Namen der Klasse der obersten Ebene, von der eine Klasse abgeleitet wird, mit der Sie alle Klassen in einem Namespace abrufen können, der von einer Klasse der obersten Ebene abgeleitet ist, einschließlich dieser Klasse.
' Retrieve immediate child classes for Cim_DataFile
Set objWmi = GetObject ("winmgmts:root\cimv2")
Set colClasses = objWmi.ExecQuery _
("Select * From meta_class " _
& "Where __Dynasty = 'Win32_CurrentTime'")
For Each objClass In colClasses
WScript.Echo objClass.SystemProperties_("__Class")
Next
Das folgende VBScript ruft eine unmittelbar untergeordnete Klasse für eine WMI-Klasse ab.
' Retrieve immediate child classes for Cim_DataFile
Set objWmi = GetObject ("winmgmts:root\cimv2")
Set colClasses = objWmi.ExecQuery _
("Select * From meta_class " _
& "Where __Superclass = 'Cim_DataFile'")
For Each objClass In colClasses
WScript.Echo objClass.SystemProperties_("__Class")
Next
Mit dem folgenden VBScript werden Klassen der obersten Ebene abgerufen. Für alle Klassen der obersten Ebene in einem WMI-Namespace ist die Systemeigenschaft __Superclass Null. Daher ist es möglich, die Klassen der obersten Ebene abzurufen, indem Sie nach einer Null-Superklasse suchen.
Retrieve top level classes in root\cimv2
Set objWmi = GetObject ("winmgmts:root\cimv2")
Set colClasses = objWmi.ExecQuery _
("Select * From meta_class Where __Superclass Is Null")
For Each objClass In colClasses
WScript.Echo objClass.SystemProperties_("__Class")