Dev (Back & Front)ARTIGO

ASP .NET – Gerenciamento de serviços usando o System.Management

KISS é um acrônimo de Keep it Simple Stupid, um princípio
geral que valoriza a simplicidade dos projetos e defende que toda a complexidade
desnecessária seja descartada.

Neste artigo eu vou criar uma singela aplicação ASP .NET para ajudar a
gerenciar os serviços que estão rodando em nosso sistema seguindo o princípio
KISS (Lembre-se que estamos
no servidor.)

Um serviço do Windows é uma aplicação que inicia
quando o Windows é carregado e roda em segundo plano enquanto o sistema operacional 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.

Vamos abrir o Visual Web Developer 2010 Express
Edition e criar um novo projeto do tipo ASP .NET Web Application com o nome
GerenciaServicos;

Em seguida, vamos incluir um novo Web Form ao projeto no menu Project->Add New
Item selecione Web Forms e informe o nome Default.aspx e clique em Add.

Depois, vamos incluir uma referência ao namespace System.Mangement
para termos acesso ao rico conjunto de informação de gerenciamento e eventos
sobre o sistema, dispositivos e aplicações instrumentadas para
Windows Management Instrumentation (WMI). Dessa
forma podemos realizar consultas sobre espaço livro, informações sobre a CPU,
etc.

No menu Project selecione Add Reference e na janela Add Reference selecione a
aba .NET selecionando em seguida System.Mnagement e clicando em OK.

Selecione a página Default.aspx e inclua, a partir do menu Table, uma
tabela com 8 linhas e 2 colunas.

A partir da ToolBox, inclua os seguintes controles:

  • 1 DropDownList: ID=ddlServicos
  • 7 Labels: IDs =
    label1,label2,label3,label4,label5,label6,label7
  • 1 Button: ID=btnExibirServicos
  • 4 LinkButton: IDs: lnkbStart, lnkbStop, lnkbPause,
    lnkbContinue

Conforme o leiaute da página abaixo:

A aplicação deverá funcionar assim:

  • Ao ser executada, a página Default.aspx é apresentada;
  • O usuário clica no botão “Exibir Serviços” para preencher o controle
    dropdownlist com os serviços disponíveis;
  • O usuário poderá selecionar um serviço para obter informações que serão
    exibidas nos controles Labels da página;
  • O usuário pode, também, clicar em um dos controles LinkButton para realizar
    as seguintes tarefas: iniciar, parar, pausar e continuar um serviço;

Vamos começar com a definição do código do evento Click do botão
Exibir Serviços:

Protected Sub btnExibirServicos_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnExibirServicos.Click<br /><br />        Dim class1 As ManagementClass = New ManagementClass("Win32_Service")<br /><br />        For Each ob As ManagementObject In class1.GetInstances<br /><br />            Dim item1 As ListItem = New ListItem<br />            item1.Text = ob.GetPropertyValue("Name").ToString<br />            item1.Value = ob.GetPropertyValue("Caption").ToString<br />            ddlServicos.Items.Add(item1)<br />        Next<br />    End Sub

Este código obtém informações dos serviços e exibe o nome de cada um no
controle DropDownList da página usando a classe ManagementClass.

A classe ManagementClass representa a classe de gerenciamento
Common Information Model (CIM), onde uma classe de
gerenciamento é uma classe WMI como um Win32_LogicalDisk
que representa um drive de disco, e
Win32_Process
que representa um processo como a execução de um aplicativo como o Bloco de
Notas. Os membros desta classe permitem que possamos acessar os dados

WMI usando
uma classe WMI.

Ao selecionar um serviço no
dropdownlist serão exibidas
informações nos controles
Labels
para isso vamos definir uma rotina chama
exibeStatus
com o seguinte código:

