Obtendo dados do Hardware e SO com WMI

Windows Management Instrumentation (WMI) é uma implementação da Microsoft ao Web-Based

Enterprise Management (WBEM). O WMI usa o padrão comum do modelo da informação (CIM) que

representa sistemas, aplica√ß√Ķes, redes, dispositivos e outros componentes controlados.

Você pode utilizá-lo para automatizar tarefas administrativas em um ambiente. Como por exemplo, obter

dados do processador, do HD, da placa de rede, impressoras instaladas, ou ainda dados de configuração do

Sistema Operacional, como versão, contas de usuários locais e usuários do domínio.

Com o WMI pode-se ter uma gama de informa√ß√Ķes e, al√©m disso, em alguns casos pode configurar novas

informa√ß√Ķes, como por exemplo, se obter os dados de configura√ß√£o do Proxy no computador e, caso seja

necess√°rio, configurar novos valores, um recurso extremamente √ļtil para algumas aplica√ß√Ķes.

Para se ter acesso as informa√ß√Ķes √© utilizada uma linguagem que se assemelha muito ao T-SQL, a WQL

(WMI Query Language), que é baseada em ANSI SQL, como veremos no artigo.

Neste artigo veremos como ter informa√ß√Ķes do Processador e dados do Hard Disk.

Criando um novo Projeto

Para iniciarmos criaremos um novo projeto do tipo Console Application que chamaremos de

wmi_informacoesm, conforme a Figura 1.

 

 

Figura 1. Escolhendo a template de Console Application.

Antes de tudo devemos referenciar o Namespace System.Management clicando com o bot√£o direito na

pasta References do projeto, que está no Solution Explorer, e escolhendo a opção Add Reference, como

mostra a Figura 2.

 

 

 

Computer System Hardware, que é o grupo que representa os objetos

relacionados ao Hardware, como dispositivos de entrada, discos físicos, dispositivos de vídeos, dispositivos

de rede, entre outros. Para isso iremos criar uma classe chamada _Processador, conforme a Listagem 1.

Lembrando que em cada Classe criada devemos importar a Namespace System.Management, para facilitar

o acesso aos objetos e métodos.

Listagem 1. Classe _Processador

Imports System.Management

Public Class _Processador

Public Sub Selecionar()

Dim ObjQuery As New SelectQuery("Win32_Processor")

' O Array abaixo é para definir quais são as propriedades que queremos obter.

' Mas caso queira pode passar no SelectQuery.

Dim Propriedades() As String = New String() {"Caption", "CpuStatus", "CurrentClockSpeed",

"Description", "DeviceID", "ExtClock", "Family", "Manufacturer", "MaxClockSpeed", "Name", "ProcessorId",

"Status", "Version", "VoltageCaps"}

' Instanciando o objeto de procura para a query

Dim searcher As New ManagementObjectSearcher(ObjQuery)

' Objeto que receber√° no Loop os dados de retorno.

Dim ObjColecao As ManagementBaseObject

Console.WriteLine("Informa√ß√Ķes sobre o Processador")

Console.WriteLine("**********************************")

' Chama o evento Get() para o retorno da coleção

' através de um Loop caso o retorno seja mais de um.

For Each ObjColecao In searcher.Get()

For x As Integer = 0 To Propriedades.Length - 1

Console.WriteLine("Vari√°vel: {0} -> Valor = {1}", Propriedades(x), ObjColecao(Propriedades(x)))

Next

'Esta linha é somente para separar um retorno do outro

Console.WriteLine("**********************************")

Next

End Sub

End Class

Para testar a aplicação podemos chamar essa classe instanciando-a no Module1.vb como na Listagem 2.

Listagem 2. Chamando a classe _Processador

Module Module1

Sub Main()

Dim Processador As New _Processador

Processador.Selecionar()

End Sub

End Module

Salve e execute o projeto e o resultado deve ser como na Figura 3.

 

 

 

Figura 3. Dados do Processador.

Perceba que no resultado obtido houve o retorno de 2 processadores (DeviceID), indicados por CPU0 e

CPU1, isso por se tratar de um processador com tecnologia HT, assim simulando 2 processadores. Por isso,

é importante a utilização do Loop.

A classe Win32_Processor, que acabamos de utilizar, possui v√°rias outras propriedades com informa√ß√Ķes

sobre o processador, para saber quais são essas propriedades veja na parte de Referências no final deste

artigo.

Obtendo dados do Hard Disk

Agora veremos outra classe, chamada Win32_LogicalDisk, que pertence ao grupo de classes chamado

Operating System, que é o grupo que representa os objetos relacionados ao Sistema Operacional. Mas

existe no grupo utilizado anteriormente (Computer System Hardware) a classe Win32_DiskDrive que

tamb√©m traz informa√ß√Ķes sobre o HD, como Modelo, Tamanho, Tipo de Interface, Total de Cilindros, Total

de Cabe√ßas, e algumas outras informa√ß√Ķes que podem ser mescladas com as informa√ß√Ķes do Objeto que

veremos a seguir.

Agora criaremos a classe _HD que através dela teremos os dados do HD. Veja o código na Listagem 3.

Não se esqueça de importar a Namespace System.Management.

Listagem 3. Classe _HD

Imports System.Management

Public Class _HD

Public Sub Selecionar()

Dim ObjQuery As New SelectQuery("Win32_LogicalDisk", "DriveType = 3")

' O Array abaixo é para definir quais são as propriedades que queremos obter.

' Mas caso queira pode passar no SelectQuery.

