C# - Exibindo todos os serviços do Windows no ListView - I


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

Um serviço do Windows é uma aplicação que inicia quando o Windows é carregado e roda em segundo plano enquanto o Windows estiver em execução.

Para quem conhece o Unix este conceito é similar a um daemon(um programa de computador que roda em segundo plano sendo iniciado como um processo) deste sistema operacional.

Uma aplicação do tipo serviço do Windows é útil quando você deseja monitorar de forma constante alguns arquivos, o teclado, criar um arquivo de log, ou efetuar qualquer tarefa em segundo plano enquanto o sistema esta ocupando efetuando o seu trabalho.

Você pode acessar o gerenciador de serviços do Windows 8 clicando no menu iniciar, painel de controle, desempenho e manutenção, ferramentas administrativas e serviços, ou simplesmente clicando em iniciar, executar e digitando services.msc como mostrado na figura abaixo.

Neste artigo veremos como tratar com os serviços do Windows realizando tarefas como listar todos os serviços, verificar se um serviço esta instalado, listar todos os processos ativos e  parar, iniciar e reiniciar um serviço do Windows.

Para poder realizar essas tarefas vamos usar os recursos do namespace System.ServiceProcess que fornece classes que permitem a você implementar, instalar e controlar os aplicativos de serviço do Windows.

A classe ServiceController permite que você se conecte a um serviço existente e o manipule ou obtenha informações sobre ele. Essa classe é normalmente usada em uma capacidade administrativa e permite a você iniciar, parar, pausar, continuar ou executar comandos personalizados em um serviço.

Um ServiceProcess.ServiceController representa um serviço do Windows e permite que você manipule os serviços através de operações como se conectar o serviço, parar o serviço, iniciar o serviço e obter informações sobre o mesmo.

Usando a classe ServiceController  podemos controlar o comportamento de serviços do Windows já existentes. Ao criarmos a instância da classe ServiceController podemos definir suas propriedades de forma interagir com um serviço específico do Windows e realizar operações como parar, iniciar e manipular o serviço.

O método GetServices() da classe ServiceController pode ser usado para recuperar todos os serviços do computador local, exceto os serviços de driver do dispositivo.

Os comandos que um serviço pode processar dependem das suas propriedades.

Recursos usados :

Criando a solução no VS 2013 Express Edition

Abra o VS 2013 Express for Windows desktop e clique em New Project;

A seguir selecione Visual C# -> Windows Forms Application;

Informe o nome Tratando_Servicos 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:

Precisamos incluir uma referência ao namespace System.ServiceProcess 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.ServiceProcess;
using
Microsoft.Win32;

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

    private void btnListarServicos_Click(object sender, EventArgs e)
     {
            //Declarando a classe ServiceController e preenchendo um array com todos os serviços 
            //do windows usando o método GetServices()
            ServiceController[] services = ServiceController.GetServices();
            //Criando o cabeçalho com o nome das colunas no ListView
            MontaColunasListView();
            //percorre a relação de serviços e exibe no listview
            foreach (ServiceController service in services)
            {
                try
                {   //cria instância do ListViewItem
                    ListViewItem novoListViewItem = new ListViewItem();                 
                    //obtendo nome e status do serviço
                    novoListViewItem.Text = service.ServiceName.ToString();
                    novoListViewItem.SubItems.Add(service.Status.ToString());

                    //obtendo detalhes do serviço
                    RegistryKey regKey1 = Registry.LocalMachine.OpenSubKey("SYSTEM\\CurrentControlSet\\services\\" + service.ServiceName);
                    novoListViewItem.SubItems.Add(regKey1.GetValue("ImagePath").ToString());
                    novoListViewItem.SubItems.Add(regKey1.GetValue("Description").ToString());
                    regKey1.Close();
                    //exibindo as informações
                    lvServicos.Items.Add(novoListViewItem);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
    }

Vamos entender o código acima:

No laço foreach estamos percorrendo o array de serviços obtidos por GetServices.

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

O nome e o status do serviço são obtidos diretamente da classe ServiceController mas essa classe não fornece a descrição nem a localização do serviço.

Todas as informações dos serviços estão localizadas em "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services" onde na pasta services temos os valores das chaves "ImagePath" que indica a localização do serviço e "Description" que descreve o serviço.

Após obter essas informações a incluímos no objeto novoListViewItem e ao final incluímos esse objeto no ListView.

O código para criar as colunas no ListView esta definido no método MontaColunasListView() exibido a seguir:

        //Monta Coluna no ListView
        private void MontaColunasListView()
        {
            lvServicos.Columns.Add("Nome", 250, HorizontalAlignment.Left);
            lvServicos.Columns.Add("Status", 100, HorizontalAlignment.Left);
            lvServicos.Columns.Add("Localização", 500, HorizontalAlignment.Left);
            lvServicos.Columns.Add("Descrição", 500, HorizontalAlignment.Left);
        }

Executando o projeto iremos obter o seguinte resultado:

Na segunda parte do artigo eu vou mostrar como listar os serviços ativos do Windows.

Pegue o projeto completo aqui :  Tratando_Servicos.zip

Porque pela graça sois salvos, por meio da fé; e isto não vem de vós, é dom de Deus.
Não vem das obras, para que ninguém se glorie;
Efésios 2:8,9

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