Windows Management Instrumentation (WMI) é talvez um dos segredos mais bem guardados no mundo da TI. É um conjunto muito poderoso de ferramentas que podemos usar para coletar informações, configurar e gerenciar computadores localmente ou remotamente através da rede.
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.
Por meio do WMI podemos obter várias informações a respeito de todo o hardware e software, incluindo:
a) Número de série, tamanho (capacidade) e espaço livre em drives;
b) Número de série, velocidade de clock e tipo de soquete da CPU;
c) Endereço MAC do adaptador de rede (Network Adapter MAC Address);
d) Gateway padrão do adaptador de rede (Network Adapter Default Gateway);
e) Muitas outras informações úteis para o desenvolvimento de programas que investigam ou atualizam informações relacionados a hardware e Software.
As possíbilidades são inumeras, portanto, um novo "provedor" WMI pode ser adicionado durante a instalação de um aplicativo (como o SQL Server ou Internet Information Service). O namespace padrão (chamado de "root \ cimv2") contém mais de 500 “Classes” nas seguintes categorias:
· Computer system hardware
· Operating System
· Installed Applications
· Internal WMI Service settings
· Performance Counter
· Helper Classes
·
Maiores informações sobre referências e bibliotecas do WMI podem ser obtidas em: http://msdn.microsoft.com/en-us/library/aa394572.aspx
Criando projeto exemplo para entender o funcionamento do WMI
Vamos criar um exemplo simples, este exemplo vai retornar o espaço livre em disco na unidade C: do seu PC.
Crie um novo projeto no VB.net em seguida clique na guia Project e depois em Add Reference.
Na janela de referências do projeto adicione as seguintes referências:
System.Data, System.DirectoryServices, System.Management e System.Windows.forms, conforme imagem abaixo:
Crie um botão de comando no form1:
Insira o seguinte código no evento click do botão que foi inserido:
Imports System
Imports System.Management
Imports System.Windows.Forms
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim test As String = ""
test = "\\Sua_máquina\root\CIMV2"
Try
Dim searcher As New ManagementObjectSearcher(test, "SELECT * FROM Win32_LogicalDisk")
For Each queryObj As ManagementObject In searcher.Get()
MsgBox(queryObj("FreeSpace"))
Next
Catch err As ManagementException
MessageBox.Show("Ocorreu o seguinte erro ao consultar os dados WMI: " & err.Message)
End Try
End Sub
End Class
Entendendo o código
Substitua Sua_máquina pelo IP ou o nome de sua máquina.
ManagementObjectSearcher: Inicializa uma nova instância da classe ManagementObjectSearcher. Onde podemos definir aalgumas propriedades para este objeto , podendo ser usado para chamar uma consulta de informações.
A classe Win32_LogicalDisk é como um registro de banco de dados, então nós temos a informação contida em cada campo da mesma maneira que faríamos a informação de um objeto DataRow o campo retorna um "objeto". Neste exemplo, exibimos o objeto retornado de queryobj ("FreeSpace") para uma caixa de mensagens.
Podemos observar que o resultado é devolvido em megabytes, onde podemos contornar isto fazendo a conversão no momento em que exibimos a MessageBox.
Observe um novo exemplo onde é devolvido o tamanho total do disco.
Imports System
Imports System.Management
Imports System.Windows.Forms
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim test As String = ""
Const conv = 1073741824
test = "\\Sua_máquina\root\CIMV2"
Try
Dim searcher As New ManagementObjectSearcher(test, "SELECT * FROM Win32_LogicalDisk")
For Each queryObj As ManagementObject In searcher.Get()
MsgBox(queryObj("Caption") & " " & (queryObj("Size") / conv))
Next
Catch err As ManagementException
MessageBox.Show("Ocorreu o seguinte erro ao consultar os dados WMI: " & err.Message)
End Try
End Sub
End Class
Podemos utilizar este exemplo em um PC remoto, mudando apenas uma linha do código. Exemplo:
Na variável onde temos:
test = "\\Sua_máquina\root\CIMV2"
Reescreva substituindo Sua_máquina pelo IP ou nome do computador remoto que será acessado.
Nota: Existem alguns requisitos óbvios de segurança, permissões e configurações de firewall que devem ser cumpridos antes de executar qualquer operação do WMI em um PC remoto.
O WMI não é apenas para a obtenção de dados somente leitura de um sistema, ele também pode ser usado para interagir e controlar um sistema, ou seja, podemos utilizar InvokeMethod () método da classe Win32_OperatingSystem para desligar um PC remoto.
Referências:
http://msdn.microsoft.com/en-us/
http://msdn.microsoft.com/en-us/library/aa394572.aspx