Recupero di una classe WMI

Il primo tipo di oggetto che è possibile recuperare è una classe WMI. Quando si recupera una classe WMI, si recupera effettivamente una definizione di classe, ovvero un elenco delle proprietà, qualificatori e metodi che descrivono completamente la classe. Tuttavia, una definizione di classe è fondamentalmente la classe stessa.

PowerShell usa una query standard per recuperare le definizioni di classe usando la classe meta_class .

Per recuperare una definizione di classe in PowerShell

  • Usare Get-WmiObject con una query per meta_class, con la clausola WHERE contenente il nome della classe da recuperare.

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

    Get-WmiObject è il cmdlet standard usato da PowerShell per recuperare le informazioni sulle classi e sulle istanze da WMI. La classe meta_class definisce la query come query dello schema. Senza la classe meta_class , questa query restituirà tutte le istanze di Win32_LogicalDisk. Per altre informazioni sull'esecuzione di query su WMI, vedere Istruzione SELECT per query dello schema.

Il processo corrente per il recupero di una definizione WMI in C# consiste nell'usare la classe CIMInstance .

Per recuperare una definizione di classe in C# (Microsoft.Management.Infrastructure)

  1. Usando lo spazio dei nomi Microsoft.Management.Infrastructure , creare una classe CIMInstance con lo spazio dei nomi e il nome della classe specificati.

    La classe creata conterrà tutte le informazioni sulla classe, ma non i dati dell'istanza.

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string className = "Win32_LogicalDisk";
    
    CimInstance diskDrive = new CimInstance(className, Namespace);
    
  2. In alternativa, come con PowerShell, è anche possibile eseguire una query usando il tag meta_class come parte della query.

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

Come con PowerShell, C# usa una query meta_class per recuperare le definizioni di classe. In alternativa, è possibile creare un oggetto ManagementClass per accedere direttamente alla definizione della classe.

Nota

System.Management era lo spazio dei nomi .NET originale usato per accedere a WMI; Tuttavia, le API in questo spazio dei nomi sono in genere più lente e non vengono ridimensionate anche rispetto alle controparti Microsoft.Management.Infrastructure più moderne.

 

Per recuperare una definizione di classe in C# (System.Management)

  1. È possibile usare ManagementObjectSerarcher con una query per meta_class, con la clausola WHERE contenente il nome della classe da recuperare.

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

    ManagementObjectSerarcher è la classe standard usata da .NET per recuperare le informazioni sulle classi e sulle istanze da WMI. ManagementObjectSerarcher.Get restituisce un oggetto ManagementObjectCollection contenente la classe di definizione dello schema. La classe meta_class definisce la query come query dello schema. Senza la classe meta_class , questa query restituirà tutte le istanze di Win32_LogicalDisk. Per altre informazioni sull'esecuzione di query su WMI, vedere Istruzione SELECT per query dello schema.

  2. In alternativa, creare un nuovo oggetto ManagementClass , con il nome come percorso, per recuperare la classe.

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

È possibile recuperare una definizione di classe in VBScript in modo analogo al recupero di un'istanza specifica.

Per recuperare una definizione di classe in VBScript

  1. Chiamare SWbemServices.Get ma non identificare un'istanza specifica nel percorso dell'oggetto per la classe .

  2. Nell'esempio di codice seguente viene recuperata la definizione di classe per la classe che descrive le unità logiche nel computer.

    Set objinst = GetObject("WinMgmts:Win32_LogicalDisk")
    

    Windows Script Host (WSH) supporta anche quanto segue.

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

    In Active Server Pages (ASP) usare GetObject o CreateObject nello script lato server. Per altre informazioni, vedere Creazione di pagine server attive per WMI.

  3. È inoltre possibile specificare una classe o un'istanza, nel qual caso l'oggetto restituito è un oggetto WMI, ad esempio un'istanza di Win32_LogicalDisk, anziché un oggetto servizi. Si noti che non è possibile utilizzare le funzioni GetObject VBScript per creare un'istanza dell'oggetto generico SWbemObject.

  4. Nelle pagine HTML in esecuzione in Microsoft Internet Explorer (IE), GetObject e CreateObject possono avere esito negativo perché gli oggetti di scripting WMI, come i controlli ActiveX, non sono contrassegnati come sicuri per lo scripting. L'unica eccezione è l'oggetto SWbemDateTime . L'unico modo in cui queste chiamate possono avere esito positivo è quando si abbassano le impostazioni di sicurezza di Internet Explorer, che non è consigliato.

Quando si recupera una classe in C++, chiamare la versione IWbemServices di GetObject.

Per recuperare una definizione di classe in C++

  1. Chiamare i metodi IWbemServices::GetObject o IWbemServices::GetObjectAsync per recuperare la definizione di una classe.
  2. Una classe può avere più definizioni di classe, che si verifica in genere quando si dispone di più provider di classi caricati in uno spazio dei nomi. Quando una classe ha più definizioni di classe, WMI restituisce la prima definizione individuata e il codice di stato WBEM_S_DUPLICATE_OBJECTS .

Poiché GetObject restituisce una definizione di classe, viene comunemente usata come primo passaggio per la creazione di un'istanza di . Per altre informazioni su come usare GetObject, vedere Creazione e dichiarazione di un'istanza tramite C++.