Dim Propriedades() As String = New String() {"Caption", "Description", "DeviceID", "FileSystem",

"FreeSpace", "Name", "Size", "SupportsDiskQuotas", "VolumeName", "VolumeSerialNumber"}

' Instanciando o objeto de procura para a query

Dim searcher As New ManagementObjectSearcher(ObjQuery)

' Objeto que receber√° no Loop os dados de retorno.

Dim ObjColecao As ManagementBaseObject

Console.WriteLine("Informa√ß√Ķes sobre o Hard Disk")

Console.WriteLine("**********************************")

' Chama o evento Get() para o retorno da coleção

' através de um Loop caso o retorno seja mais de um.

For Each ObjColecao In searcher.Get()

For x As Integer = 0 To Propriedades.Length - 1

Console.WriteLine("Vari√°vel: {0} -> Valor = {1}", Propriedades(x), ObjColecao(Propriedades(x)))

Next

'Esta linha é somente para separar um retorno do outro

Console.WriteLine("**********************************")

Next

End Sub

End Class

Para testar a classe podemos fazer assim como testamos a anterior, conforme a Listagem 4.

Listagem 4. Chamando a classe _HD

Module Module1

Sub

Main()

Dim HardDisk As New _HD

HardDisk.Selecionar()

End Sub

End Module

O resultado deve ser algo parecido como na Figura 4.

 

 

Figura 4. Dados do Hard Disk.

Outra forma de obter os Dados

Uma outra maneira de obter os dados é a forma como mencionado no começo do artigo, através da

linguagem WQL, como se fosse uma consulta a alguma tabela de Banco de Dados. A WQL é um subconjunto

do ANSI SQL (American National Standards Institute Structured Query Language). Diferentemente do SQL

tradicional, a WQL é uma linguagem somente de consultas, que não foi concebida para atualizar, eliminar ou

inserir dados. Na Listagem 5 está um exemplo do código.

Listagem 5. Classe _HD utilizando WQL

Imports System.Management

Public Class _HD

Public Sub Selecionar()

' Instanciando o objeto que representa a Query

Dim ObjQuery As New ObjectQuery

' Instanciando o objeto de procura para a query

Dim ObjSearcher As New ManagementObjectSearcher

' Query String para consulta

ObjQuery.QueryString = "SELECT * FROM Win32_LogicalDisk WHERE DriveType = 3"

ObjSearcher.Query = ObjQuery

' O Array abaixo é para definir quais são as propriedades que queremos obter.

' Mas caso queira pode passar na Query String.

Dim Propriedades() As String = New String() {"Caption", "Description", "DeviceID", "FileSystem",

"FreeSpace", "Name", "Size", "SupportsDiskQuotas", "VolumeName", "VolumeSerialNumber"}

' Objeto que receber√° no Loop os dados de retorno.

Dim ObjColecao As ManagementBaseObject

Console.WriteLine("Informa√ß√Ķes sobre o Hard Disk")

Console.WriteLine("**********************************")

' Chama o evento Get() para o retorno da coleção

'através de um Loop caso o retorno seja mais de um.

For Each ObjColecao In ObjSearcher.Get()

For x As Integer = 0 To Propriedades.Length - 1

Console.WriteLine("Vari√°vel: {0} -> Valor = {1}", Propriedades(x), ObjColecao(Variaveis(x)))

Next

'Esta linha é somente para separar um retorno do outro

Console.WriteLine("**********************************")

Next

End Sub

End Class

O resultado obtido será o mesmo que no código anterior, Figura 4.

Conclus√£o

Através do Namespace System.Management podemos ter acesso a implementação WMI, que pode nos dar

muitas informa√ß√Ķes sobre o Hardware, Sistema Operacional e Softwares. Lembrando que, al√©m disso,

podemos utilizar os m√©todos para configurar algumas informa√ß√Ķes, como novas informa√ß√Ķes sobre o Proxy,

pausar uma impressora, pausar um job de impress√£o ou mesmo dar continuidade a ele.

E n√£o somente do computador que est√° rodando a aplica√ß√£o, mas tamb√©m ter as mesmas informa√ß√Ķes de

computadores que fazem parte da Rede, sem mesmo a aplicação estar instalada nesses computadores, só

sendo necessário estar rodando o WMI, no caso de Windows 2000 e Windows XP o WMI é nativo, já em

sistemas Windows 95/98/NT4.0 é necessário instalar o Windows Management Instrumentation (WMI) CORE

1.5, o link está na parte de Referências.

Julio E. Mena Herrera (julio.mena.herrera@gmail.com -

http://br.thespoke.net/MyBlog/Julio_Herrera/MyBlog.aspx) é Analista de Sistemas e atua no

desenvolvimento de Aplica√ß√Ķes .Net, com √™nfase em plataforma Web, em uma empresa do Terceiro Setor

(ONG).

Referências

Windows Management Instrumentation

http://msdn.microsoft.com/library/en-us/wmisdk/wmi/wmi_start_page.asp

Managing Applications Using WMI

http://msdn.microsoft.com/library/en-us/cpguide/html/cpconmanagingapplicationsusingwmi.asp

Querying with WQL

http://msdn.microsoft.com/library/en-us/wmisdk/wmi/querying_with_wql.asp

WQL (SQL for WMI)

http://msdn.microsoft.com/library/en-us/wmisdk/wmi/wql_sql_for_wmi.asp

Windows Management Instrumentation (WMI) CORE 1.5 (Windows 95/98/NT 4.0)

http://www.microsoft.com/downloads/details.aspx?FamilyID=afe41f46-e213-4cbf-9c5bfbf236e0e875&

DisplayLang=en