SQL - सर्वर का IP पता प्राप्त करने के लिए क्वेरी


94

SQL Server 2005 में एक क्वेरी है जो मैं सर्वर का आईपी या नाम प्राप्त करने के लिए उपयोग कर सकता हूं?


जब एक AG श्रोता का उपयोग करते हुए SQL से कनेक्ट होता है, तो यह CONNECTIONPROPERTY ('local_net_address') सर्वर IP के बजाय श्रोता IP देता है।
ब्रायन बूनिंग

जवाबों:


145
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 

यहां कोड आपको आईपी एड्रेस देगा;

यह SQL 2008 और नए के लिए दूरस्थ क्लाइंट अनुरोध के लिए काम करेगा।

यदि आपके पास साझा मेमोरी कनेक्शन की अनुमति है, तो सर्वर पर ऊपर चल रहा है आपको स्वयं देगा

  • "Net_transport 'के मान के रूप में" साझा की गई मेमोरी ", और
  • 'Local_net_address' के लिए NULL, और
  • ' <local machine>' को 'client_net_address' में दिखाया जाएगा।

'client_net_address' उस कंप्यूटर का पता है जिसे अनुरोध से उत्पन्न किया गया था, जबकि 'local_net_address' SQL सर्वर होगा (इस प्रकार साझा मेमोरी कनेक्शन से अधिक), और पता आपको किसी ऐसे व्यक्ति को देना होगा जो वे सर्वर के नेटबायस का उपयोग नहीं कर सकते किसी कारण से नाम या FQDN।

मैं इस जवाब का उपयोग करने के खिलाफ दृढ़ता से सलाह देता हूं । शेल को सक्षम करना उत्पादन SQL सर्वर पर एक बहुत बुरा विचार है।


3
एक बंदरगाह के लिए एक नकारात्मक पोर्ट नंबर (-15736) को छोड़कर मुझे अच्छा जवाब मिल रहा है, जो 49800 होना चाहिए। इसलिए यदि नकारात्मक है तो सिर्फ 65536 जोड़ना सुरक्षित है?
क्रुकसेक

अगर कोई दूरस्थ रूप से मेरे कंप्यूटर के SQL सर्वर में प्रवेश करना चाहता है, तो मैं उसे कौन सा आईपी दे सकता हूं? स्थानीय_नेट_ड्रेस या क्लाइंट_नेट_ड्रेस?
डेविड ब्लाइंड

@rene - इस पर विचार कर रहा था, लेकिन मूल उत्तर अपने आप में सही है (SQL2008 + और रिमोट कनेक्शन के लिए) इसलिए केवल यह स्पष्ट करने के लिए सोचा था कि ConnectionProperty params का क्या मतलब है। बेशक क्रिस लियोनार्ड का जवाब (dm_exec_connections) भी ठीक है, उन्हीं कारणों से। अगर आपको लगता है कि मेरा परिशिष्ट अलग उत्तर के रूप में बेहतर है, तो इसे बनाने के लिए स्वतंत्र महसूस करें :) कुछ समय के लिए क्यू का जवाब नहीं दिया गया, इसलिए यहां नीति और नियम बदल गए होंगे (अब उन्हें पढ़कर जाना होगा ...)
मार्टिन एस।

प्रति "के रूप में addenum के लिए कारण stackoverflow.com/help/editing ": पोस्ट के अर्थ को स्पष्ट करने के लिए (कि अर्थ बदले बिना)।
मार्टिन एस। स्टोलर

1
@ MartinS.Stoller मैंने आपके लिए तत्परता के साथ जोड़ दिया। कृपया जांचें कि क्या मुझे कुछ याद नहीं है।
रेने

33

आप [hostname] \ [instancename] द्वारा प्राप्त कर सकते हैं:

SELECT @@SERVERNAME;

केवल होस्टनाम प्राप्त करने के लिए जब आपके पास होस्टनाम \ इंस्टेंस नाम प्रारूप हो:

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

वैकल्पिक रूप से @GMM ने बताया:

SELECT SERVERPROPERTY('MachineName')

आप इसका उपयोग करके वास्तविक आईपी पता प्राप्त कर सकते हैं:

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

एसक्यूएल स्क्रिप्ट का स्रोत


19

सर्वर में कई आईपी पते हो सकते हैं जो यह सुन रहा है। यदि आपके कनेक्शन में VIEW SERVER STATE सर्वर अनुमति दी गई है, तो आप SQL सर्वर से जुड़े पते को प्राप्त करने के लिए इस क्वेरी को चला सकते हैं:

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

इस समाधान के लिए आपको xp_cmdshell के माध्यम से OS पर जाने की आवश्यकता नहीं है, जो एक ऐसी तकनीक है जिसे उत्पादन सर्वर पर अक्षम (या कम से कम सख्ती से सुरक्षित) होना चाहिए। आपको उपयुक्त लॉगिन में VIEW SERVER STATE देने की आवश्यकता हो सकती है, लेकिन यह xp_cmchell चलाने की तुलना में बहुत छोटा सुरक्षा जोखिम है।

