VB 2005 - Manipulando os serviços do Windows


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 XP 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 eu vou criar uma aplicação usando o Visual Basic 2005 para listar os serviços do Windows e dar a opção de parar ou iniciar um serviço.

Para alcançar o nosso objetivo iremos usar o namespace System.ServiceProcess . Este namespace fornece as classes que permitem a você implementar , instalar, e controlar as aplicações do tipo Windows Service.

Abra o Visual Basic 2005 Express Edition e crie um novo projeto do tipo Windows Forms usando a linguagem Visual Basic com o nome Controla_Servico.

Altere o nome do formulário form1.vb para ControlaServico.vb. Abaixo temos o leiaute do formulário e da aplicação em execução:

O leiaute do formulário foi montado usando os controles:

No evento Load do formulário criado vamos incluir o seguinte código que irá chamar a rotina LeSvsc(). Esta rotina será responsável por identificar os processos e ler os serviços do Windows listando-os no controle ListView.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Call LeSvcs()

End Sub

A rotina LeSvcs() possui o seguinte código:

Sub LeSvcs()
 

Dim listaSvcs() As ServiceProcess.ServiceController

Dim SingleSvc As ServiceProcess.ServiceController

 

Dim LVW As ListViewItem


listaSvcs = ServiceProcess.ServiceController.GetServices

lvwServices.Items.Clear()


Try

    For Each SingleSvc In listaSvcs

           LVW = lvwServices.Items.Add(SingleSvc.DisplayName)

           LVW.SubItems.Add(SingleSvc.ServiceName)

           LVW.SubItems.Add(SingleSvc.Status.ToString)

           LVW.SubItems.Add(SingleSvc.ServiceType.ToString)

    Next

Catch e As Exception

    MessageBox.Show("Não foi possivel iniciar o serviço. Reinicie o seu computador", "Erro Fatal: " & e.Source)

End Try

End Sub

Vamos entender o que foi feito:

- Declaramos um array listaSvsc() que receberá uma coleção de objetos do Windows service do tipo ServiceProcess.ServiceController

- Declaramos um variável SingeSvc que representa um único serviço do Windows como sendo do tipo ServiceProcess.ServiceController

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.

Estamos usando a classe ServiceController  para 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.

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

- Declaramos a variável LVW como do tipo de um item do controle ListView.

- Preenchemos o array obtendo uma lista de serviços através do comando :  ServiceProcess.ServiceController.GetServices

- Percorremos ao array criado obtendo o nome do serviço, o status e o tipo do serviço e preenchendo o controle ListView;

 For Each SingleSvc In listaSvcs

           LVW = lvwServices.Items.Add(SingleSvc.DisplayName)

           LVW.SubItems.Add(SingleSvc.ServiceName)

           LVW.SubItems.Add(SingleSvc.Status.ToString)

           LVW.SubItems.Add(SingleSvc.ServiceType.ToString)

 Next

 

Após ter os serviços exibidos no ListView devemos selecionar um serviço para Parar ou Iniciar. No evento Click do ListView incluímos o código que irá verificar se algum item selecionado, verificando em seguida qual o status do serviço. De acordo com o tipo do status o botão para Parar ou Iniciar o serviço será habilitado;

 

Private Sub lvwServices_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lvwServices.Click


If lvwServices.SelectedItems(0).Text <> "" Then

    Select Case lvwServices.SelectedItems(0).SubItems(2).Text

              Case "Stopped"

                cmdParar.Enabled = False

                cmdIniciar.Enabled = True

               Case "Running"

                 cmdParar.Enabled = True

                 cmdIniciar.Enabled = False

               Case Else

                  cmdParar.Enabled = False

                  cmdIniciar.Enabled = False

     End Select

End If

End Sub

A abaixo temos o código so botões Parar Serviço e Iniciar Serviço :

Private Sub cmdParar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdParar.Click

If lvwServices.SelectedItems(0).Text <> "" Then

     Call PararServico(lvwServices.SelectedItems(0).SubItems(1).Text) '

End If

End Sub

 

Private Sub cmdIniciar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdIniciar.Click

If lvwServices.SelectedItems(0).Text <> "" Then

       Call IniciaServico(lvwServices.SelectedItems(0).SubItems(1).Text)

End If

End Sub

 

Agora vamos ao código das rotinas PararServico() e IniciarServico() :

Sub PararServico(ByVal nomeServico As String)
 

Dim listaSvcs() As ServiceProcess.ServiceController '

Dim SingleSvc As ServiceProcess.ServiceController


listaSvcs = ServiceProcess.ServiceController.GetServices


Try

   For Each SingleSvc In listaSvcs

              If UCase(SingleSvc.ServiceName) = UCase(nomeServico) Then

                  SingleSvc.Stop()

                        Call LeSvcs()

                  Exit For

               End If

    Next

Catch e As Exception

    MessageBox.Show("Não é possivel parar o serviço. Veririque se o mesmo esta habilitado", "Erro Fatal : " & e.Source)

End Try

End Sub

 

Sub IniciarServico(ByVal nomeServico As String)


Dim listaSvcs() As ServiceProcess.ServiceController

Dim SingleSvc As ServiceProcess.ServiceController


listaSvcs = ServiceProcess.ServiceController.GetServices


Try

     For Each SingleSvc In listaSvcs

               If UCase(SingleSvc.ServiceName) = UCase(nomeServico) Then

               SingleSvc.Start()

                    Call LeSvcs()

                    Exit For

               End If

        Next

Catch e As Exception

     MessageBox.Show("O serviço não pode ser iniciado.. Verifique se esta realmente parado.", "Erro Fatal: " & e.Source)

End Try

End Sub

Acabamos de mostrar que usando os recursos do namespace  ServiceProcess.ServiceController criamos uma aplicação para manipular os serviços do Windows.

Pegue o projeto completo aqui : ControlaWinservice.zip

Eu sei é apenas VB.NET , mas eu gosto...

referências:


José Carlos Macoratti