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'"
    

    O 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 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 alternativa, como no PowerShell, você também pode executar uma consulta usando a marca de 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 de meta_class para recuperar definições de classe. Como alternativa, crie um objeto ManagementClass para acessar a definição de classe diretamente.

Observação

O System.Management era o namespace original do .NET usado para acessar o WMI. No entanto, as APIs nesse namespace geralmente são mais lentas e não escalam tão bem em relação às contrapartes mais modernas do Microsoft.Management.Infrastructure.

 

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

  1. Use o ManagementObjectSerarcher com uma consulta para meta_class, com a cláusula WHERE que contém 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();
    

    O ManagementObjectSerarcher é a classe padrão que o .NET usa para recuperar informações de classe e instância do WMI. O 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 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");
    

Recupere 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")
    

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

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

    Em ASP (Active Server Pages) use GetObject ou CreateObject no script do lado do servidor. Para obter mais informações, consulte Criar páginas de servidor ativo para o WMI.

  3. Uma classe ou instância também pode ser especificada, nesse caso, o objeto retornado é um objeto do WMI, por exemplo, uma instância de Win32_LogicalDisk, em vez de um objeto de serviços. Observe que não é possível 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 IE (Microsoft Internet Explorer), o GetObject e o CreateObject podem falhar porque objetos de script do 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 serem bem-sucedidas é 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 de 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 é comumente usada como a primeira etapa na criação de uma instância. Para obter mais informações sobre como usar o GetObject, consulte Criar e declarar uma instância usando C++.