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, qualificateurs et 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, en utilisant 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 à récupérer.
Get-WmiObject -query "SELECT * FROM meta_class WHERE __class = 'Win32_LogicalDisk'"
Get-WmiObject est l’applet de commande standard que PowerShell utilise 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 retournerait toutes les instances de Win32_LogicalDisk. Pour plus d’informations sur l’interrogation de WMI, consultez 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)
En utilisant 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);
Comme avec PowerShell, vous pouvez également exécuter une requête, en utilisant l’étiquette 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 mises à l’échelle aussi bien par rapport à leurs équivalents Microsoft.Management.Infrastructure plus modernes.
Pour récupérer une définition de classe en C# (System.Management)
Vous pouvez utiliser ManagementObjectSerarcher avec une requête pour meta_class, avec la clause WHERE contenant le nom de la classe à 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 standard que .NET utilise pour récupérer des informations de classe et d’instance à partir de WMI. ManagementObjectSerarcher.Get retourne une 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 retournerait toutes les instances de Win32_LogicalDisk. Pour plus d’informations sur l’interrogation de WMI, consultez Instruction SELECT pour les requêtes de schéma.
Vous pouvez également créer un objet ManagementClass, dont le nom fait office de chemin, 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 en VBScript de la même manière que pour récupérer une instance spécifique.
Pour récupérer une définition de classe en VBScript
Appelez SWbemServices.Get, mais sans identifier d’instance spécifique dans le chemin de l’objet pour la classe.
L’exemple de code suivant récupère la définition de classe pour la classe qui décrit les lecteurs logiques sur votre ordinateur.
Set objinst = GetObject("WinMgmts:Win32_LogicalDisk")
Windows Script Host (WSH) prend également en charge les éléments suivants.
<OBJECT id="myLocator" progid="WbemScripting.SWbemLocator"></OBJECT>
Dans ASP (Active Server Pages), utilisez GetObject ou CreateObject dans le script côté serveur. Pour plus d’informations, consultez Création de pages ASP pour WMI.
Une classe ou 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 services. Notez que vous ne pouvez pas utiliser les fonctions GetObject VBScript pour créer une instance de l’objet générique SWbemObject.
Dans les pages HTML exécutées dans Microsoft Internet Explorer (IE), GetObject et CreateObject peuvent échouer, car les objets de script WMI, comme les contrôles ActiveX, ne sont pas marqués comme sûrs pour les scripts. La seule exception est l’objet SWbemDateTime. La seule façon de réussir ces appels consiste à réduire les paramètres de sécurité d’Internet Explorer, ce qui n’est pas recommandé.
Quand vous récupérez une classe en C++, appelez la version IWbemServices de GetObject.
Pour récupérer une définition de classe en C++
- Appelez les méthodes IWbemServices::GetObject ou IWbemServices::GetObjectAsync pour récupérer la définition d’une classe.
- Une classe peut avoir plusieurs définitions de classe, ce qui se produit généralement quand plusieurs fournisseurs de classes sont chargés dans un espace de noms. Quand 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, il est couramment utilisé comme première étape de la création d’une instance. Pour plus d’informations sur l’utilisation de GetObject, consultez Création et déclaration d’une instance avec C++.