SQL-サーバーのIPアドレスを取得するクエリ


95

サーバーのIPまたは名前を取得するために使用できるSQL Server 2005のクエリはありますか?


AGリスナーを使用してSQLに接続すると、CONNECTIONPROPERTY( 'local_net_address')がサーバーIPではなくリスナーIPを返すようです。
ブライアンビーニング、

回答:


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 

ここのコードはIPアドレスを提供します。

これは、SQL 2008以降へのリモートクライアント要求に対して機能します。

共有メモリ接続が許可されている場合、サーバー上で上記を実行すると、

  • 「net_transport」の値として「共有メモリ」、および
  • 「local_net_address」の場合はNULL、および
  • <local machine>」は「client_net_address」に表示されます。

「client_net_address」は要求の発信元のコンピューターのアドレスですが、「local_net_address」はSQLサーバー(したがって共有メモリー接続ではNULL)であり、サーバーのNetBiosを使用できない場合に誰かに与えるアドレスです何らかの理由で名前またはFQDN。

私はこの回答を使用しないことを強くお勧めします。シェルを有効にすることは、運用SQL Serverでは非常に悪い考えです。


3
49800である必要があるポートの負のポート番号(-15736)を取得していることを除いて、良い答えです。負の場合は、65536を追加するだけで安全ですか?
crokusek 2013年

誰かが私のコンピュータのSQLサーバーにリモートでログインしたい場合、どのIPを彼に与えますか?local_net_addressまたはclient_net_address?
ブレイン

@rene-それを検討していましたが、元の答え自体は正しいので(SQL2008 +およびリモート接続の場合)、ConnectionPropertyパラメータの意味を明確にすることを考えました。もちろん、同じ理由から、Chris Leonardの答え(dm_exec_connections)も正しいです。私の補遺を個別の回答としてお勧めします。自由に回答してください。Q&Aにしばらく回答していないため、ここでポリシーとルールが変更されている可能性があります(今すぐ読んでいきます...)
Martin S.ストーラー

stackoverflow.com/help/editing」による追加の理由:投稿の意味を明確にするため(その意味を変更せずに)。
マーティンS.ストーラー、2015

1
@ MartinS.Stoller読みやすいように、あなたの追加を編集しました。見逃していないか確認してください。
ルネ

33

[ホスト名] \ [インスタンス名]は次の方法で取得できます。

SELECT @@SERVERNAME;

ホスト名\インスタンス名の形式がある場合にホスト名のみを取得するには:

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

あるいは、@ GilMが指摘したように:

SELECT SERVERPROPERTY('MachineName')

これを使用して実際のIPアドレスを取得できます。

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

SQLスクリプトのソース


19

サーバーは、リッスンしている複数のIPアドレスを持っている可能性があります。接続にVIEW SERVER STATEサーバー権限が付与されている場合は、次のクエリを実行して、SQL Serverに接続したアドレスを取得できます。

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

このソリューションでは、xp_cmdshellを介してOSにシェルアウトする必要はありません。これは、運用サーバーで無効にする(または少なくとも厳密に保護する)必要がある手法です。適切なログインにVIEW SERVER STATEを付与する必要がある場合がありますが、これはxp_cmdshellを実行するよりもはるかに小さなセキュリティリスクです。

GilMがサーバー名として言及している手法が推奨されます。

SELECT SERVERPROPERTY(N'MachineName');

この応答をありがとう...クライアントの接続側から確認する必要がある場合、特にクライアントの接続がSQLエイリアスを含む接続文字列で確立されたか、データソースとしてのインスタンス。
ロドルフォG.

11

t-sqlを介してIPアドレスを取得するためのほとんどのソリューションは、次の2つの方法に分類されます。

  1. ipconfig.exe経由xp_cmdshellで実行して出力を解析する

  2. DMVのクエリ sys.dm_exec_connections

私はオプション#1のファンではありません。xp_cmdshellを有効にすると、セキュリティ上の欠点があり、とにかく多くの解析が必要になります。それは面倒です。オプション#2はエレガントです。そして、それは純粋なt-sqlソリューションであり、ほとんどの場合私はそれを好みます。オプション#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;

ただし、上記のクエリのいずれも機能しない場合もあります。クエリ#1は、共有メモリ経由で接続している場合(SQLホストにログインしてSSMSを実行している場合)、NULLを返します。非共有メモリプロトコルを使用した接続がない場合、クエリ#2は何も返しません。このシナリオは、新しくインストールされたSQLインスタンスに接続されている場合に発生する可能性があります。ソリューション?TCP / IP経由の接続を強制します。これを行うには、SSMSで新しい接続を作成し、サーバー名に "tcp:"プレフィックスを使用します。次に、いずれかのクエリを再実行すると、IPアドレスが取得されます。

SSMS-データベースエンジンへの接続


これによりipv4が得られます。ipv6を取得できますか?
Shikhil Bhalla


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つの列があるというメッセージが表示されます。
Steven Van Dorpe


2

\ InstanceNameなしでマシン名を取得する簡単な方法は次のとおりです。

SELECT SERVERPROPERTY('MachineName')

1

私はこれが古い投稿であることを知っていますが、共有メモリ接続からIPアドレスとTCPポートを取得する場合(たとえば、サーバーのローカルでSSMSで実行されたスクリプトから)にこのソリューションが役立つ場合があります。重要なのは、OPENROWSETを使用してSQL Serverへのセカンダリ接続を開くことです。この場合、接続文字列で「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をオンにする必要があることに注意してください。
Dan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.