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 _ProcessadorImports 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 _ProcessadorModule 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 _HDImports 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 _HDModule 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 WQLImports 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 nodesenvolvimento 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