Função para matar conexões no Protheus

Função para matar conexões no Protheus

Olá pessoal…

Hoje vou mostrar uma rotina que criei que mata os usuários de uma conexão no Protheus.

Essa função, pega todas os logins ativos em um serviço do Protheus, e tenta matar uma por uma.

Abaixo a função completa desenvolvida:

//Bibliotecas
#Include "Protheus.ch"

/*/{Protheus.doc} zMataTudo
Função que mata todas as conexões ativas do Protheus
@author Atilio
@since 21/09/2017
@version 1.0
@type function
@obs Documentação no TDN
	GetUserInfoArray - http://tdn.totvs.com/display/tec/GetUserInfoArray
	KillUser         - http://tdn.totvs.com/display/tec/KillUser
/*/

User Function zMataTudo()
	Local aArea      := GetArea()
	Local aThreads   := {}
	Local nConexAtu  := 1
	Local nTentativa := 1
	Local nMaxTenta  := 10
	
	//Se não tiver preparado o ambiente (Schedule)
	If Select("SX2") == 0
		RPCSetType(3)
		RPCSetEnv("01", "01", "", "", "")
	EndIf
	
	ConOut("[zMataTudo] Inicio - " + dToC(Date()) + " " + Time())
	
	//Pega todos os usuários conectados
	aThreads := GetUserInfoArray()
	
	//Enquanto houver tentativas para finalizar as threads
	While nTentativa <= nMaxTenta
		//Percorre todas as conexões
		For nConexAtu := 1 To Len(aThreads)
			
			//Se a thread da conexão atual for diferente da thread atual (senão vai matar o processo que mata todos)
			If aThreads[nConexAtu][3] != ThreadId()
				KillUser( aThreads[nConexAtu][1],; //UserName
				          aThreads[nConexAtu][2],; //ComputerName
				          aThreads[nConexAtu][3],; //ThreadId
				          aThreads[nConexAtu][4])  //ServerName
				
				ConOut("[zMataTudo] "+;
				       "(Tentativa "+cValToChar(nTentativa)+") " + ;
				       "Usuario '"+Alltrim(aThreads[nConexAtu][1])+"', " + ;
				       "Server '"+aThreads[nConexAtu][4]+"', " + ;
				       "Thread '"+cValToChar(aThreads[nConexAtu][3])+"', " + ;
				       "Tempo Total de Conexão '"+aThreads[nConexAtu][8]+"' ")
			EndIf
		Next
		
		//Pega novamente todos os usuários conectados
		aThreads := GetUserInfoArray()
		
		//Se ainda houver registros, aumenta a tentativa e espera 1 segundo
		If Len(aThreads) > 1
			nTentativa++
			Sleep(1000)
			
		//Senão finaliza o laço de repetição
		Else
			Exit
		EndIf
	EndDo
	
	ConOut("[zMataTudo] Termino - " + dToC(Date()) + " " + Time())
	
	RestArea(aArea)
Return

Esses e outros códigos, estão disponíveis gratuitamente no nosso GitHub, acesse em github.com/dan-atilio/AdvPL.
Caso queira uma customização específica para sua empresa, saiba mais em nossa Loja.

Ao executar, ele mostra mensagens no console.log dentro da pasta appserver com os dados dos usuários que foram desligados.

Saída no console.log
Saída no console.log

Bom pessoal, por hoje é só.
Abraços e até a próxima.

About Dan_Atilio

Analista e desenvolvedor de sistemas. Técnico em Informática pelo CTI da Unesp. Graduado em Banco de Dados pela Fatec Bauru. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor do projeto Terminal de Informação, onde são postados tutoriais e notícias envolvendo o mundo da tecnologia.

Deixe uma resposta

%d blogueiros gostam disto: