SQL - Abfrage zum Abrufen der IP-Adresse des Servers


94

Gibt es in SQL Server 2005 eine Abfrage, mit der ich die IP-Adresse oder den Namen des Servers abrufen kann?


Wenn Sie mit einem AG-Listener eine Verbindung zu SQL herstellen, wird angezeigt, dass CONNECTIONPROPERTY ('local_net_address') die Listener-IP anstelle der Server-IP zurückgibt.
Brian Beuning

Antworten:


143
SELECT  
   CONNECTIONPROPERTY('net_transport') AS net_transport,
   CONNECTIONPROPERTY('protocol_type') AS protocol_type,
   CONNECTIONPROPERTY('auth_scheme') AS auth_scheme,
   CONNECTIONPROPERTY('local_net_address') AS local_net_address,
   CONNECTIONPROPERTY('local_tcp_port') AS local_tcp_port,
   CONNECTIONPROPERTY('client_net_address') AS client_net_address 

Der Code hier gibt Ihnen die IP-Adresse;

Dies funktioniert für eine Remoteclientanforderung an SQL 2008 und höher.

Wenn Sie Shared Memory-Verbindungen zugelassen haben, erhalten Sie eine Ausführung oben auf dem Server

  • "Shared Memory" als Wert für 'net_transport' und
  • NULL für 'local_net_address' und
  • ' <local machine>' wird in 'client_net_address' angezeigt.

'client_net_address' ist die Adresse des Computers, von dem die Anforderung stammt, während 'local_net_address' der SQL-Server (also NULL über Shared Memory-Verbindungen) und die Adresse ist, die Sie jemandem geben würden, wenn dieser die NetBios des Servers nicht verwenden kann Name oder FQDN aus irgendeinem Grund.

Ich rate dringend davon ab, diese Antwort zu verwenden . Das Aktivieren der Shell ist auf einem Produktions-SQL Server eine sehr schlechte Idee.


3
Gute Antwort, außer dass ich eine negative Portnummer (-15736) für einen Port erhalte, der 49800 sein sollte. Wenn also negativ, ist es sicher, nur 65536 hinzuzufügen?
Crokusek

Wenn sich jemand remote beim SQL Server meines Computers anmelden möchte, welche IP gebe ich ihm dann? local_net_address oder client_net_address?
David Blaine

@rene - hat darüber nachgedacht, aber die ursprüngliche Antwort selbst ist korrekt (für SQL2008 + und Remoteverbindungen). Ich wollte nur klarstellen, was die ConnectionProperty-Parameter bedeuten. Natürlich ist auch die Antwort von Chris Leonard (dm_exec_connections) aus den gleichen Gründen richtig. Wenn Sie der Meinung sind, dass mein Nachtrag als separate Antwort besser geeignet ist, als es gerne zu tun :) Ich habe eine Weile keine Fragen mehr beantwortet, daher haben sich die Richtlinien und Regeln hier möglicherweise geändert (lesen Sie sie jetzt durch ...)
Martin S. Stoller

Grund für Addenum gemäß " stackoverflow.com/help/editing ": Um die Bedeutung des Beitrags zu klären (ohne diese Bedeutung zu ändern).
Martin S. Stoller

1
@ MartinS.Stoller Ich habe Ihren Zusatz für die Lesbarkeit bearbeitet. Bitte überprüfen Sie, ob ich nichts verpasst habe.
Rene

33

Sie können den [Hostnamen] \ [Instanznamen] erhalten durch:

SELECT @@SERVERNAME;

So erhalten Sie nur den Hostnamen, wenn Sie das Format Hostname \ Instanzname haben:

