Récupération d’une classe WMI

Le premier type d’objet que vous pouvez récupérer est une classe WMI. Lors de la récupération d’une classe WMI, vous récupérez en fait une définition de classe, qui est une liste des propriétés, des qualificateurs et des méthodes qui décrivent entièrement la classe. Toutefois, une définition de classe est essentiellement la classe elle-même.

PowerShell utilise une requête standard pour récupérer des définitions de classe à l’aide de la classe meta_class .

Pour récupérer une définition de classe dans PowerShell

  • Utilisez Get-WmiObject avec une requête pour meta_class, avec la clause WHERE contenant le nom de la classe avec laquelle vous devez récupérer.

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

    Get-WmiObject est l’applet de commande Standard utilisée par PowerShell pour récupérer des informations de classe et d’instance à partir de WMI. La classe meta_class définit la requête en tant que requête de schéma. Sans la classe meta_class , cette requête retourne toutes les instances de Win32_LogicalDisk. Pour plus d’informations sur l’interrogation de WMI, consultez l’instruction SELECT pour les requêtes de schéma.

Le processus actuel de récupération d’une définition WMI en C# consiste à utiliser la classe CIMInstance .

Pour récupérer une définition de classe en C# (Microsoft.Management.Infrastructure)

  1. À l’aide de l’espace de noms Microsoft.Management.Infrastructure , créez une classe CIMInstance avec l’espace de noms et le nom de classe spécifiés.

    La classe créée contient toutes les informations de classe, mais aucune donnée d’instance.

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string className = "Win32_LogicalDisk";
    
    CimInstance diskDrive = new CimInstance(className, Namespace);
    
  2. Vous pouvez également effectuer une requête, comme avec PowerShell, à l’aide de la balise meta_class dans le cadre de la requête.

    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);
    

Comme avec PowerShell, C# utilise une requête meta_class pour récupérer des définitions de classe. Vous pouvez également créer un objet ManagementClass pour accéder directement à la définition de classe.

Notes

System.Management était l’espace de noms .NET d’origine utilisé pour accéder à WMI ; Toutefois, les API de cet espace de noms sont généralement plus lentes et ne sont pas également mises à l’échelle par rapport à leurs équivalents microsoft.Management.Infrastructure plus modernes.

 

Pour récupérer une définition de classe en C# (System.Management)

  1. Vous pouvez utiliser ManagementObjectSerarcher avec une requête pour meta_class, avec la clause WHERE contenant le nom de la classe avec laquelle vous souhaitez récupérer.

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

    ManagementObjectSerarcher est la classe .NET standard utilisée pour récupérer des informations de classe et d’instance à partir de WMI. ManagementObjectSerarcher.Get retourne un ManagementObjectCollection qui contient la classe de définition de schéma. La classe meta_class définit la requête en tant que requête de schéma. Sans la classe meta_class , cette requête retourne toutes les instances de Win32_LogicalDisk. Pour plus d’informations sur l’interrogation de WMI, consultez l’instruction SELECT pour les requêtes de schéma.

  2. Vous pouvez également créer un objet ManagementClass , avec le nom comme chemin d’accès, pour récupérer la classe.

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

Vous pouvez récupérer une définition de classe dans VBScript de la même façon que pour récupérer une instance spécifique.

Pour récupérer une définition de classe dans VBScript

  1. Appelez SWbemServices.Get , mais n’identifiez pas une instance spécifique dans le chemin d’accès de l’objet pour la classe.

  2. L’exemple de code suivant récupère la définition de classe de la classe qui décrit les lecteurs logiques sur votre ordinateur.

    Set objinst = GetObject("WinMgmts:Win32_LogicalDisk")
    

    Windows’hôte de script (WSH) prend également en charge les éléments suivants.

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

    Sur les pages Active Server (ASP), utilisez GetObject ou CreateObject dans le script côté serveur. Pour plus d’informations, consultez Création de pages de serveur active pour WMI.

  3. Une classe ou une instance peut également être spécifiée, auquel cas l’objet retourné est un objet WMI, par exemple une instance de Win32_LogicalDisk, plutôt qu’un objet de services. Notez que vous ne pouvez pas utiliser les fonctions GetObject VBScript pour créer une instance de l’objet générique SWbemObject.

  4. Dans les pages HTML s’exécutant dans Microsoft Internet Explorer (IE), GetObject et CreateObject peuvent échouer, car les objets de script WMI, tels que les contrôles ActiveX, ne sont pas marqués comme sécurisés pour l’écriture de scripts. L’une des exceptions est l’objet SWbemDateTime . La seule façon dont ces appels peuvent réussir est lorsque vous réduisez les paramètres de sécurité Internet Explorer, ce qui n’est pas recommandé.

Lors de la récupération d’une classe en C++, appelez la version IWbemServices de GetObject.

Pour récupérer une définition de classe en C++

  1. Appelez les méthodes IWbemServices::GetObject ou IWbemServices::GetObjectAsync pour récupérer la définition d’une classe.
  2. Une classe peut avoir plusieurs définitions de classe, ce qui se produit généralement lorsque vous avez plusieurs fournisseurs de classes chargés dans un espace de noms. Lorsqu’une classe a plusieurs définitions de classe, WMI retourne la première définition découverte et le code d’état WBEM_S_DUPLICATE_OBJECTS .

Étant donné que GetObject retourne une définition de classe, elle est couramment utilisée comme première étape de création d’une instance. Pour plus d’informations sur l’utilisation de GetObject, consultez Création et déclaration d’une instance à l’aide de C++.