SQL - Query untuk mendapatkan alamat IP server

97

Apakah ada kueri di SQL Server 2005 yang dapat saya gunakan untuk mendapatkan IP atau nama server?

Seibar
sumber
Saat menyambungkan ke SQL menggunakan pendengar AG, tampaknya CONNECTIONPROPERTY ('local_net_address') mengembalikan IP pendengar, bukan IP server.
Brian Beuning

Jawaban:

148
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 

Kode di sini akan memberi Anda Alamat IP;

Ini akan bekerja untuk permintaan klien jarak jauh ke SQL 2008 dan yang lebih baru.

Jika Anda memiliki koneksi Memori Bersama yang diizinkan, maka menjalankan di atas pada server itu sendiri akan memberi Anda

  • "Memori Bersama" sebagai nilai untuk 'net_transport', dan
  • NULL untuk 'local_net_address', dan
  • ' <local machine>' akan ditampilkan di 'client_net_address'.

'client_net_address' adalah alamat komputer tempat permintaan berasal, sedangkan 'local_net_address' adalah server SQL (dengan demikian NULL melalui koneksi Memori Bersama), dan alamat yang akan Anda berikan kepada seseorang jika mereka tidak dapat menggunakan NetBios server nama atau FQDN untuk beberapa alasan.

Saya sangat menyarankan agar tidak menggunakan jawaban ini . Mengaktifkan shell out adalah ide yang sangat buruk pada SQL Server produksi.

Jeff Muzzy
sumber
3
Jawaban yang bagus kecuali saya mendapatkan nomor port negatif (-15736) untuk port yang seharusnya 49800. Jadi jika negatif apakah aman menambahkan 65536 saja?
crokusek
Jika seseorang ingin login dari jarak jauh ke SQL server komputer saya, lalu IP mana yang harus saya berikan? local_net_address atau client_net_address?
david blaine
@ Rene - sedang mempertimbangkannya, tetapi jawaban aslinya sendiri sudah benar (untuk SQL2008 + dan koneksi jarak jauh) jadi hanya berpikir untuk menjelaskan apa arti params ConnectionProperty. Tentu saja jawaban Chris Leonard (dm_exec_connections) juga benar, untuk alasan yang sama. Jika menurut Anda adendum saya lebih baik sebagai jawaban terpisah daripada merasa bebas untuk membuatnya begitu :) Belum menjawab Q untuk sementara waktu, jadi kebijakan & aturan di sini mungkin telah berubah (akan dibaca sekarang ...)
Martin S. Stoller
Alasan addenum sesuai dengan " stackoverflow.com/help/editing ": Untuk memperjelas arti posting (tanpa mengubah artinya).
Martin S. Stoller
1
@ MartinS.Stoller Saya mengedit tambahan Anda untuk readibiitas. Harap periksa apakah saya tidak melewatkan apa pun.
rene
33

Anda bisa mendapatkan [nama host] \ [nama instan] dengan:

SELECT @@SERVERNAME;

Untuk mendapatkan hanya nama host ketika Anda memiliki nama host \ format nama instance:

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

Atau seperti yang ditunjukkan @GilM:

SELECT SERVERPROPERTY('MachineName')

Anda bisa mendapatkan alamat IP sebenarnya menggunakan ini:

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

Sumber skrip SQL .

Brian R. Bondy
sumber
21

Server mungkin memiliki beberapa alamat IP yang didengarkannya. Jika koneksi Anda memiliki izin server LIHAT SERVER NEGARA yang diberikan, Anda dapat menjalankan kueri ini untuk mendapatkan alamat yang telah Anda sambungkan ke SQL Server:

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

Solusi ini tidak mengharuskan Anda untuk membayar ke OS melalui xp_cmdshell, yang merupakan teknik yang harus dinonaktifkan (atau setidaknya diamankan secara ketat) di server produksi. Anda mungkin diminta untuk memberikan LIHAT NEGARA SERVER untuk login yang sesuai, tetapi itu adalah risiko keamanan yang jauh lebih kecil daripada menjalankan xp_cmdshell.