Private Sub exibeStatus()<br /><br />        Dim i As Integer = 0<br />        Dim class1 As ManagementClass = New ManagementClass("Win32_Service")<br />        For Each ob As ManagementObject In class1.GetInstances<br />            If ob.GetPropertyValue("State").ToString = "Running" Then<br />                System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1)<br />            End If<br /><br />            If ob.GetPropertyValue("Name").ToString = ddlServicos.SelectedItem.Text.ToString Then<br />                Label2.Text = "Descrição : " + ob.GetPropertyValue("Description")<br />                Label3.Text = "Caminho : " + ob.GetPropertyValue("PathName")<br />                Label4.Text = "Tipo Serviço : " + ob.GetPropertyValue("ServiceType")<br />                Label5.Text = "StartMode : " + ob.GetPropertyValue("StartMode")<br />                Label6.Text = "Estado : " + ob.GetPropertyValue("State")<br />            End If<br /><br />        Next<br /><br />        Label7.Text = String.Empty<br />        Label7.Text = "Total de serviços em execução : " + i.ToString()<br />    End Sub

Devemos definir a chamada desta rotina no evento
SelectedIndexChanged do dropdownlist ddlServicos

Protected Sub ddlServicos_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles ddlServicos.SelectedIndexChanged<br />        exibeStatus()<br />    End Sub

Em cada evento Click dos controles LinkButton devemos definir o
código conforme a seguir:

  Protected Sub lnkbStart_Click(ByVal sender As Object, ByVal e As EventArgs) Handles lnkbStart.Click<br />        gerenciaServico("StartService")<br />        exibeStatus()<br />    End Sub<br /><br />    Protected Sub lnkbStop_Click(ByVal sender As Object, ByVal e As EventArgs) Handles lnkbStop.Click<br />        gerenciaServico("StopService")<br />        exibeStatus()<br />    End Sub<br /><br />   Protected Sub lnkbPause_Click(ByVal sender As Object, ByVal e As EventArgs) Handles lnkbPause.Click<br />        gerenciaServico("PauseService")<br />        exibeStatus()<br />    End Sub<br /><br />    Protected Sub lnkbContinue_Click(ByVal sender As Object, ByVal e As EventArgs) Handles lnkbContinue.Click<br />        gerenciaServico("ResumeService")<br />        exibeStatus()<br />    End Sub

Vemos a chamada a rotina gerenciaServicos() passando como parâmetro a
ação desejada e, depois, à rotina exibeStatus(), para exibir o estado atual.

O código da rotina gerenciaServicos() é dado a seguir:

 Private Sub gerenciaServico(ByVal status As String)<br /><br />        Dim path As ManagementPath = New ManagementPath<br />        path.Server = System.Environment.MachineName<br />        path.NamespacePath = "root\CIMV2"<br />        path.RelativePath = "Win32_service.Name='" + ddlServicos.SelectedItem.Text.ToString + "'"<br />        Dim service As ManagementObject = New ManagementObject(path)<br />        Dim temp As ManagementBaseObject = service.InvokeMethod(status, Nothing, Nothing)<br /><br />    End Sub

Neste código vemos a classe ManagementPath, que fornece um invólucro
para realizar o parse e construir caminhos para objeto WMI.

Windows Management Instrumentation (WMI) é a infra-estrutura para
gerenciamento de dados e operações no sistema Operacional Windows. Podemos
escrever scripts WMI para automatizar tarefas administrativas em
computadores remotos  e outras partes do sistema operacional.

A maioria das classes WMI para gerenciamento estão no
namespace root\cimv2.

Executando a aplicação, iremos obter o seguinte resultado:

Dessa forma, mostrei que de uma maneira simples, segundo o princípio KISS,
podemos gerenciar informações do sistema em uma aplicação ASP .NET.

Pegue o código completo usado no
artigo aqui: GerenciaServicos.zip

Eu sei é apenas ASP .NET,
mas eu gosto…

é referência em Visual Basic no Brasil e autor dos livros "Aprenda Rápido: ASP" e "ASP, ADO e Banco de Dados na Internet". Mantenedor do site macoratti.net.

Ver perfil