Criando eventos com WMI

by Daniel Cordeiro 15. maio 2009 15:28

Neste post irei mostrar como criar um evento WMI. Isso é útil quando precisamos monitorar alguma atividade no computador. No exemplo abaixo irei demonstrar como monitorar se um pen drive foi removido do computador.

Um detalhe importante, esse evento de monitoração deve ser executado em uma thread separada, pois durante o monitoramento ela “trava” a aplicação.
Abaixo está o código fonte comentado do exemplo:

using System;

using System.Management;

using System.Threading;

 

namespace ConsoleApplication1

{

  class Program

  {

    static private Thread trd;

    static private bool Saindo = false;

    static void Main(string[] args)

    {

      Console.WriteLine("Iniciado...");

      trd = new Thread(monitoraHardlock);

      trd.Name = "MonitoraHardLock";

      trd.Start();

    }

    static internal void monitoraHardlock()

    {

      string temp = "";

      string[] info;

      string nserie = "";

      //Crio a query/evento WMI que deve ficar monitorando o pen drive

      //(Win32_DiskDrive) a cada 1 segundo.

      //Dependendo da necessidade e o que será monitorado, esse tempo

      //pode ser maior. E é um evento de tipo "deleção"

      //(__InstanceDeletionEvent) pois quero saber se vai ser removido

      //e não inserido.

      WqlEventQuery query = new WqlEventQuery("__InstanceDeletionEvent",

        new TimeSpan(0, 0, 1),

        "TargetInstance isa \"Win32_DiskDrive\"");

      //Crio o evento de monitoração em si

      ManagementEventWatcher watcher = new ManagementEventWatcher();

      watcher.Query = query;

      watcher.Options.Timeout = new TimeSpan(0, 0, 1);

      int i = 0;

      do

      {

        try

        {

          //Depois da execução da linha abaixo, é que o 'watcher'

          //inicia a monitoração se houve mudança dos discos

          //(se algum foi removido) a aplicação fica "travada"

          //nessa linha pois fica esperando o evento

          ManagementBaseObject ex = watcher.WaitForNextEvent();

          //Depois do evento ter ocorrido, pego todas as

          //informações do disco, no caso pen drive, que foi removido

          //e pego o numero de serie

          temp = ((ManagementBaseObject)ex["TargetInstance"])["PNPDeviceID"].ToString();

          //Pego somente as informações que quero...

          info = temp.Split(new Char[] { '\\', '&' });

          //Coloco numa variável e mostro na tela

          nserie = info[info.Length - 2];

          Console.WriteLine("Pendrive de serie: " + nserie + " removido.");

        }

        catch (ManagementException ex)

        {

          if (ex.ErrorCode == ManagementStatus.Timedout)

          {

            goto Saida;

          }

        }

      Saida:

        if (Saindo == true)

        {

          i = 1;

        }

      }

      while (i == 0);

      //Paro o watcher. Se não estiver dentro de um loop,

      //assim que o evento for disparado a aplicação seria encerrada.

      //No caso deste exemplo a monitoração é contínua

      watcher.Stop();

    }

  }

}

 
Para mais informações sobre as classes WMI: http://msdn.microsoft.com/en-us/library/aa394583(VS.85).aspx


Visualizações(725)

Tags: , ,

C# .Net | Desktop | Programação

Os comentários estão fechados

Powered by BlogEngine.NET 1.6.1.0
Theme by Mads Kristensen | Modified by Mooglegiant