Teknik yang disebutkan oleh GilM untuk nama server adalah yang lebih disukai:

SELECT SERVERPROPERTY(N'MachineName');
skye --- kapten
sumber
Terima kasih atas tanggapan ini ... Saya yakin ini adalah cara yang benar untuk menentukan alamat ip server jika Anda perlu memverifikasinya dari sisi koneksi klien, khususnya jika koneksi klien dibuat dengan string koneksi yang berisi alias SQL atau bernama misalnya sebagai sumber data.
Rodolfo G.
11

Sebagian besar solusi untuk mendapatkan alamat IP melalui t-sql termasuk dalam dua kubu berikut:

  1. Jalankan ipconfig.exemelalui xp_cmdshelldan parsing hasilnya

  2. Permintaan DMV sys.dm_exec_connections

Saya bukan penggemar opsi # 1. Mengaktifkan xp_cmdshell memiliki kelemahan keamanan, dan ada banyak penguraian yang terlibat. Itu tidak praktis. Opsi # 2 elegan. Dan ini adalah solusi t-sql murni, yang hampir selalu saya sukai. Berikut adalah dua contoh kueri untuk opsi # 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;

Terkadang, tidak satu pun dari kueri di atas berfungsi. Kueri # 1 mengembalikan NULL jika Anda terhubung melalui Memori Bersama (masuk dan menjalankan SSMS pada host SQL). Permintaan # 2 mungkin tidak menghasilkan apa-apa jika tidak ada koneksi yang menggunakan protokol non-Shared Memory. Skenario ini mungkin terjadi saat terhubung ke contoh SQL yang baru diinstal. Solusinya? Paksa koneksi melalui TCP / IP. Untuk melakukannya, buat koneksi baru di SSMS dan gunakan awalan "tcp:" dengan nama server. Kemudian jalankan kembali salah satu kueri dan Anda akan mendapatkan alamat IP.

SSMS - Hubungkan ke Mesin Database

Dave Mason
sumber
Ini akan memberikan ipv4 .. bisakah kita mendapatkan ipv6?
Shikhil Bhalla
8

--Coba skrip ini sesuai kebutuhan saya. Format ulang untuk membacanya.

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
sumber
Terima kasih. Baru saja memperbarui dec.local_tcp_port sebagai 'dec.local_tcp_port' untuk menggunakannya dalam sebuah fungsi. Jika tidak, mengeluh ada dua kolom bernama local_tcp_port.
Steven Van Dorpe
7

Anda dapat menggunakan kueri baris perintah dan mengeksekusi di mssql:

exec xp_cmdshell 'ipconfig'
Ranjana Ghimire
sumber
2
Itu akan bekerja hanya jika xp_cmdshelldiaktifkan dalam konfigurasi keamanan server
Javasick
4
select @@servername
Masokis Semu
sumber
2

Cara yang lebih sederhana untuk mendapatkan nama mesin tanpa \ InstanceName adalah:

SELECT SERVERPROPERTY('MachineName')
GilM
sumber
1

Saya tahu ini adalah posting lama, tetapi mungkin solusi ini dapat berguna ketika Anda ingin mengambil alamat IP dan port TCP dari koneksi Memori Bersama (misalnya dari skrip yang dijalankan di SSMS secara lokal di server). Kuncinya adalah membuka koneksi sekunder ke SQL Server menggunakan OPENROWSET, di mana Anda menentukan 'tcp:' di string koneksi Anda. Sisa kode hanya membangun SQL dinamis untuk mengatasi batasan OPENROWSET karena tidak dapat menggunakan variabel sebagai parameternya.

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
sumber
Hanya mencatat bahwa ini perlu Ad Hoc Distributed Queriesdihidupkan.
Dan