SQL - Requête pour obtenir l'adresse IP du serveur

95

Existe-t-il une requête dans SQL Server 2005 que je peux utiliser pour obtenir l'adresse IP ou le nom du serveur?

Seibar
la source
Lors de la connexion à SQL à l'aide d'un écouteur AG, il apparaît que CONNECTIONPROPERTY ('local_net_address') renvoie l'adresse IP de l'écouteur au lieu de l'adresse IP du serveur.
brian beuning le

Réponses:

147
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 

Le code ici vous donnera l'adresse IP;

Cela fonctionnera pour une demande de client distant vers SQL 2008 et plus récent.

Si les connexions de mémoire partagée sont autorisées, l'exécution ci-dessus sur le serveur lui-même vous donnera

  • "Shared Memory" comme valeur de "net_transport", et
  • NULL pour 'local_net_address', et
  • « <local machine>» sera affiché dans «client_net_address».

'client_net_address' est l'adresse de l'ordinateur d'où provient la demande, tandis que 'local_net_address' serait le serveur SQL (donc NULL sur les connexions de mémoire partagée), et l'adresse que vous donneriez à quelqu'un s'il ne peut pas utiliser les NetBios du serveur nom ou FQDN pour une raison quelconque.

Je déconseille fortement d'utiliser cette réponse . L'activation du shell est une très mauvaise idée sur un serveur SQL de production.

Jeff Muzzy
la source
3
Bonne réponse sauf que j'obtiens un numéro de port négatif (-15736) pour un port qui devrait être 49800. Donc, si négatif, est-il sûr d'ajouter simplement 65536?
crokusek
Si quelqu'un souhaite se connecter à distance au serveur SQL de mon ordinateur, quelle adresse IP lui attribuer? local_net_address ou client_net_address?
david blaine
@rene - envisageait cela, mais la réponse originale elle-même est correcte (pour SQL2008 + et les connexions distantes), alors j'ai juste pensé à clarifier ce que signifiaient les paramètres ConnectionProperty. Bien sûr, la réponse de Chris Leonard (dm_exec_connections) est également correcte, pour les mêmes raisons. Si vous pensez que mon addendum est mieux placé en tant que réponse distincte que n'hésitez pas à le faire :) Je n'ai pas répondu aux questions depuis un moment, donc la politique et les règles ici pourraient avoir changé (je vais les lire maintenant ...)
Martin S. Stoller
Raison de l'addénum selon " stackoverflow.com/help/editing ": Pour clarifier le sens du message (sans changer ce sens).
Martin S.Stoller
1
@ MartinS.Stoller J'ai édité votre ajout pour plus de lisibilité. Veuillez vérifier si je n'ai rien manqué.
rene
33

Vous pouvez obtenir le [nom d'hôte] \ [nom d'instance] par:

SELECT @@SERVERNAME;

Pour obtenir uniquement le nom d'hôte lorsque vous avez le format nom d'hôte \ nom d'instance:

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

Alternativement, comme l'a souligné @GilM:

SELECT SERVERPROPERTY('MachineName')

Vous pouvez obtenir l'adresse IP réelle en utilisant ceci:

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

Source du script SQL .

Brian R. Bondy
la source
19

Le serveur peut avoir plusieurs adresses IP sur lesquelles il écoute. Si votre connexion dispose de l'autorisation de serveur VIEW SERVER STATE, vous pouvez exécuter cette requête pour obtenir l'adresse que vous avez connectée à SQL Server:

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

Cette solution ne vous oblige pas à débourser le système d'exploitation via xp_cmdshell, qui est une technique qui doit être désactivée (ou du moins strictement sécurisée) sur un serveur de production. Cela peut vous obliger à accorder VIEW SERVER STATE à la connexion appropriée, mais cela représente un risque de sécurité bien moindre que l'exécution de xp_cmdshell.

La technique mentionnée par GilM pour le nom du serveur est la meilleure:

SELECT SERVERPROPERTY(N'MachineName');
skye --- capitaine
la source
Merci pour cette réponse ... Je pense que c'est le vrai moyen de déterminer l'adresse IP du serveur si vous devez la vérifier du côté de la connexion du client, en particulier si la connexion du client a été établie avec une chaîne de connexion contenant un alias SQL ou nommée instance comme source de données.
Rodolfo G.
11

La plupart des solutions pour obtenir l'adresse IP via t-sql tombent dans ces deux camps:

  1. Exécuter ipconfig.exevia xp_cmdshellet analyser la sortie

  2. Requête DMV sys.dm_exec_connections

Je ne suis pas fan de l'option n ° 1. L'activation de xp_cmdshell présente des inconvénients en matière de sécurité, et il y a de toute façon beaucoup d'analyses impliquées. C'est encombrant. L'option n ° 2 est élégante. Et c'est une solution pure t-sql, que je préfère presque toujours. Voici deux exemples de requêtes pour l'option n ° 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;

Parfois, aucune des requêtes ci-dessus ne fonctionne, cependant. La requête n ° 1 renvoie NULL si vous êtes connecté via la mémoire partagée (connecté et exécutant SSMS sur l'hôte SQL). La requête n ° 2 peut ne rien renvoyer s'il n'y a aucune connexion utilisant un protocole de mémoire non partagée. Ce scénario est probable lors de la connexion à une instance SQL nouvellement installée. La solution? Forcer une connexion via TCP / IP. Pour ce faire, créez une nouvelle connexion dans SSMS et utilisez le préfixe «tcp:» avec le nom du serveur. Ensuite, réexécutez l'une ou l'autre des requêtes et vous obtiendrez l'adresse IP.

SSMS - Se connecter au moteur de base de données

Dave Mason
la source
Cela donnera ipv4 .. pouvons-nous obtenir ipv6?
Shikhil Bhalla
7

vous pouvez utiliser une requête en ligne de commande et l'exécuter dans mssql:

exec xp_cmdshell 'ipconfig'
Ranjana Ghimire
la source
1
Cela ne fonctionnera que si xp_cmdshellest activé dans la configuration de la sécurité du serveur
Javasick
7

- Essayez ce script, il fonctionne selon mes besoins. Reformatez pour le lire.

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;
Hank Freeman
la source
Merci. Juste eu à mettre à jour dec.local_tcp_port en tant que 'dec.local_tcp_port' pour l'utiliser dans une fonction. Sinon, il se plaint qu'il y a deux colonnes nommées local_tcp_port.
Steven Van Dorpe
4
select @@servername
Pseudo masochiste
la source
2

Un moyen plus simple d'obtenir le nom de la machine sans \ InstanceName est:

SELECT SERVERPROPERTY('MachineName')
GilM
la source
1

Je sais que c'est un ancien message, mais peut-être que cette solution peut être utile lorsque vous souhaitez récupérer l'adresse IP et le port TCP d'une connexion de mémoire partagée (par exemple à partir d'un script exécuté dans SSMS localement sur le serveur). La clé est d'ouvrir une connexion secondaire à votre serveur SQL à l'aide d'OPENROWSET, dans lequel vous spécifiez «tcp:» dans votre chaîne de connexion. Le reste du code construit simplement du SQL dynamique pour contourner la limitation d'OPENROWSET de ne pas pouvoir prendre des variables comme paramètres.

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
Bert Van Landeghem
la source
Juste en notant que cela nécessite Ad Hoc Distributed Queriesd'être activé.
Dan