SELECT LEFT(ltrim(rtrim(@@ServerName)), Charindex('\', ltrim(rtrim(@@ServerName))) -1)

Alternativ, wie @GilM hervorhob:

SELECT SERVERPROPERTY('MachineName')

Sie können die tatsächliche IP-Adresse folgendermaßen abrufen:

create Procedure sp_get_ip_address (@ip varchar(40) out)
as
begin
Declare @ipLine varchar(200)
Declare @pos int
set nocount on
          set @ip = NULL
          Create table #temp (ipLine varchar(200))
          Insert #temp exec master..xp_cmdshell 'ipconfig'
          select @ipLine = ipLine
          from #temp
          where upper (ipLine) like '%IP ADDRESS%'
          if (isnull (@ipLine,'***') != '***')
          begin 
                set @pos = CharIndex (':',@ipLine,1);
                set @ip = rtrim(ltrim(substring (@ipLine , 
               @pos + 1 ,
                len (@ipLine) - @pos)))
           end 
drop table #temp
set nocount off
end 
go

declare @ip varchar(40)
exec sp_get_ip_address @ip out
print @ip

Quelle des SQL-Skripts .


19

Der Server verfügt möglicherweise über mehrere IP-Adressen, die er abhört. Wenn Ihrer Verbindung die Serverberechtigung VIEW SERVER STATE erteilt wurde, können Sie diese Abfrage ausführen, um die Adresse abzurufen, die Sie mit SQL Server verbunden haben:

SELECT dec.local_net_address
FROM sys.dm_exec_connections AS dec
WHERE dec.session_id = @@SPID;

Für diese Lösung müssen Sie nicht über xp_cmdshell an das Betriebssystem senden. Dies ist eine Technik, die auf einem Produktionsserver deaktiviert (oder zumindest streng gesichert) werden sollte. Möglicherweise müssen Sie dem entsprechenden Login VIEW SERVER STATE zuweisen. Dies ist jedoch ein weitaus geringeres Sicherheitsrisiko als das Ausführen von xp_cmdshell.

Die von GilM für den Servernamen erwähnte Technik ist die bevorzugte:

SELECT SERVERPROPERTY(N'MachineName');

Vielen Dank für diese Antwort ... Ich glaube, dies ist die wahre Methode, um die IP-Adresse des Servers zu ermitteln, wenn Sie sie von der Verbindungsseite des Clients aus überprüfen müssen, insbesondere wenn die Verbindung des Clients mit einer Verbindungszeichenfolge hergestellt wurde, die einen SQL-Alias ​​oder einen Namen enthielt Instanz als Datenquelle.
Rodolfo G.

11

Die meisten Lösungen zum Abrufen der IP-Adresse über t-sql fallen in diese beiden Lager:

  1. Führen Sie ipconfig.exevia aus xp_cmdshellund analysieren Sie die Ausgabe

  2. DMV abfragen sys.dm_exec_connections

Ich bin kein Fan von Option 1. Das Aktivieren von xp_cmdshell hat Sicherheitsnachteile und es ist sowieso viel Parsen erforderlich. Das ist umständlich. Option 2 ist elegant. Und es ist eine reine T-SQL-Lösung, die ich fast immer bevorzuge. Hier sind zwei Beispielabfragen für Option 2:

SELECT c.local_net_address
FROM sys.dm_exec_connections AS c
WHERE c.session_id = @@SPID;

SELECT TOP(1) c.local_net_address
FROM sys.dm_exec_connections AS c
WHERE c.local_net_address IS NOT NULL;

Manchmal funktioniert jedoch keine der oben genannten Abfragen. Abfrage 1 gibt NULL zurück, wenn Sie über Shared Memory verbunden sind (angemeldet und SSMS auf dem SQL-Host ausgeführt). Abfrage Nr. 2 gibt möglicherweise nichts zurück, wenn keine Verbindungen mit einem nicht gemeinsam genutzten Speicherprotokoll bestehen. Dieses Szenario ist wahrscheinlich, wenn eine Verbindung zu einer neu installierten SQL-Instanz besteht. Die Lösung? Erzwingen Sie eine Verbindung über TCP / IP. Erstellen Sie dazu eine neue Verbindung in SSMS und verwenden Sie das Präfix "tcp:" mit dem Servernamen. Führen Sie dann eine der Abfragen erneut aus und Sie erhalten die IP-Adresse.

SSMS - Verbindung zum Datenbankmodul herstellen


Dies wird ipv4 geben .. können wir ipv6 bekommen?
Shikhil Bhalla


7

Sie können die Befehlszeilenabfrage verwenden und in mssql ausführen:

exec xp_cmdshell 'ipconfig'

1
Das funktioniert nur, wenn xp_cmdshelles in der Server-Sicherheitskonfiguration aktiviert ist
Javasick

7

- Versuchen Sie dieses Skript, das meinen Anforderungen entspricht. Formatieren Sie es neu, um es zu lesen.

SELECT  
SERVERPROPERTY('ComputerNamePhysicalNetBios')  as 'Is_Current_Owner'
    ,SERVERPROPERTY('MachineName')  as 'MachineName'
    ,case when @@ServiceName = 
    Right (@@Servername,len(@@ServiceName)) then @@Servername 
      else @@servername +' \ ' + @@Servicename
      end as '@@Servername \ Servicename',  
    CONNECTIONPROPERTY('net_transport') AS net_transport,
    CONNECTIONPROPERTY('local_tcp_port') AS local_tcp_port,
    dec.local_tcp_port,
    CONNECTIONPROPERTY('local_net_address') AS local_net_address,
    dec.local_net_address as 'dec.local_net_address'
    FROM sys.dm_exec_connections AS dec
    WHERE dec.session_id = @@SPID;

Vielen Dank. Musste nur dec.local_tcp_port als 'dec.local_tcp_port' aktualisieren, um es in einer Funktion zu verwenden. Andernfalls wird beanstandet, dass zwei Spalten mit dem Namen local_tcp_port vorhanden sind.
Steven Van Dorpe


2

Eine einfachere Möglichkeit, den Computernamen ohne den \ InstanceName abzurufen, ist:

SELECT SERVERPROPERTY('MachineName')

1

Ich weiß, dass dies ein alter Beitrag ist, aber vielleicht kann diese Lösung nützlich sein, wenn Sie die IP-Adresse und den TCP-Port von einer Shared Memory-Verbindung abrufen möchten (z. B. von einem Skript, das in SSMS lokal auf dem Server ausgeführt wird). Der Schlüssel besteht darin, mit OPENROWSET eine sekundäre Verbindung zu Ihrem SQL Server herzustellen, in der Sie in Ihrer Verbindungszeichenfolge 'tcp:' angeben. Der Rest des Codes erstellt lediglich dynamisches SQL, um die Einschränkung von OPENROWSET zu umgehen, dass Variablen nicht als Parameter verwendet werden können.

DECLARE @ip_address       varchar(15)
DECLARE @tcp_port         int 
DECLARE @connectionstring nvarchar(max) 
DECLARE @parm_definition  nvarchar(max)
DECLARE @command          nvarchar(max)

SET @connectionstring = N'Server=tcp:' + @@SERVERNAME + ';Trusted_Connection=yes;'
SET @parm_definition  = N'@ip_address_OUT varchar(15) OUTPUT
                        , @tcp_port_OUT   int         OUTPUT';

SET @command          = N'SELECT  @ip_address_OUT = a.local_net_address,
                                  @tcp_port_OUT   = a.local_tcp_port
                          FROM OPENROWSET(''SQLNCLI''
                                 , ''' + @connectionstring + '''
                                 , ''SELECT local_net_address
                                          , local_tcp_port
                                     FROM sys.dm_exec_connections
                                     WHERE session_id = @@spid
                                   '') as a'

EXEC SP_executeSQL @command
                 , @parm_definition
                 , @ip_address_OUT = @ip_address OUTPUT
                 , @tcp_port_OUT   = @tcp_port OUTPUT;


SELECT @ip_address, @tcp_port

Ich möchte nur darauf hinweisen, dass dies aktiviert Ad Hoc Distributed Queriessein muss.
Dan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.