none
Retorna o IP do cliente RRS feed

  • Pergunta

  • Galera preciso pega o ip do cliente, 

    gostaria de saber se tem como fazer da mesma forma que se faz pra pega o nome da maquina que seria:

    SELECT host_name() AS maquina_cliente

     

    Mas preciso do IP

    Alguém sabe como q faz?

    Antecipo agradecimentos.

    • Movido Gustavo Maia Aguiar segunda-feira, 3 de outubro de 2011 02:01 (De:SQL Server - Desenvolvimento Geral)
    quinta-feira, 29 de setembro de 2011 00:08

Respostas

  • No caso você teria de criar a trigger para capturar a informação do IP do cliente.

    Quando um novo cliente conectar no servidor, a trigger vai ser ativada e com isso o comando que retornou NULL vai retornar o IP do cliente e salvar o mesmo em uma tabela.

    Não sei lhe dizer outra maneira de capturar o IP sem usar a DDL trigger.

    Hoje na minha empresa fazemos uso da trigger para auditar quando necessário os logins no servidor. Usando uma estrutura parecida com o do exemplo do link que adicionei no primeiro post, coletamos várias informações sobre os logins e quando um login vem de um IP sendo do servidores de desenvolvimento por exemplo, a trigger bloqueia. Todas as informações são salvas em uma tabela para futura consultas.

    No seu caso, acho que apenas o código abaixo resolveria

     

     

    --CRIA O BANCO AUXILIAR
    CREATE DATABASE DBMONITOR
    GO
    
    --CRIA A TABELA PARA SALVAR O IP
    USE DBMONITOR
    CREATE TABLE tblClientIP(IPAdress nvarchar(15))
    GO
    
    --CRIA A TRIGGER PARA LOGAR AS INFORMACOES
    CREATE TRIGGER save_ipaddress
    ON ALL SERVER
    FOR LOGON
    AS
    BEGIN
                DECLARE @capturedip NVARCHAR(15);
                SET @capturedip = (SELECT EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'NVARCHAR(15)'));
                
                         
    			INSERT INTO DBMONITOR.dbo.tblClientIP VALUES(@capturedip)
    			
                
    END
    GO
    
    
    


    Geralmente nos servidores de produção eu adiciono um banco de dados especifico para esse tipo de tarefa. No meu caso , a tabela tblClienteIP fica em um banco chamado DBMonitor. 

    Depois para saber o IP que acessou o banco apenas realize uma consulta na tabela 

    Espero que ajude.

    Lembre-se, antes de usar esse código em um servidor de produção execute alguns testes. Se algo ocorrer errado no comando, o servidor vai bloquear os logins. Fiz aqui o código e errei o nome da tabela por isso editei o post várias vezes. =)

    Mas como mencionei, os servidores de produção da empresa usam uma trigger parecida com essa.

    Abraço

    Ronaldo Conde





    quinta-feira, 29 de setembro de 2011 02:32

Todas as Respostas

  • Boa noite Lennon

    Você pode criar um DDL Trigger que pode capturar o IP do cliente e ainda se você quiser, bloquear acessos de determinados clientes via IP.

    No link abaixo explica como criar passo a passo.

    http://sql-articles.com/articles/security/ip-address-blocking-or-restriction-in-sql-server/

    Usando o valor de retorno do EventData -> SELECT EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'NVARCHAR(15)'))

    Nesse caso a Trigger é a nivel de servidor e não de tabela.

    Abraço

    Ronaldo Conde

    • Sugerido como Resposta Ronaldo R Conde quinta-feira, 29 de setembro de 2011 01:35
    • Não Sugerido como Resposta Ronaldo R Conde quinta-feira, 29 de setembro de 2011 01:35
    quinta-feira, 29 de setembro de 2011 01:34
  • Ronaldo eu testei apenas a consulta

    "SELECT EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]','NVARCHAR(15)'))"

    Mas retorno NULL o que pode ser?

    quinta-feira, 29 de setembro de 2011 01:57
  • No caso você teria de criar a trigger para capturar a informação do IP do cliente.

    Quando um novo cliente conectar no servidor, a trigger vai ser ativada e com isso o comando que retornou NULL vai retornar o IP do cliente e salvar o mesmo em uma tabela.

    Não sei lhe dizer outra maneira de capturar o IP sem usar a DDL trigger.

    Hoje na minha empresa fazemos uso da trigger para auditar quando necessário os logins no servidor. Usando uma estrutura parecida com o do exemplo do link que adicionei no primeiro post, coletamos várias informações sobre os logins e quando um login vem de um IP sendo do servidores de desenvolvimento por exemplo, a trigger bloqueia. Todas as informações são salvas em uma tabela para futura consultas.

    No seu caso, acho que apenas o código abaixo resolveria

     

     

    --CRIA O BANCO AUXILIAR
    CREATE DATABASE DBMONITOR
    GO
    
    --CRIA A TABELA PARA SALVAR O IP
    USE DBMONITOR
    CREATE TABLE tblClientIP(IPAdress nvarchar(15))
    GO
    
    --CRIA A TRIGGER PARA LOGAR AS INFORMACOES
    CREATE TRIGGER save_ipaddress
    ON ALL SERVER
    FOR LOGON
    AS
    BEGIN
                DECLARE @capturedip NVARCHAR(15);
                SET @capturedip = (SELECT EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'NVARCHAR(15)'));
                
                         
    			INSERT INTO DBMONITOR.dbo.tblClientIP VALUES(@capturedip)
    			
                
    END
    GO
    
    
    


    Geralmente nos servidores de produção eu adiciono um banco de dados especifico para esse tipo de tarefa. No meu caso , a tabela tblClienteIP fica em um banco chamado DBMonitor. 

    Depois para saber o IP que acessou o banco apenas realize uma consulta na tabela 

    Espero que ajude.

    Lembre-se, antes de usar esse código em um servidor de produção execute alguns testes. Se algo ocorrer errado no comando, o servidor vai bloquear os logins. Fiz aqui o código e errei o nome da tabela por isso editei o post várias vezes. =)

    Mas como mencionei, os servidores de produção da empresa usam uma trigger parecida com essa.

    Abraço

    Ronaldo Conde





    quinta-feira, 29 de setembro de 2011 02:32
  • Vlw em Ronaldo, brigadão....
    quinta-feira, 29 de setembro de 2011 12:19
  • Lenon,

    Veja este exemplo, utilizando a XP_CMDShell:

     

    Create Procedure P_RetornarIP @IP VarChar(25) Output
    As
     Begin
    
      Set NoCount On
      Declare @Auditoria2 Table
      (Codigo Int Identity(1,1),
       IP VarChar(2000)) 
    
      Set RowCount 8
      Insert Into @Auditoria2
      exec master.dbo.xp_cmdshell 'ipconfig'  
    
      Select @IP=(Select Replace(Substring(IP,CharIndex(':',IP,1),25),':','') from @Auditoria2
      Where Codigo = 8)
      
     End
    
    Create Table Auditoria
     (Codigo Int Identity(1,1),
      HostName VarChar(20) Null)
    
    Declare @IP VarChar(25)
    Exec P_RetornarIP @IP OutPut
    
    Insert Into Auditoria Values (@IP)
    
    Select * from Auditoria
    


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    domingo, 2 de outubro de 2011 03:11
    Moderador