Desenvolvimento - Visual Basic .NET
VS.NET: Obtendo dados do Hardware e SO com WMI
O WMI é um grupo de classes que pode nos dar informações sobre o Hardware, Sistema Operacional e Softwares.
por Julio E. Mena HerreraVocê 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.
Figura 2. Referenciando a Namespace System.Management
A Namespace referenciada é a que nos fornece os objetos necessários para manipulação das informações disponíveis através do WMI.
Obtendo dados do Processador
As informações sobre o processador são chamadas através da classe Win32_Processor, que faz parte do grupo de classes denominado 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 ModuleSalve 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.
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-9c5b-fbf236e0e875&DisplayLang=en
- Entity Framework 4: Repositório GenéricoVisual Basic .NET
- As edições 14 da Easy .net Magazine e 88 da .net Magazine já estão disponíveis.ADO.NET
- Postando no Twiiter com .NET e Migre.meC#
- Setup ApplicationsVisual Basic .NET
- Problemas na manipulação de arquivos do MS Excel com .NETVisual Basic .NET