IP Adresse einer User Connection ermitteln

By Frank Kalis

Posted on Jul 13, 2004 von in SQL Server

Definitiv etwas auf meiner persönlichen SQL Server Wish List. Es wäre schön, wenn man diese Information ähnlich wie HOST_NAME() abfragen könnte.

set nocount on
declare @ip varchar(255), @cmd varchar(100) 
set @cmd = 'ping -n 1 ' + HOST_NAME() 
create table #temptb (grabfield varchar(255)) 
insert into #temptb exec master.dbo.xp_cmdshell @cmd 
select @ip = substring(grabfield,  charindex('[',grabfield)+1,
 charindex(']',grabfield)-charindex('[',grabfield)-1) 
  from #temptb  where left(grabfield,7) = 'Pinging' 
print @ip 
drop table #temptb
set nocount off 

Das obige Beispiel funktioniert, wenn man die englischen Softwareversionen einsetzt. Setzt man hingegen die deutschsprachigen Versionen ein, muß man die obige WHERE Bedingung durch folgende ersetzen:

where left(grabfield,5) ='Ping '

Anmerkung 09.12.2004: Auf SQL Server Central hat mich AJ Ahrens auf den kleinen, aber netten Parameter Ping -n 1 hingewiesen. Dieser bewirkt, daß nur ein Ping abgesetzt wird, anstelle der üblichen 4.

Anmerkung 14.12.2004: SQL Server MVP Kenneth Wilhelmsson hat in dem oben erwähnten Thread folgenden Lösungsvorschlag gepostet:

create table #ipconfig
( conf varchar(100) null )

insert #ipconfig
exec master..xp_cmdshell 'ipconfig'

declare @ip varchar(15), @mask varchar(15)

select  @ip = right(conf, charindex(':', reverse(conf)) -1)
from  #ipconfig
where  patindex('%IP Address%', conf) > 0
 
select @mask = right(conf, charindex(':', reverse(conf)) -1)
from  #ipconfig
where patindex('%Subnet Mask%', conf)> 0

select  ltrim(@ip)  as ip,
 ltrim(@mask)  as mask

drop table #ipconfig
go


ip              mask            
--------------- --------------- 
130.XXX.XXX.XXX  255.XXX.0.0

(1 row(s) affected)

Wenn man die deutschen Versionen einsetzt, muß man folgende Änderungen vornehmen:

where  patindex('%IP-Adresse%', conf) > 0
und
where patindex('%Subnetzmaske%', conf)> 0

um das Skript zum Laufen zu bringen. Und, zu guter Letzt, hat Razvan Socol noch eine dritte interessante Lösung präsentiert.

CREATE TABLE #ErrLog (errorlog varchar(8000), ContinuationRow int)
INSERT INTO #ErrLog EXEC sp_readerrorlog
SELECT SUBSTRING(errorlog,
 CHARINDEX('SQL server listening on ',errorlog)+24,
 CHARINDEX(': ',errorlog)-CHARINDEX('SQL server listening on ',errorlog)-24)
  FROM #ErrLog 
 WHERE errorlog LIKE '%SQL server listening on %:%'
DROP TABLE #ErrLog
                 
---------------- 
130.XXX.XXX.XXX
127.0.0.1

(2 row(s) affected)

Hier lediglich noch zusätzlich der Hinweis, daß sp_readerrorlog undokumentiert ist. Setzt man deutsche Versionen eine, muß der Batch folgendermaßen formuliert werden:

CREATE TABLE #ErrLog (errorlog varchar(8000), ContinuationRow int)
INSERT INTO #ErrLog EXEC sp_readerrorlog
SELECT SUBSTRING(errorlog,
 CHARINDEX('SQL Server überwacht ',errorlog)+21,
 CHARINDEX(': ',errorlog)-CHARINDEX('SQL Server überwacht ',errorlog)-21)
  FROM #ErrLog
 WHERE errorlog LIKE '%SQL Server überwacht %:%'
DROP TABLE #ErrLog

Update 10.10.2007: Glücklicherweise ist im SQL Server 2005 alles anders :

SELECT client_net_address
  FROM sys.dm_exec_connections
 WHERE session_id=@@spid
Tags: Tags:
Dieser Eintrag wurde eingetragen von und ist abgelegt unter SQL Server. Tags: ,

Noch kein Feedback


Formular wird geladen...