Geomar Canjundo Postado Junho 10, 2009 Denunciar Share Postado Junho 10, 2009 Olá Como faço para saber o nome de uma máquina em Rede?Ou seja a quero impedir que usuário aceda ao sistema em duas máquinas em simultâneo e a ideia é que se isso acontecer, o sistema envie a mensagem ("o usuário já está logado na máquina nome da máquina")Aguardo ajudasGeomar Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 William - TI Postado Junho 10, 2009 Denunciar Share Postado Junho 10, 2009 Amigo para pegar o nome local da maqui é esta funcão abaixofunction NomeComputador : String;var lpBuffer : PChar; nSize : DWord;const Buff_Size = MAX_COMPUTERNAME_LENGTH + 1;begin nSize := Buff_Size; lpBuffer := StrAlloc(Buff_Size); GetComputerName(lpBuffer,nSize); Result := tiramascara(String(lpBuffer)); StrDispose(lpBuffer);end;agora para fazer oque você esta querendo o ideal é criar uma tabela acesso_sistema.quando o usuario logar você salva nesta tabela a data hora minuto segundo que ele logou o nome da maquina e o nome ou codigo do usuario esta tabela deverá conter o campo status onde 0 será logado e 1 será não logado, ao fechar o sistema você deve muda o status do registro para 1. toda vez que o usuario tentar acessar o sistema você faz uma busca na base de dados pegando o dia atual e verificando se tem status 0 se tiver é so mostrar a menssagem você esta logado na maqina TAL. imagino que isso resolva seu problema.qualquer duvida estamos aqui para te ajudar. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Geomar Canjundo Postado Junho 10, 2009 Autor Denunciar Share Postado Junho 10, 2009 Amigo para pegar o nome local da maqui é esta funcão abaixofunction NomeComputador : String;var lpBuffer : PChar; nSize : DWord;const Buff_Size = MAX_COMPUTERNAME_LENGTH + 1;begin nSize := Buff_Size; lpBuffer := StrAlloc(Buff_Size); GetComputerName(lpBuffer,nSize); Result := tiramascara(String(lpBuffer)); StrDispose(lpBuffer);end;agora para fazer oque você esta querendo o ideal é criar uma tabela acesso_sistema.quando o usuario logar você salva nesta tabela a data hora minuto segundo que ele logou o nome da maquina e o nome ou codigo do usuario esta tabela deverá conter o campo status onde 0 será logado e 1 será não logado, ao fechar o sistema você deve muda o status do registro para 1. toda vez que o usuario tentar acessar o sistema você faz uma busca na base de dados pegando o dia atual e verificando se tem status 0 se tiver é so mostrar a menssagem você esta logado na maqina TAL. imagino que isso resolva seu problema.qualquer duvida estamos aqui para te ajudar. Viva William, Valeu.Obrigado pela ajuda e disponibilidade.Vou seguir o que você me sugeriu já tinha isso na cabeça só a minha dúvida será:Eu já tenho uma Tabela Usuário, relaciono-a com uma Tabela_Acesso ou posso fazer isso mesmo na Tabela Usuário? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 William - TI Postado Junho 10, 2009 Denunciar Share Postado Junho 10, 2009 Isto vai do que você quiser fazer se voce criar uma tabela como sugeri você automaticamente terá um log de acesso.caso queira usar a propia tabela de usuario funcionará perfeitamente tb, você só não terá o log de acesso, mais sem problemas.até mais abraço. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Geomar Canjundo Postado Junho 10, 2009 Autor Denunciar Share Postado Junho 10, 2009 Isto vai do que você quiser fazer se voce criar uma tabela como sugeri você automaticamente terá um log de acesso.caso queira usar a propia tabela de usuario funcionará perfeitamente tb, você só não terá o log de acesso, mais sem problemas.até mais abraço.Criando uma outra tabela, caso o usuario log no sistema varias vezes num dia, como saberei como o faria para o sistema me dar a maquina atual? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 William - TI Postado Junho 10, 2009 Denunciar Share Postado Junho 10, 2009 Isto é bem simples, vou te dar um exempolo em mysql e delphi que é o que estou mais abtuadotabela id |data |Maquina |hora | status |Usuario1 |10/06/2009 | Servidor| 12:00:00 | 1 |William2 |10/06/2009 | est001 | 13:00:00 | 1 |William3 |10/06/2009 | est002 | 14:00:00 | 1 |William4 |10/06/2009 | Servidor| 15:00:00 | 0 |Williamo que eu faço na hora de entrar no sistema eu pesquisao apnas se a registro no mesmo dia com status 0 para o meu usuario assimSelect * from TABELA where data="10/06/2006" and usuario="william" ans status=0 este select me me retornara apenas o que esta em aperto id |data |Maquina |hora | status |Usuario4 |10/06/2009 | Servidor| 15:00:00 | 0 |Williamentão saberei que no servidor estou logado no meu nome.caso não retorne nada não estou logado em lugar nem um.qualquer coisa posta ai. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Geomar Canjundo Postado Junho 11, 2009 Autor Denunciar Share Postado Junho 11, 2009 Isto é bem simples, vou te dar um exempolo em mysql e delphi que é o que estou mais abtuadotabela id |data |Maquina |hora | status |Usuario1 |10/06/2009 | Servidor| 12:00:00 | 1 |William2 |10/06/2009 | est001 | 13:00:00 | 1 |William3 |10/06/2009 | est002 | 14:00:00 | 1 |William4 |10/06/2009 | Servidor| 15:00:00 | 0 |Williamo que eu faço na hora de entrar no sistema eu pesquisao apnas se a registro no mesmo dia com status 0 para o meu usuario assimSelect * from TABELA where data="10/06/2006" and usuario="william" ans status=0 este select me me retornara apenas o que esta em aperto id |data |Maquina |hora | status |Usuario4 |10/06/2009 | Servidor| 15:00:00 | 0 |Williamentão saberei que no servidor estou logado no meu nome.caso não retorne nada não estou logado em lugar nem um.qualquer coisa posta ai.William foi exatamente da forma que fiz, e acho até que fiz de forma mais completa:TabAcessoId, Datam, hota, status, maquina, userWith qryacesso dobeginclose;Sql.Clear;Sql.Text:='select * from Tabacesso where user="geomar" order by Id';open;Last// último registo de geomar salvo na tabelaIf Isempty thenbeginConcedeAcesso //procedimento que crieiSalvaDadosEmAcesso;endelseIf TabacessoStatus.Text='sim' thenbeginShowmessage('A sessão do utilizador está aberta em, '+ TabAcessomaquina.text)Abort;endelsebeginConcedeAcesso;SalvaDadosEmAcesso;end;end;e está a funcionar perfeitamente, e quando tiver de sair criei um procedimento Desconectautilizador o Evento Onclose do FormPrincipal.Valeu,Qualquer dica é só apitarAbraços! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Junho 11, 2009 Denunciar Share Postado Junho 11, 2009 (editado) OpaSó uma opinião, se por acaso acontecer do sistema travar, a maquina travar e ter que reiniciar vai constar na tabela que o usuário está logado...portanto, o que voce pode tambem é adicionar um timer no programa que escreva a data e hora em um campo desta mesma tabela a cada x minutos exemploa cada 5 minutos, ou seja, o timer com a propriedade para 300000, ele escreva no campo lastcheckh a Hora e lastcheckd o diaassim quando um usuario for logar e retornar que esta logado, voce faz a comparacao de dias e da ultima hora checada.... se for maior do que uns 6 minutos significa que pode ter acontecido travamento ou se o dia for maior ou igual a 1entendeu?porque vamos supor,Voce loga na Maquina A okA maquina trava ou cai a força, ou seja, o DesconectaUtilizador não vai ser chamadoA maquina reinicia e voce vai logar denovo...PAM!Voce já está logado! rsentendeu?espero que minha dica tenha sido útil e que eu não estou falando besteira na manhã deste feriado (ressaca) :blink:ahuahuauhaabraxxx Editado Junho 11, 2009 por Churc Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Geomar Canjundo Postado Junho 11, 2009 Autor Denunciar Share Postado Junho 11, 2009 OpaSó uma opinião, se por acaso acontecer do sistema travar, a maquina travar e ter que reiniciar vai constar na tabela que o usuário está logado...portanto, o que voce pode tambem é adicionar um timer no programa que escreva a data e hora em um campo desta mesma tabela a cada x minutos exemploa cada 5 minutos, ou seja, o timer com a propriedade para 300000, ele escreva no campo lastcheckh a Hora e lastcheckd o diaassim quando um usuario for logar e retornar que esta logado, voce faz a comparacao de dias e da ultima hora checada.... se for maior do que uns 6 minutos significa que pode ter acontecido travamento ou se o dia for maior ou igual a 1entendeu?porque vamos supor,Voce loga na Maquina A okA maquina trava ou cai a força, ou seja, o DesconectaUtilizador não vai ser chamadoA maquina reinicia e voce vai logar denovo...PAM!Voce já está logado! rsentendeu?espero que minha dica tenha sido útil e que eu não estou falando besteira na manhã deste feriado (ressaca) :blink:ahuahuauhaabraxxxChurc a sua dica é útil demais cara, aliás já aconteceu num dos testes da aplicação, mas voce pode postar o código para executar essa rotina? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Junho 12, 2009 Denunciar Share Postado Junho 12, 2009 (editado) Fala Geomar!Então brother, eu escrevi escrevi escrevi e no fim de tudo cheguei a conclusao de há como burlar facilmente, basta alterar a data do computador que o usuário quer logar denovo...Há outros meios usando Sockets, que fazem com que dois programas se comunicam em rede mas acho um tanto que complicado para isso...de qualquer forma, segue a minha antiga idéia...vamos botar a cabeça pra funcionar hein hehevocê é bem inteligente, então vou dar os passos aqui e voce faz ok?primeiro crie dois campos nesta mesma tabela de acessos, um para a Data e outro para a Horaeu não sei que banco de dados voce usa e os esquemas dos campos então não sei te dizer o tipo do campoum campo é referente a Data, vamos chamá-lo de "LastSeemDate" ou seja, última data visto...o outro campo é referente a Hora, vamos chamá-lo então de "LastSeemTime", última hora em que foi visto...a idéia é ter um timer da paleta System do Delphi no seu programa, na tela em que o usuário visualizará após ter logado no sistema, com o Interval para 300000 que equivale a 5 minutos, com a propriedade Enabled para True e no evento OnTimer deste timer, voce grava no banco de dados a Data e Hora atualse quiser aumentar ou diminuir o tempo, faça 1000 x 60 x numero de minutosInterval de 1000 = 1 segundo, x 60 igual a 1 minuto ou seja, para tres minutos faça na calculadora: 1000 x 60 x 3 e por ai vai, ai coloque o resultado na propriedade Interval do Timer...Até aqui tudo certo, tudo que este timer irá fazer é ficar atualizando estes campos com a data e hora da última vez em que o usuário foi vistoDepois na parte em que voce checa se o usuário está logado na rede, voce tambem verifica a última data e hora que ele foi visto e compara com a data atualuses DateUtils;... (seu codigo de verificar se o usuario esta logado)if isEmpty thenif (LastSeemDate = Now) and (MinutesBetween(LastSeemTime, Time) <= 5) thenO usuario esta logado elsenão esta então pode conceder acessoentendeu?porém é como falei, da pra burlar facilmente...espero q alguém tenha outra idéia e se surgir alguma te dou um toque!abrxx Editado Junho 12, 2009 por Churc Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Geomar Canjundo Postado Junho 15, 2009 Autor Denunciar Share Postado Junho 15, 2009 Fala Geomar!Então brother, eu escrevi escrevi escrevi e no fim de tudo cheguei a conclusao de há como burlar facilmente, basta alterar a data do computador que o usuário quer logar denovo...Há outros meios usando Sockets, que fazem com que dois programas se comunicam em rede mas acho um tanto que complicado para isso...de qualquer forma, segue a minha antiga idéia...vamos botar a cabeça pra funcionar hein hehevocê é bem inteligente, então vou dar os passos aqui e voce faz ok?primeiro crie dois campos nesta mesma tabela de acessos, um para a Data e outro para a Horaeu não sei que banco de dados voce usa e os esquemas dos campos então não sei te dizer o tipo do campoum campo é referente a Data, vamos chamá-lo de "LastSeemDate" ou seja, última data visto...o outro campo é referente a Hora, vamos chamá-lo então de "LastSeemTime", última hora em que foi visto...a idéia é ter um timer da paleta System do Delphi no seu programa, na tela em que o usuário visualizará após ter logado no sistema, com o Interval para 300000 que equivale a 5 minutos, com a propriedade Enabled para True e no evento OnTimer deste timer, voce grava no banco de dados a Data e Hora atualse quiser aumentar ou diminuir o tempo, faça 1000 x 60 x numero de minutosInterval de 1000 = 1 segundo, x 60 igual a 1 minuto ou seja, para tres minutos faça na calculadora: 1000 x 60 x 3 e por ai vai, ai coloque o resultado na propriedade Interval do Timer...Até aqui tudo certo, tudo que este timer irá fazer é ficar atualizando estes campos com a data e hora da última vez em que o usuário foi vistoDepois na parte em que voce checa se o usuário está logado na rede, voce tambem verifica a última data e hora que ele foi visto e compara com a data atualuses DateUtils;... (seu codigo de verificar se o usuario esta logado)if isEmpty thenif (LastSeemDate = Now) and (MinutesBetween(LastSeemTime, Time) <= 5) thenO usuario esta logado elsenão esta então pode conceder acessoentendeu?porém é como falei, da pra burlar facilmente...espero q alguém tenha outra idéia e se surgir alguma te dou um toque!abrxxChurc,Do que me deu para perceber desse Post, a ideia é verificar se o usuario está logado ou não?Se sim, a minha ideia é saber como fazer o procedimento DesconectaUsuario dispare se eventualmente houver algo de anormal de termina com a aplicação bruscamente. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 William - TI Postado Junho 15, 2009 Denunciar Share Postado Junho 15, 2009 Caro amigo para apenas marcar no sistema como não logado. é simples usando o exemplo que te dei em cimaid |data---------|Maquina-- |hora -----| status |Usuario1 |10/06/2009 | Servidor--| 12:00:00| 1 -----|William2 |10/06/2009 | est001 ---| 13:00:00 | 1 ------|William3 |10/06/2009 | est002 ---| 14:00:00 | 1 ------|William4 |10/06/2009 | Servidor--| 15:00:00| 0 ------|Williamno select vai aprarecer que esta logado correto 4 |10/06/2009 | Servidor--| 15:00:00| 0 ------|Williamai é só você verificar se hora atual é maior que hora da tabela + 00:05:00 caso for de um update tabela set status=1 where status =0 e logar no sistema caso contrario de a menssagem "você esta logado na maquia tal".para isso é só.agora em questão de segurança como nosso amigo churc sitou, para resolver em partes basta você nunca pegar a hora do micro local e sim do servidor como uso mysql eu pego a hora do mysql, pois usuarios normais geralmente não tem acesso ao servidor, isto deve resolver.qualquer coisa posta ai. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Geomar Canjundo
Olá Como faço para saber o nome de uma máquina em Rede?
Ou seja a quero impedir que usuário aceda ao sistema em duas máquinas em simultâneo e a ideia é que se isso acontecer, o sistema envie a mensagem
("o usuário já está logado na máquina nome da máquina")
Aguardo ajudas
Geomar
Link para o comentário
Compartilhar em outros sites
11 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.