Verificando se o usuário está online no sistema


Controle de Usuarios Um amigo semanas atrás me perguntou: _ Como consigo ver quem está online no Protheus e se posso ver alguns detalhes dos usuários? Então respondi a ele, "_ Porque você não usa o Monitor e o Configurador? " Mas ele me disse que o problema dele era que, como prestador de serviços, a empresa não liberava o acesso total a ele ao Configurador e Monitor, apenas criaria o programa e repassasse para o pessoal de TI que eles compilavam. Situação difícil né? Já passei por isso, e fiz algo parecido, juntei dados do configurador e do monitor. Mas essas informações não são difíceis de se mostrar, pois a Totvs disponibiliza no portal. Abaixo algo que montei, tem mais coisas que isso, como gerar relatórios de acessos, menus, módulos, etc... Relatorio de Acessos

Static Function VerOnline()
	aOnline := {}
	aUsuarios := allusers()
	ProcRegua(Len(aUsuarios))
	oUsuarios:SetOrder(1)
	oUsuarios:GoTop()
	For nx := 1 to Len(aUsuarios)
		PSWOrder( 1 )
		If PSWSeek( aUsuarios[nx][1][1], .T.)
			//Incproc("Processando "+Alltrim(PswRet()[1,4]))

			aLogon := FWUsrUltLog(PswRet()[1,1])
			if(aLogon[1]==dDatabase)
				nDuracao := SubtHoras(aLogon[1],aLogon[2],dDataBase,Left(Time(),5))
				If nDuracao < 0
					nDuracao := 0
				EndIf
				cDuracao := SUBSTR(STRZERO(nDuracao, 5, 2), 1, 2) + ":" + STRZERO((nDuracao - INT(nDuracao) )* 60, 2)
				aadd(aOnline,{Alltrim(PswRet()[1,4]),dtoc(aLogon[1]),aLogon[2],cDuracao,aLogon[3],aLogon[4],aLogon[5]})
			Endif
		Endif
	Next
	cSayOn1 := "Usuários OnLine ("+Alltrim(Str(nx))+"):"
	oSayOn1:Refresh()
	oOnline:SetOrder(1)
	oUsuarios:GoTop()
	oOnline:Refresh()
Return
Static Function fAtuOn(nLinha)
	IncProc("Iniciando…")
	UsrArray()
	oOnline:SetOrder(1)
	oUsuarios:GoTop()
	aOnline := {}
	ProcRegua(len(aUsrOn))
	For i := 1 to len(aUsrOn)
		ProcRegua(len(aUsrOn[i]))
		For y := 1 to len(aUsrOn[i])
			IncProc("Lendo"+aUsrOn[i][y][1])
			aadd(aOnline,{aUsrOn[i][y][1],aUsrOn[i][y][2],aUsrOn[i][y][3],aUsrOn[i][y][4],aUsrOn[i][y][5],aUsrOn[i][y][6],aUsrOn[i][y][7],;
			aUsrOn[i][y][8],aUsrOn[i][y][9],aUsrOn[i][y][10],aUsrOn[i][y][11],aUsrOn[i][y][12],aUsrOn[i][y][13]})
		Next
	Next
	oOnline:SetOrder(1)
	oUsuarios:GoTop()
	oOnline:Refresh()
	CursorArrow()
Return
Static Function UsrArray()	
	local oSrv     := nil
	local cEnv     := GetEnvServer() //Ambiente
	local aUsers   := {}
	local nIdx     := 0
	local aServers := {}
	local aTmp     := {}
	Local cSrvIp   := GETSERVERIP()
	Local aPortas  := {2280,2281,2282,2283})

	CURSORWAIT()
	IncProc("Localizando balances...")
	
	// neste caso, quero apenas o balance, que me retorna todos os slaves conectados.
	aadd(aServers, {cSrvIp, aPortas[1]})
	aadd(aServers, {cSrvIp, aPortas[2]})
	aadd(aServers, {cSrvIp, aPortas[3]})
	aadd(aServers, {cSrvIp, aPortas[4]})
	
	aUsrOn := {}
	
	For nIdx := 1 to len(aServers)
		IncProc("Ambiente: "+cEnv+" | Servidor: "+aServers[nIdx,1]+"/"+Alltrim(Str(aServers[nIdx,2])))
	     // conecta no slave via rpc
	     oSrv := rpcconnect(aServers[nIdx,1], aServers[nIdx,2], cEnv, "01", "01")
	     if valtype(oSrv) == "O"
	          oSrv:callproc("RPCSetType", 3)
	          // chama a funcao remotamente no server, retornando a lista de usuarios conectados
	          aTmp := oSrv:callproc("GetUserInfoArray")
	          aadd(aUsrOn, aclone(aTmp))
	          aTmp := nil
	          // limpa o ambiente
	          oSrv:callproc("RpcClearEnv")
	          // fecha a conexao
	          rpcdisconnect(oSrv)
	     else
	          return "Falha ao obter a lista de usuarios."
	     endif
	Next nIdx
	CursorArrow()
Return varInfo("usr",aUsers)
Espero que tenha sido útil! [sdm_download id="2534" fancy="1" new_window="1" button_text="Copiar agora!"] [sdm_download id="2737" fancy="1" new_window="1" button_text="Copiar agora!"]