Abrufen einer WMI-Klasse

Der erste Objekttyp, den Sie abrufen können, ist eine WMI-Klasse. Beim Abrufen einer WMI-Klasse rufen Sie tatsächlich eine Klassendefinition ab, bei der es sich um eine Auflistung der Eigenschaften, Qualifizierer und Methoden handelt, die die Klasse vollständig beschreiben. Eine Klassendefinition ist jedoch im Grunde die Klasse selbst.

PowerShell verwendet eine Standardabfrage, um Klassendefinitionen mithilfe der Klasse meta_class abzurufen.

So rufen Sie eine Klassendefinition in PowerShell ab

  • Verwenden Sie Get-WmiObject mit einer Abfrage von meta_class, wobei die WHERE-Klausel den Namen der abzurufenden Klasse enthält.

    Get-WmiObject -query "SELECT * FROM meta_class WHERE __class = 'Win32_LogicalDisk'"
    

    Get-WmiObject ist das Standard-Cmdlet, das PowerShell zum Abrufen von Klassen- und Instanzinformationen aus WMI verwendet. Die Klasse meta_class definiert die Abfrage als Schemaabfrage. Ohne die Klasse meta_class würde diese Abfrage alle Instanzen von Win32_LogicalDisk zurückgeben. Weitere Informationen zum Abfragen von WMI finden Sie unter SELECT-Anweisung für Schemaabfragen.

Der aktuelle Prozess zum Abrufen einer WMI-Definition in C# besteht darin, die CIMInstance-Klasse zu verwenden.

So rufen Sie eine Klassendefinition in C# (Microsoft.Management.Infrastructure) ab

  1. Erstellen Sie mithilfe des Namespace Microsoft.Management.Infrastructure eine CIMInstance-Klasse mit dem angegebenen Namespace und Klassennamen.

    Die erstellte Klasse enthält alle Klasseninformationen, aber keine Instanzdaten.

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string className = "Win32_LogicalDisk";
    
    CimInstance diskDrive = new CimInstance(className, Namespace);
    
  2. Alternativ können Sie wie bei PowerShell auch eine Abfrage ausführen, indem Sie das Tag meta_class als Teil der Abfrage verwenden.

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string diskDriveQuery = "SELECT * FROM meta_class WHERE __class = 'Win32_LogicalDisk'";
    
    CimSession mySession = CimSession.Create("localhost");
    IEnumerable<CimInstance> queryInstance = mySession.QueryInstances(Namespace, "WQL", diskDriveQuery);
    

Wie bei PowerShell verwendet C# eine meta_class-Abfrage, um Klassendefinitionen abzurufen. Alternativ können Sie ein ManagementClass-Objekt erstellen, um direkt auf die Klassendefinition zuzugreifen.

Hinweis

System.Management war der ursprüngliche .NET-Namespace, der für den Zugriff auf WMI verwendet wurde. Die APIs in diesem Namespace sind jedoch im Allgemeinen langsamer und können im Vergleich zu ihren moderneren Microsoft.Management.Infrastructure-Entsprechungen nicht so gut skaliert werden.

 

So rufen Sie eine Klassendefinition in C# (System.Management) ab

  1. Sie können ManagementObjectSerarcher mit einer Abfrage von meta_class verwenden, wobei die WHERE-Klausel den Namen der abzurufenden Klasse enthält.

    using System.Management;
    ...
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM meta_class WHERE __class = 'Win32_LogicalDisk'");
    ManagementObjectCollection myDiskCollection = searcher.Get();
    

    ManagementObjectSerarcher ist die Standardklasse, mit der .NET Klassen- und Instanzinformationen aus WMI abruft. ManagementObjectSerarcher.Get gibt ein ManagementObjectCollection-Element zurück, das die Schemadefinitionsklasse enthält. Die Klasse meta_class definiert die Abfrage als Schemaabfrage. Ohne die Klasse meta_class würde diese Abfrage alle Instanzen von Win32_LogicalDisk zurückgeben. Weitere Informationen zum Abfragen von WMI finden Sie unter SELECT-Anweisung für Schemaabfragen.

  2. Erstellen Sie alternativ ein neues ManagementClass-Objekt mit dem Namen als Pfad, um die Klasse abzurufen.

    using System.Management;
    ...
    ManagementClass objInst = new ManagementClass("Win32_LogicalDisk");
    

Sie können eine Klassendefinition in VBScript auf ähnliche Weise abrufen wie eine bestimmte Instanz.

So rufen Sie eine Klassendefinition in VBScript ab

  1. Rufen Sie SWbemServices.Get auf, aber identifizieren Sie keine bestimmte Instanz im Objektpfad für die Klasse.

  2. Im folgenden Codebeispiel wird die Klassendefinition für die Klasse abgerufen, die logische Laufwerke auf Ihrem Computer beschreibt:

    Set objinst = GetObject("WinMgmts:Win32_LogicalDisk")
    

    Windows Script Host (WSH) unterstützt außerdem Folgendes:

    <OBJECT id="myLocator" progid="WbemScripting.SWbemLocator"></OBJECT>
    

    Verwenden Sie in Active Server Pages (ASP) GetObject oder CreateObject im serverseitigen Skript. Weitere Informationen finden Sie unter Erstellen von Active Seite Pages für WMI.

  3. Es kann auch eine Klasse oder Instanz angegeben werden. In diesem Fall handelt es sich bei dem zurückgegebenen Objekt um ein WMI-Objekt (etwa eine Instanz von Win32_LogicalDisk) und nicht um ein Dienstobjekt. Beachten Sie, dass Sie die GetObject-Funktionen von VBScript nicht verwenden können, um eine Instanz des generischen Objekts SWbemObject zu erstellen.

  4. Auf HTML-Seiten, die in Microsoft Internet Explorer (IE) ausgeführt werden, können GetObject und CreateObject fehlschlagen, da WMI-Skriptobjekte wie ActiveX-Steuerelemente für die Skripterstellung nicht als sicher markiert sind. Die einzige Ausnahme ist das SWbemDateTime-Objekt. Diese Aufrufe können nur erfolgreich sein, wenn Sie die IE-Sicherheitseinstellungen herabsetzen. Dies wird jedoch nicht empfohlen.

Rufen Sie beim Abrufen einer Klasse in C++ die IWbemServices-Version von GetObject auf.

So rufen Sie eine Klassendefinition in C++ ab

  1. Rufen Sie die Methoden IWbemServices::GetObject oder IWbemServices::GetObjectAsync auf, um die Definition einer Klasse abzurufen.
  2. Eine Klasse kann über mehrere Klassendefinitionen verfügen. Dies ist in der Regel der Fall, wenn mehrere Klassenanbieter in einen Namespace geladen werden. Wenn eine Klasse über mehrere Klassendefinitionen verfügt, gibt WMI die erste ermittelte Definition und den WBEM_S_DUPLICATE_OBJECTS-Statuscode zurück.

Da GetObject eine Klassendefinition zurückgibt, wird sie häufig im ersten Schritt beim Erstellen einer Instanz verwendet. Weitere Informationen zur Verwendung von GetObject finden Sie unter Erstellen und Deklarieren einer Instanz mit C++.