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: