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