ASP .NET - Gerenciando serviços como System.Management


KISS é um acrônimo de Keep it Simple Stupid é um principio 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 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.

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;

A seguir 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 duas colunas;

A partir da ToolBox inclua os seguintes controles:

Conforme o leiaute da página abaixo:

A aplicação deverá funcionar assim:

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

        Dim class1 As ManagementClass = New ManagementClass("Win32_Service")

        For Each ob As ManagementObject In class1.GetInstances
            Dim item1 As ListItem = New ListItem
            item1.Text = ob.GetPropertyValue("Name").ToString
            item1.Value = ob.GetPropertyValue("Caption").ToString
            ddlServicos.Items.Add(item1)
        Next

    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()

        Dim i As Integer = 0
        Dim class1 As ManagementClass = New ManagementClass("Win32_Service")
        For Each ob As ManagementObject In class1.GetInstances
            If ob.GetPropertyValue("State").ToString = "Running" Then
                System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1)
            End If

            If ob.GetPropertyValue("Name").ToString = ddlServicos.SelectedItem.Text.ToString Then
                Label2.Text = "Descrição : " + ob.GetPropertyValue("Description")
                Label3.Text = "Caminho : " + ob.GetPropertyValue("PathName")
                Label4.Text = "Tipo Serviço : " + ob.GetPropertyValue("ServiceType")
                Label5.Text = "StartMode : " + ob.GetPropertyValue("StartMode")
                Label6.Text = "Estado : " + ob.GetPropertyValue("State")
            End If

        Next

        Label7.Text = String.Empty
        Label7.Text = "Total de serviços em execução : " + i.ToString()
    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
        exibeStatus()
    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
        gerenciaServico("StartService")
        exibeStatus()
    End Sub

    Protected Sub lnkbStop_Click(ByVal sender As Object, ByVal e As EventArgs) Handles lnkbStop.Click
        gerenciaServico("StopService")
        exibeStatus()
    End Sub

   Protected Sub lnkbPause_Click(ByVal sender As Object, ByVal e As EventArgs) Handles lnkbPause.Click
        gerenciaServico("PauseService")
        exibeStatus()
    End Sub

    Protected Sub lnkbContinue_Click(ByVal sender As Object, ByVal e As EventArgs) Handles lnkbContinue.Click
        gerenciaServico("ResumeService")
        exibeStatus()
    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)

        Dim path As ManagementPath = New ManagementPath
        path.Server = System.Environment.MachineName
        path.NamespacePath = "root\CIMV2"
        path.RelativePath = "Win32_service.Name='" + ddlServicos.SelectedItem.Text.ToString + "'"
        Dim service As ManagementObject = New ManagementObject(path)
        Dim temp As ManagementBaseObject = service.InvokeMethod(status, Nothing, Nothing)
 
    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ências:

José Carlos Macoratti