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, die eine Auflistung der Eigenschaften, Qualifizierer und Methoden ist, die die Klasse vollständig beschreiben. Eine Klassendefinition ist jedoch grundsätzlich die Klasse selbst.

PowerShell verwendet eine Standardabfrage zum Abrufen von Klassendefinitionen mithilfe der meta_class Klasse.

So rufen Sie eine Klassendefinition in PowerShell ab

  • Verwenden Sie das Get-WmiObject mit einer Abfrage zum meta_class, wobei die WHERE-Klausel den Namen der klasse enthält, die Sie abrufen möchten.

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

    Get-WmiObject ist das Standard-Cmdlet PowerShell, mit dem Klassen- und Instanzinformationen aus WMI abgerufen werden. Die meta_class-Klasse definiert die Abfrage als Schemaabfrage. Ohne die meta_class-Klasse 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# ist die Verwendung der CIMInstance-Klasse .

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

  1. Erstellen Sie mithilfe des Microsoft.Management.Infrastructure-Namespaces 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 meta_class-Tag 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 zum Abrufen von Klassendefinitionen. Alternativ können Sie ein ManagementClass-Objekt erstellen, um direkt auf die Klassendefinition zuzugreifen.

Hinweis

System.Management war der ursprüngliche .NET-Namespace, der zum Zugriff auf WMI verwendet wurde; Die APIs in diesem Namespace sind jedoch im Allgemeinen langsamer und skalieren nicht auch relativ zu ihren moderneren Microsoft.Management.Infrastructure-Gegenstücken .

 

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

  1. Sie können das ManagementObjectSerarcher mit einer Abfrage verwenden, um meta_class zu meta_class, wobei die WHERE-Klausel den Namen der Klasse enthält, die Sie abrufen möchten.

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

    ManagementObjectSerarcher ist die Standardklasse .NET, um Klassen- und Instanzinformationen aus WMI abzurufen. ManagementObjectSerarcher.Get gibt eine ManagementObjectCollection zurück, die die Schemadefinitionsklasse enthält. Die meta_class-Klasse definiert die Abfrage als Schemaabfrage. Ohne die meta_class Klasse 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, um eine bestimmte Instanz abzurufen.

So rufen Sie eine Klassendefinition in VBScript ab

  1. Rufen Sie SWbemServices.Get auf, identifizieren jedoch 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 Skripthost (WSH) unterstützt auch folgendes.

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

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

  3. Eine Klasse oder Instanz kann auch angegeben werden, in diesem Fall ist das zurückgegebene Objekt ein WMI-Objekt, z. B. eine Instanz von Win32_LogicalDisk anstelle eines Dienstobjekts. Beachten Sie, dass Sie die VBScript-GetObject-Funktionen nicht verwenden können, um eine Instanz des generischen Objekts SWbemObject zu erstellen.

  4. In HTML-Seiten, die in Microsoft Internet Explorer (IE) ausgeführt werden, kann GetObject und CreateObject fehlschlagen, da WMI-Skriptobjekte wie ActiveX-Steuerelemente nicht als sicher für skripting gekennzeichnet sind. Die einzige Ausnahme ist das SWbemDateTime-Objekt . Die einzige Möglichkeit, wie diese Anrufe erfolgreich sein können, ist, wenn Sie die IE-Sicherheitseinstellungen verringern, die nicht empfohlen werden.

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 IWbemServices::GetObject- oder IWbemServices::GetObjectAsync-Methoden auf, um die Definition einer Klasse abzurufen.
  2. Eine Klasse kann mehrere Klassendefinitionen aufweisen, die normalerweise auftreten, wenn Sie mehrere Klassenanbieter in einen Namespace geladen haben. Wenn eine Klasse mehrere Klassendefinitionen aufweist, gibt WMI die erste gefundene Definition und den WBEM_S_DUPLICATE_OBJECTS Statuscode zurück.

Da GetObject eine Klassendefinition zurückgibt, wird es häufig als erster Schritt zum Erstellen einer Instanz verwendet. Weitere Informationen zum Verwenden von GetObject finden Sie unter Erstellen und Deklarieren einer Instanz mit C++.