Arquivo
Instrumentação .NET – WMI
No podemos acessar uma série de informações do Windows através do Windows Management Instrumentation (WMI) como por exemplo versão do sistema operacional, temperatura do processador, nome dos HD´s instalados, quais são os Drives entre outras coisas. Para uma referência completa verifique o link “Classes WMI” no final deste artigo. Neste post irei descrever como executar as operações básicas de monitoramento.
Para se conectar ao WMI do Windows adicione o namespace System.Management e utilize o seguinte código:
- ManagementScope scope = new ManagementScope(@"\\localhost\root\cimv2");
- scope.Connect();
No exemplo acima estou instanciando uma classe do tipo ManagementScope e chamando o método para conectar no WMI.
O Framework nos permite utilizar uma subset do SQL chamada WMI Query Language (WQL) para realizar consultas no WMI do Windows. Para isso você terá que criar um ObjectQuery passando como parâmetro no construtor o WQL criado. Segue abaixo o exemplo.
- ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_LogicalDisk");
Neste caso estou selecionando todos os drives lógicos que o Windows reconhece. Existem várias querys que podem ser realizadas, para uma referencia completa veja os links no final deste artigo.
Para realizar a consulta siga o exemplo abaixo:
- ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
- ManagementObjectCollection queryCollection = searcher.Get();
- foreach (ManagementObject m in queryCollection)
- {
- Console.WriteLine("{0} {1}", m["Name"].ToString(), m["Description"].ToString());
- }
Na linha 1 estou criando o objeto ManagementObjectSearcher passando como parâmetro o scope e a query. Na segunda linha eu executo a consulta chamando o método Get e retorno a coleção atribuindo ao objeto ManagementObjectCollection. Nas linhas finais eu executo um foreach através da coleção e retorno o nome e a descrição do drive passando como parâmetro suas chaves respectivamente. Para uma referencia completa das chaves, acessem os links no final deste artigo.
Outra opção é você monitorar os eventos WMI para que quando algum evento executar o seu código será chamado. Segue abaixo como fazer isso.
- WqlEventQuery query = new WqlEventQuery("__InstanceCreationEvent",
- new TimeSpan(0, 0, 1),
- "TargetInstance isa 'Win32_Process'");
- ManagementEventWatcher watcher = new ManagementEventWatcher(query);
- ManagementBaseObject e = watcher.WaitForNextEvent();
- Console.WriteLine(((ManagementBaseObject)e["TargetInstance"])["Name"]);
- watcher.Stop();
Na primeira linha estou criando o Objeto WqlEventQuery dizendo quais eventos eu quero monitorar. Na quarta linha eu crio o watcher que inicia o monitoramento. Na linha 5 eu digo para a aplicação que aguarde até que algum evento WMI seja executado. Na penúltima linha eu recupero qual o nome do processo que foi criado e na última linha eu paro o monitoramento.
Outra forma de realizar este monitoramento é através de eventos do watcher. Isto melhora sua aplicação pois a mesma não terá que ficar parada esperando que algum evento aconteça. Segue abaixo como fazer.
- watcher.EventArrived += new EventArrivedEventHandler(handler);
- watcher.Start();
Após criar o watcher estou associando um método ao evento EventArrived do mesmo, para que quando algum evento acontecer ele chamará automaticamente este método. Na última linha estou dizendo para o watcher começar o monitoramento.
E chegamos ao fim de mais um artigo desta série de instrumentação. Espero que tenham gostado e que seja útil para seu dia a dia.
Classes WMI : http://msdn.microsoft.com/en-us/library/aa394554.aspx
Scripts WMI: http://msdn.microsoft.com/en-us/library/aa394585(v=VS.85).aspx