Clique no banner para conhecer e adquirir o meu treinamento de Bancos de Dados no Azure

SQL Server – Como parar, iniciar e listar os serviços do Windows remotamente

Visualizações: 1.484 views
Tempo de Leitura: 7 minutos

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.

SQL Server - CLR Object Dependencies System.ServiceProcess ServiceController Class

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
Uma das formas de se conseguir realizar essas atividades pelo CLR, é utilizando a classe Process, que nos permite executar comandos do Prompt-DOS dentro do C#. Com isso, pode-se utilizar o binário sc.exe (saiba mais sobre ele clicando neste link) para parar e iniciar os serviços, e o binário wmic.exe (saiba mais sobre ele clicando neste link) para listar os serviços.

Como listar os serviços de um servidor:

SQL Server - SC binary CLR list windows services Windows Service Manager

SQL Server - SC binary CLR list windows services

Como iniciar um serviço:

SQL Server - SC binary CLR start windows services2

Como parar um serviço:

SQL Server - SC binary CLR stop windows services

Utilizando a classe ServiceController da biblioteca System.ServiceProcess

Como listar os serviços de um servidor:

SQL Server - SC binary CLR list windows services Windows Service Manager

SQL Server - SC ServiceController Class CLR list windows services

Como iniciar um serviço:

SQL Server - SC ServiceController Class CLR start windows services

Como parar um serviço:

SQL Server - SC ServiceController Class CLR stop windows services

É 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