Recuperar una clase WMI

El primer tipo de objeto que se puede recuperar es una clase WMI. Al recuperar una clase WMI, realmente se recupera una definición de clase, que es una lista de las propiedades, calificadores y métodos que describen completamente la clase. Sin embargo, una definición de clase es básicamente la propia clase.

PowerShell usa una consulta estándar para recuperar definiciones de clase mediante la clase meta_class.

Para recuperar una definición de clase en PowerShell

  • Use Get-WmiObject con una consulta para meta_class, con la cláusula WHERE que contiene el nombre de la clase con la que se va a recuperar.

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

    Get-WmiObject es el cmdlet estándar que PowerShell usa para recuperar información de clase e instancia de WMI. La clase meta_class define la consulta como una consulta de esquema. Sin la clase meta_class, esta consulta devolvería todas las instancias de Win32_LogicalDisk. Para más información sobre cómo consultar WMI, vea Instrucción SELECT para consultas de esquema.

El proceso actual para recuperar una definición de WMI en C# es usar la clase CIMInstance.

Para recuperar una definición de clase en C# (Microsoft.Management.Infrastructure)

  1. Con el espacio de nombres Microsoft.Management.Infrastructure, cree una clase CIMInstance con el espacio de nombres y el nombre de clase especificados.

    La clase creada contendrá toda la información de clase, pero ningún dato de instancia.

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string className = "Win32_LogicalDisk";
    
    CimInstance diskDrive = new CimInstance(className, Namespace);
    
  2. Como alternativa, al igual que con PowerShell, también puede realizar una consulta mediante la etiqueta meta_class como parte de la consulta.

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

Al igual que con PowerShell, C# usa una consulta meta_class para recuperar definiciones de clase. Como alternativa, puede crear un objeto ManagementClass para acceder directamente a la definición de clase.

Nota

System.Management era el espacio de nombres de.NET original que se usaba para acceder a WMI; sin embargo, las API de este espacio de nombres suelen ser más lentas y no se escalan tan bien como sus homólogos más modernos Microsoft.Management.Infrastructure.

 

Para recuperar una definición de clase en C# (System.Management)

  1. Puede usar ManagementObjectSerarcher con una consulta para meta_class, con la cláusula WHERE que contiene el nombre de la clase con la que se va a recuperar.

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

    ManagementObjectSerarcher es la clase estándar que.NET usa para recuperar información de clase e instancia de WMI. ManagementObjectSerarcher.Get devuelve una clase ManagementObjectCollection que contiene la clase de definición de esquema. La clase meta_class define la consulta como una consulta de esquema. Sin la clase meta_class, esta consulta devolvería todas las instancias de Win32_LogicalDisk. Para más información sobre cómo consultar WMI, vea Instrucción SELECT para consultas de esquema.

  2. Como alternativa, cree un nuevo objeto ManagementClass, con el nombre como ruta de acceso, para recuperar la clase.

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

Puede recuperar una definición de clase en VBScript de forma similar a recuperar una instancia específica.

Para recuperar una definición de clase en VBScript

  1. Llame a SWbemServices.Get, pero no identifique una instancia específica en la ruta de acceso del objeto para la clase.

  2. En el ejemplo de código siguiente se recupera la definición de clase de la clase que describe las unidades lógicas del equipo.

    Set objinst = GetObject("WinMgmts:Win32_LogicalDisk")
    

    Windows Script Host (WSH) también admite lo siguiente.

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

    En Active Server Pages (ASP) use GetObject o CreateObject en el script del lado servidor. Para más información, vea Creación de Active Server Pages para WMI.

  3. También se puede especificar una clase o instancia, en cuyo caso el objeto devuelto es un objeto WMI, por ejemplo, una instancia de Win32_LogicalDisk, en lugar de un objeto services. Tenga en cuenta que no puede usar las funciones GetObject de VBScript para crear una instancia del objeto genérico SWbemObject.

  4. En las páginas HTML que se ejecutan en Microsoft Internet Explorer (IE), GetObject y CreateObject pueden producir un error porque los objetos de scripting WMI, como los controles ActiveX, no están marcados como seguros para el scripting. La única excepción es el objeto SWbemDateTime. La única manera en que estas llamadas pueden realizarse correctamente es cuando se reduce la configuración de seguridad de IE, que no se recomienda.

Al recuperar una clase en C++, llame a la versión IWbemServices de GetObject.

Para recuperar una definición de clase en C++

  1. Llame a los métodos IWbemServices::GetObject o IWbemServices::GetObjectAsync para recuperar la definición de una clase.
  2. Una clase puede tener varias definiciones de clase, lo que suele ocurrir cuando se carga más de un proveedor de clases en un espacio de nombres. Cuando una clase tiene varias definiciones de clase, WMI devuelve la primera definición detectada y el código de estado WBEM_S_DUPLICATE_OBJECTS.

Dado que GetObject devuelve una definición de clase, normalmente se usa como primer paso para crear una instancia. Para más información sobre cómo usar GetObject, vea Crear y declarar una instancia mediante C++.