Olá pessoal,
Boa tarde!
Neste post vou demonstrar como gerenciar serviços do Windows (Windows Services) a partir do banco de dados SQL Server, utilizando o SQLCLR para realizar essas operações. Isso pode ser especialmente útil na criação de monitoramentos de determinados serviços.
Atualmente onde eu trabalho, criei uma tabela de configuração do monitoramento de serviços, onde determino os dados dos serviços que pretendo monitorar, como nome do servidor, nome do serviço, se ao falhar precisa enviar sms e se ao falhar a própria rotina deve se encarregar de iniciar o serviço automaticamente. O e-mail com a lista dos serviços que tiveram alteração de situação é sempre enviado. Uma vez configurado, são realizadas coletas via job a cada X minutos da situação desses serviços e esse dados são armazenados em uma tabela de histórico.
Com isso, é possível realizar medidores de disponibilidade dos serviços e utilizando o Reporting Services 2016 para criar relatórios lendo da tabela de histórico, pode-se recuperar os dados atuais dessa tabela e acompanhar a situação de diversos serviços, em diversos servidores, de qualquer lugar: Seja pelo Browser (acessando o caminho do Reporting Services) ou pelo celular (utilizando o aplicativo do PowerBI), sem a necessidade de ter um computador por perto, conectar na VPN da empresa ou comprar um sistema de monitoramento, que além de ter altos custos, nem sempre oferece essa flexibilidade.
Para realizar essas operações com o CLR, vou listar duas maneiras diferentes de se obter essas informações, e depois de ler, vocês vão entender o porque. No código-fonte que vocês vão ler abaixo, utilizei a classe Retorno para gerenciar avisos e mensagens de erro que envio para o banco de dados e ela é pré-requisito para a utilização das Stored Proecedures de gerenciamento de serviços. Você pode encontrar o código-fonte da classe Retorno no post SQL Server – Como enviar avisos e mensagens de erro para o banco pelo CLR (C#).
Vou demonstrar duas formas distintas de fazer a mesma coisa. A primeira delas, utiliza binários nativos do próprio sistema operacional e, principalmente na parte de listagem de serviços, existem manipulações manuais de informações, que no caso da outra classe que vou apresentar, isso já está encapsulado no framework .NET. O que mais me motiva a utilizar essa primeira alternativa é que ela não possui nenhuma dependência de DLL fora das DLL’s padrão suportadas e recomendadas pela Microsoft. Já a biblioteca System.ServiceProcess requer várias outras DLL’s não suportadas que ela possui dependências.
Quando seu banco apresenta algum problema e você envia o DUMP do erro pra Microsoft, a primeira coisa que o consultor irá apontar como problema são DLL’s do CLR não suportadas pela Microsoft, como a System.ServiceProcess, então prefiro evitar. Essas DLL’s não suportadas são DLL’s que podem ser registradas manualmente, mas não no modo SAFE, inclusive, já havia falado sobre isso no post Introdução ao SQL CLR (Common Language Runtime) no SQL Server.
Utilizando a classe Process da biblioteca System.Diagnostics Utilizando a classe ServiceController da biblioteca System.ServiceProcessÉ isso aí, pessoal!
Espero que tenham gostado do post. É muito legal criar coisas diferentes utilizando o banco de dados.
Qualquer dúvida, deixem aqui nos comentários.
Abraço!
sql server clr sqlclr service controller sc wmic windows services serviços windows listar iniciar parar list view start stop
sql server clr sqlclr service controller sc wmic windows services serviços windows listar iniciar parar list view start stop