Partilhar via


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 completamente 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 contendo o nome da classe que 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 declaração SELECT para consultas de esquema .

O processo atual para recuperar uma definição WMI em C# é usar 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 especificado e o nome da classe.

    A classe criada conterá todas as informações da classe, mas nenhum dado da 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 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 no 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 era o namespace .NET original usado para acessar o WMI; no entanto, as APIs neste namespace geralmente são mais lentas e não são dimensionadas tão bem em relação às suas contrapartes mais modernas 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 que 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 uma 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 declaração SELECT para consultas de esquema.

  2. Como alternativa, crie um novo objeto ManagementClass, com o nome como 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. Execute SWbemServices.Get mas não identifique uma instância concreta no caminho do objeto da 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 Windows Script Host (WSH) também suporta o seguinte.

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

    Nas Ative Server Pages (ASP), use GetObject ou CreateObject no script do lado do servidor. Para obter mais informações, consulte Criando Ative Server Pages para WMI.

  3. Uma classe ou instância também pode ser especificada, caso em que o objeto retornado é um objeto WMI, por exemplo, uma instância de Win32_LogicalDisk, em vez de um objeto services. Observe que você não pode usar as funções VBScript GetObject 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 estã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 em C++

  1. Chame o IWbemServices::GetObject ou IWbemServices::GetObjectAsync métodos para recuperar a definição de uma classe.
  2. Uma classe pode ter várias definições de classe, o que normalmente acontece 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, ele é comumente usado 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++.