गिल्म द्वारा सर्वर नाम के लिए उल्लिखित तकनीक पसंदीदा है:

SELECT SERVERPROPERTY(N'MachineName');

इस प्रतिक्रिया के लिए धन्यवाद ... मेरा मानना ​​है कि यह सर्वर के आईपी पते को निर्धारित करने का सही तरीका है यदि आपको क्लाइंट के कनेक्शन पक्ष से इसे सत्यापित करने की आवश्यकता है, खासकर यदि क्लाइंट का कनेक्शन कनेक्शन स्ट्रिंग के साथ स्थापित किया गया था जिसमें SQL उपनाम या नाम था उदाहरण के लिए एक डेटा स्रोत के रूप में।
रोडोल्फो जी।

11

टी-एसक्यूएल के माध्यम से आईपी पते प्राप्त करने के लिए अधिकांश समाधान इन दो शिविरों में आते हैं:

  1. के ipconfig.exeमाध्यम से चलाएँ xp_cmdshellऔर आउटपुट पार्स करें

  2. क्वेरी DMV sys.dm_exec_connections

मैं विकल्प # 1 का प्रशंसक नहीं हूं। Xp_cmdshell को सक्षम करने में सुरक्षा कमियां हैं, और वैसे भी बहुत सारे पार्सिंग शामिल हैं। वह बोझिल है। विकल्प # 2 सुरुचिपूर्ण है। और यह एक शुद्ध टी-एसक्यूएल समाधान है, जिसे मैं लगभग हमेशा पसंद करता हूं। यहां विकल्प 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;

कभी-कभी, उपरोक्त प्रश्नों में से कोई भी काम नहीं करता है, हालांकि। यदि आप साझा मेमोरी (SQL होस्ट पर SSMS लॉग इन और रनिंग) से जुड़े हैं, तो क्वेरी # 1 रिटर्न भरती है। यदि गैर-साझा मेमोरी प्रोटोकॉल का उपयोग कर कोई कनेक्शन नहीं हैं, तो क्वेरी # 2 कुछ भी नहीं लौटा सकती है। जब नया स्थापित SQL इंस्टेंस से जुड़ा हो तो यह परिदृश्य संभव है। समाधान? टीसीपी / आईपी पर एक कनेक्शन को मजबूर करें। ऐसा करने के लिए, SSMS में एक नया कनेक्शन बनाएं और सर्वर नाम के साथ "tcp:" उपसर्ग का उपयोग करें। फिर या तो क्वेरी को फिर से चलाएं और आपको आईपी एड्रेस मिलेगा।

SSMS - डेटाबेस इंजन से कनेक्ट करें


यह ipv4 देगा .. क्या हम ipv6 प्राप्त कर सकते हैं?
शिखिल भल्ला


7

आप कमांड लाइन क्वेरी का उपयोग कर सकते हैं और mssql में निष्पादित कर सकते हैं:

exec xp_cmdshell 'ipconfig'

1
xp_cmdshellसर्वर सुरक्षा कॉन्फ़िगरेशन में सक्षम होने पर ही काम करेगा
Javasick

7

- इस स्क्रिप्ट की कोशिश करो यह मेरी जरूरतों के लिए काम करता है। इसे पढ़ने के लिए सुधार।

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;

धन्यवाद। बस इसे एक फ़ंक्शन में उपयोग करने के लिए dec.local_tcp_port को 'dec.local_tcp_port' के रूप में अपडेट करना था। अन्यथा यह शिकायत करता है कि local_tcp_port नाम के दो कॉलम हैं।
स्टीवन वान डोरपे


2

\ InstanceName के बिना मशीन का नाम पाने का एक सरल तरीका है:

SELECT SERVERPROPERTY('MachineName')

1

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन शायद यह समाधान तब उपयोगी हो सकता है जब आप एक साझा मेमोरी कनेक्शन से आईपी एड्रेस और टीसीपी पोर्ट को पुनः प्राप्त करना चाहते हैं (जैसे कि सर्वर पर स्थानीय रूप से एसएसएमएस में चलने वाली स्क्रिप्ट से)। कुंजी OPENROWSET का उपयोग करके अपने SQL सर्वर के लिए एक माध्यमिक कनेक्शन खोलने के लिए है, जिसमें आप अपने कनेक्शन स्ट्रिंग में 'tcp:' निर्दिष्ट करते हैं। बाकी कोड केवल गतिशील SQL का निर्माण कर रहा है ताकि OPENROWSET की सीमा के आसपास चर को इसके मापदंडों के रूप में लेने में सक्षम न हो।

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

बस यह देखते हुए कि इसे Ad Hoc Distributed Queriesचालू करने की आवश्यकता है।
दान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.