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