Recuperando uma classe WMI

O primeiro tipo de objeto que você pode recuperar é uma classe WMI. Ao recuperar uma classe WMI, você realmente recupera uma definição de classe, que é uma listagem das propriedades, qualificadores e métodos que descrevem totalmente a classe. No entanto, uma definição de classe é basicamente a própria classe.

O PowerShell usa uma consulta padrão para recuperar definições de classe usando a classe meta_class .

Para recuperar uma definição de classe no PowerShell

  • Use o Get-WmiObject com uma consulta para meta_class, com a cláusula WHERE que contém o nome da classe com a qual você deve recuperar.

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

    Get-WmiObject é o cmdlet padrão que o PowerShell usa para recuperar informações de classe e instância do WMI. A classe meta_class define a consulta como uma consulta de esquema. Sem a classe meta_class , essa consulta retornaria todas as instâncias de Win32_LogicalDisk. Para obter mais informações sobre como consultar o WMI, consulte a Instrução SELECT para consultas de esquema.

O processo atual para recuperar uma definição de WMI em C# é usar a classe CIMInstance .

Para recuperar uma definição de classe em C# (Microsoft.Management.Infrastructure)

  1. Usando o namespace Microsoft.Management.Infrastructure , crie uma classe CIMInstance com o namespace e o nome da classe especificados.

    A classe criada conterá todas as informações de classe, mas nenhum dado de instância.

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string className = "Win32_LogicalDisk";
    
    CimInstance diskDrive = new CimInstance(className, Namespace);
    
  2. Como ocorre com o PowerShell, você também pode executar uma consulta usando a marca meta_class como parte da 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);
    

Assim como acontece com o PowerShell, o C# usa uma consulta meta_class para recuperar definições de classe. Como alternativa, você pode criar um objeto ManagementClass para acessar a definição de classe diretamente.

Observação

System.Management foi o namespace .NET original usado para acessar o WMI; no entanto, as APIs nesse namespace geralmente são mais lentas e não são dimensionadas tão bem em relação aos seus equivalentes mais modernos do Microsoft.Management.Infrastructure .

 

Para recuperar uma definição de classe em C# (System.Management)

  1. Você pode usar o ManagementObjectSerarcher com uma consulta para meta_class, com a cláusula WHERE contendo o nome da classe com a qual você deve recuperar.

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

    ManagementObjectSerarcher é a classe padrão que o .NET usa para recuperar informações de classe e instância do WMI. ManagementObjectSerarcher.Get retorna um ManagementObjectCollection que contém a classe de definição de esquema. A classe meta_class define a consulta como uma consulta de esquema. Sem a classe meta_class , essa consulta retornaria todas as instâncias de Win32_LogicalDisk. Para obter mais informações sobre como consultar o WMI, consulte a Instrução SELECT para consultas de esquema.

  2. Como alternativa, crie um novo objeto ManagementClass , com o nome como o caminho, para recuperar a classe.

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

Você pode recuperar uma definição de classe no VBScript de maneira semelhante à recuperação de uma instância específica.

Para recuperar uma definição de classe no VBScript

  1. Chame SWbemServices.Get, mas não identifique uma instância específica no caminho do objeto para a classe.

  2. O exemplo de código a seguir recupera a definição de classe para a classe que descreve unidades lógicas em seu computador.

    Set objinst = GetObject("WinMgmts:Win32_LogicalDisk")
    

    Windows Host de Script (WSH) também dá suporte ao seguinte.

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

    Em ASP (Páginas do Servidor Ativo) use GetObject ou CreateObject no script do lado do servidor. Para obter mais informações, consulte Criando Páginas do Servidor Ativo para WMI.

  3. Uma classe ou instância também pode ser especificada, nesse caso, o objeto retornado é um objeto WMI, por exemplo, uma instância de Win32_LogicalDisk, em vez de um objeto de serviços. Observe que você não pode usar as funções GetObject do VBScript para criar uma instância do objeto genérico SWbemObject.

  4. Em páginas HTML em execução no Microsoft Internet Explorer (IE), GetObject e CreateObject podem falhar porque objetos de script WMI, como controles ActiveX, não são marcados como seguros para scripts. A única exceção é o objeto SWbemDateTime . A única maneira de essas chamadas terem êxito é quando você reduz as configurações de segurança do IE, o que não é recomendado.

Ao recuperar uma classe em C++, chame a versão IWbemServices do GetObject.

Para recuperar uma definição de classe no C++

  1. Chame os métodos IWbemServices::GetObject ou IWbemServices::GetObjectAsync para recuperar a definição de uma classe.
  2. Uma classe pode ter várias definições de classe, o que acontece normalmente quando você tem mais de um provedor de classe carregado em um namespace. Quando uma classe tem várias definições de classe, o WMI retorna a primeira definição descoberta e o código de status WBEM_S_DUPLICATE_OBJECTS .

Como GetObject retorna uma definição de classe, ela geralmente é usada como a primeira etapa na criação de uma instância. Para obter mais informações sobre como usar GetObject, consulte Criando e declarando uma instância usando C++.