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:
1 GroupBox - Text = Serviços Ativos do Windows
1 ListView - lvServicosAtivos, Dock=Fill, View=Details, AllowColumnReOrder=True, GridLines=True
1 Button - btnListarServicos
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:
ID - TextAlign= Left , Width = 60
Nome - TextAlign= Left , Width = 250
Localizacao - TextAlign= Left , Width = 400
Descricao - TextAlign= Left , Width = 500
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;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) novoListViewItem.Text = (process["ProcessId"].ToString()); try 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: