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 
 lvwServices.Items.Clear() 
     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 ExceptionMessageBox.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
 Case "Stopped" cmdParar.Enabled = FalsecmdIniciar.Enabled = TrueCase "Running" cmdParar.Enabled = TruecmdIniciar.Enabled = FalseCase Else cmdParar.Enabled = FalsecmdIniciar.Enabled = FalseEnd 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 <> "" ThenCall 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 <> "" ThenCall 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 
 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)
     
 
 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