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)
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);
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)
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.
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
Chame SWbemServices.Get, mas não identifique uma instância específica no caminho do objeto para a classe.
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.
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.
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++
- Chame os métodos IWbemServices::GetObject ou IWbemServices::GetObjectAsync para recuperar a definição de uma classe.
- 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++.