Recuperar una clase WMI

El primer tipo de objeto que puede recuperar es una clase WMI. Al recuperar una clase WMI, se recupera realmente 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 a la 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, _ esta consulta devolvería todas las instancias de _ LogicalDisk de Win32. Para obtener 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 no datos 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 de 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 original de .NET que se usaba para tener acceso a WMI; Sin embargo, las API de este espacio de nombres suelen ser más lentas y no escalan tan bien en relación con sus homólogos microsoft.management.infrastructure más modernos.

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

  1. Puede usar ManagementObjectSerarcher con una consulta a la 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 obtener 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 para la clase que describe las unidades lógicas en el equipo.

    Set objinst = GetObject("WinMgmts:Win32_LogicalDisk")
    

    Windows El host de script (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 obtener más información, vea Creating Active Server Pages for 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 de servicios. 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 scripting. La única excepción es el objeto SWbemDateTime. La única manera de que estas llamadas se puedan realizar correctamente es cuando se reduce la configuración de seguridad de IE, lo 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 hay más de un proveedor de clases cargado 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, se usa normalmente como primer paso para crear una instancia. Para obtener más información sobre cómo usar GetObject, vea Creating and Declaring an Instance Using C++.