C# - Listando os serviços ativos do Windows no ListView - II


 O artigo de hoje vamos recordar como tratar com os serviços do Windows em uma aplicação C# listando os serviços ativos do Windows em um controle ListView.

Na primeira parte do artigo eu mostrei como exibir todos os serviços do Windows, vamos agora listar apenas os processos ativos em execução.

Para realizar essa tarefa vamos usar os recursos do namespace System.Management que fornece acesso a um rico conjunto de informação de gerenciamento e gestão de eventos sobre o sistema, dispositivos e aplicativos instrumentados para a infraestrutura do Windows Management Instrumentation (WMI).

Os aplicativos e serviços podem consultar informações como a quantidade de espaço livre que resta no disco, qual a atual utilização da CPU, qual banco de dados esta conectado a  determinado aplicativo, etc., usando as classes derivadas de ManagementObjectSearcher e ManagementQuery , ou inscrever-se em uma variedade de eventos de gerenciamento usando a classe ManagementEventWatcher.

Vamos utilizar também o namespace System.Diagnostics que contém tipos que permitem interagir com os processos do sistema, logs de eventos, e contadores de desempenho; seus namespaces filhos contém tipos para interagir com código de ferramenta de análise, suportar contratos, estender o suporte em tempo de projeto para o monitoramento da aplicação e instrumentação, logar dados de eventos usando o subsistema de trace Event Tracing for Windows (ETW), ler e escrever a partir de arquivos de logs, coletar dados de desempenho e ler e escrever informação sobre debug.

Recursos usados :

Incluindo um novo projeto na solução

Abra a solução Tratando_Servicos,  criada no VS 2013 Express for Windows desktop, no artigo anterior.

A seguir clique em FILE -> Add -> New Project;

Selecione o template  Visual C# -> Windows Forms Application;

Informe o nome Listar_Servicos_Ativos e clique no botão OK;

No formulário form1.cs do projeto vamos incluir os seguintes controles a partir da ToolBox:

Disponha os controles no formulário conforme o leiaute da figura abaixo:

Vamos definir as colunas usadas no controle ListView usando a propriedade Columns da caixa de propriedades do controle.

Clique em Columns(Collection) para abrir a caixa de diálogo ColumnHeader Collection Editor e defina 4  colunas conforme a configuração abaixo:

Precisamos incluir uma referência ao namespace System.Management em nosso projeto.

Clique no menu PROJECT e a seguir em Add Reference e selecione o namespace conforme a figura abaixo:

No início do formulário vamos agora declarar os seguintes namespaces:

using System.Management;
using
System.Diagnostics;

No formulário Form1.cs vamos incluir o código abaixo no evento Click do botão de comando Listar Serviços Ativos:

       private void btnListarServicos_Click(object sender, EventArgs e)
        {
            ManagementClass management = new ManagementClass("Win32_Process");
            ManagementObjectCollection mCollection = management.GetInstances();
            foreach (ManagementObject process in mCollection)
            {
                ListViewItem novoListViewItem = new ListViewItem();
                novoListViewItem.Text = (process["ProcessId"].ToString());
                novoListViewItem.SubItems.Add((string)process["Name"]);
                novoListViewItem.SubItems.Add((string)process["ExecutablePath"]);
                try
                {
                    FileVersionInfo info = FileVersionInfo.GetVersionInfo((string)process["ExecutablePath"]);
                    novoListViewItem.SubItems.Add(info.FileDescription);
                }
                catch
                {
                    novoListViewItem.SubItems.Add("Não Disponível");
                }
                lvServicosAtivos.Items.Add(novoListViewItem);
            }
      }

Vamos entender o código acima:

No laço foreach estamos percorrendo o array de serviços obtidos por GetIstances().

Criamos então uma instância de ListViewItem que iremos usar para incluir as informações dos serviços.

Estamos usando as classes ManagementClass e ManagementCollection para nos ajudar a percorrer os processos ativos.

Poderíamos ter feito isso usando Process.GetProcess() mas essa abordagem possui uma limitação pois com ela somente podemos visualizar os mesmos processos vistos pelos seus arquivos .EXE e assim não poderíamos ver todos os processos, e por isso que estamos usando as duas classes mencionadas acima.

Após isso precisamos criar nosso laço foreach para obter a informação para cada processo encontrado adicionando em nosso ListView.

Estamos obtendo apenas o ID, Nome , Localização e Descrição dos processos.

Para obter o ID do processo precisamos usar a classe ManagementObject para obter o ID e nome do processo do objeto e a seguir converter o resultado para string para exibir no Listview.

Se usarmos a classe Win32_Process para obter a descrição do processo o resultado não será o desejado pois ela retorna o nome e não a descrição.

Para fazer isso usamos a classe FileVersionInfo que obtém a descrição do processo a partir do caminho especificado.

Desde de que nem todos os processos possui uma descrição disponível estamos usando o bloco try/catch para evitar uma exceção e atribuir o valor "Não disponível" quando isso ocorre.

Executando o projeto iremos obter o seguinte resultado:

Na terceira parte do artigo eu vou mostrar como podemos Parar, Iniciar e Reiniciar serviços do Windows.

Pegue o projeto completo aqui :  Tratando_Servicos_2.zip

Rom 3:10 como está escrito: Não há justo, nem sequer um.

Rom 3:11 Não há quem entenda; não há quem busque a Deus.

Rom 3:12 Todos se extraviaram; juntamente se fizeram inúteis. Não há quem faça o bem, não há nem um só.
 

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti