2008-09-26 37 views

Trả lời

3
select @@servername 
35

Bạn có thể lấy [hostname] \ [instancename] bởi:

SELECT @@SERVERNAME; 

Để có được chỉ tên máy khi bạn có hostname định dạng \ tên ví dụ:

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

Ngoài ra như @GilM đã chỉ ra:

SELECT SERVERPROPERTY('MachineName') 

Bạn có thể nhận địa chỉ IP thực tế bằng cách sử dụng:

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 of the SQL script.

2

Một cách đơn giản để có được tên máy mà không \ InstanceName là:

SELECT SERVERPROPERTY('MachineName') 
15

Các máy chủ có thể có nhiều địa chỉ IP mà nó đang lắng nghe trên. Nếu kết nối của bạn có XEM MÁY CHỦ phép máy chủ NHÀ NƯỚC cấp cho nó, bạn có thể chạy truy vấn này để có được những địa chỉ mà bạn đã kết nối với SQL Server:

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

Giải pháp này không đòi hỏi bạn phải bỏ ra cho hệ điều hành thông qua xp_cmdshell, là một kỹ thuật cần được vô hiệu hóa (hoặc ít nhất là bảo mật nghiêm ngặt) trên một máy chủ sản xuất. Nó có thể yêu cầu bạn cấp VIEW SERVER STATE cho đăng nhập thích hợp, nhưng đó là một nguy cơ bảo mật nhỏ hơn nhiều so với chạy xp_cmdshell.

Kỹ thuật được đề cập bởi GilM cho tên máy chủ được ưa thích nhất:

SELECT SERVERPROPERTY(N'MachineName'); 
+0

Cảm ơn phản hồi này ... Tôi tin rằng đây là cách xác thực địa chỉ ip của máy chủ nếu bạn cần xác minh từ phía kết nối của máy khách, đặc biệt nếu kết nối của khách hàng được thiết lập với chuỗi kết nối chứa một bí danh SQL hoặc ví dụ được đặt tên như một nguồn dữ liệu. –

+0

upvoted để nói rằng không chỉ để chặn xp_cmdshell nhưng để đảm bảo bảo đảm nghiêm ngặt – SheldonH

90
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 

Mã đây sẽ cung cấp cho bạn địa chỉ IP;

Điều này sẽ hoạt động đối với yêu cầu máy khách từ xa đến SQL 2008 và phiên bản mới hơn.

Nếu bạn đã chia sẻ kiếp kết nối bộ nhớ cho phép, sau đó chạy trên trên máy chủ chính nó sẽ cung cấp cho bạn

  • "Memory Shared" làm giá trị cho 'net_transport', và
  • NULL cho 'local_net_address', và
  • '<local machine>' sẽ được hiển thị trong 'client_net_address'.

'client_net_address' là địa chỉ của máy tính mà yêu cầu bắt nguồn từ, trong khi 'local_net_address' sẽ là máy chủ SQL (do đó NULL qua Shared Memory connections) và địa chỉ bạn sẽ cung cấp cho ai đó nếu họ có thể không sử dụng tên NetBios của máy chủ hoặc FQDN vì một số lý do.

Tôi khuyên bạn không nên sử dụng this answer. Việc kích hoạt shell out là một ý tưởng rất tồi tệ đối với một SQL Server sản xuất.

+0

Câu trả lời tốt ngoại trừ tôi nhận được một số cổng âm (-15736) cho một cổng nên được 49800. Vì vậy, nếu tiêu cực là nó an toàn để chỉ cần thêm 65536? – crokusek

+0

Nếu ai đó muốn đăng nhập từ xa vào máy chủ SQL của máy tính của tôi thì tôi sẽ cung cấp cho tôi địa chỉ IP nào? local_net_address hoặc client_net_address? –

+0

Nó không hoạt động vào năm 2012 - địa chỉ là không có – scar80

7

Hầu hết các giải pháp để nhận được địa chỉ IP qua t-sql rơi vào hai phe này:

  1. Run ipconfig.exe qua xp_cmdshell và phân tích đầu ra

  2. Query DMV sys.dm_exec_connections

Tôi không phải là người hâm mộ tùy chọn số 1. Việc kích hoạt xp_cmdshell có những hạn chế về bảo mật và có rất nhiều phân tích cú pháp liên quan. Đó là cồng kềnh. Tùy chọn # 2 là thanh lịch. Và đó là một giải pháp t-sql thuần túy, mà tôi hầu như luôn thích. Dưới đây là hai truy vấn mẫu cho tùy chọ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; 

Đôi khi, các truy vấn trên không hoạt động. Truy vấn # 1 trả về NULL nếu bạn được kết nối qua bộ nhớ chia sẻ (đã đăng nhập và chạy SSMS trên máy chủ lưu trữ SQL). Truy vấn # 2 có thể trả về không có gì nếu không có kết nối bằng giao thức bộ nhớ không được chia sẻ. Kịch bản này có thể xảy ra khi được kết nối với một cá thể SQL mới được cài đặt. Giải pháp? Buộc kết nối qua TCP/IP. Để thực hiện việc này, hãy tạo một kết nối mới trong SSMS và sử dụng tiền tố "tcp:" với tên máy chủ. Sau đó chạy lại truy vấn và bạn sẽ nhận được địa chỉ IP.

SSMS - Connect to Database Engine

+0

Lời cảm ơn tuyệt vời dành cho mẹo! Làm việc hoàn hảo cho tôi. – Munk

+0

Điều này sẽ cung cấp cho ipv4 .. chúng tôi có thể nhận được ipv6? –

0

Tôi biết đây là một bài cũ, nhưng có lẽ giải pháp này có thể có ích khi bạn muốn lấy địa chỉ IP và cổng TCP từ một kết nối chia sẻ bộ nhớ (ví dụ như từ một kịch bản chạy trong SSMS cục bộ trên máy chủ). Điều quan trọng là để mở một kết nối thứ cấp đến máy chủ SQL của bạn bằng cách sử dụng OPENROWSET, trong đó bạn chỉ định 'tcp:' trong chuỗi kết nối của bạn. Phần còn lại của mã chỉ đơn thuần là xây dựng SQL động để có được giới hạn OPENROWSET không có khả năng lấy biến làm tham số của nó.

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 
3

bạn có thể sử dụng dòng lệnh truy vấn và thực hiện trong MSSQL:

exec xp_cmdshell 'ipconfig' 
+0

Điều đó sẽ chỉ hoạt động nếu 'xp_cmdshell' được bật trong cấu hình bảo mật máy chủ – D0dger

1

--Try kịch bản này nó hoạt động với nhu cầu của tôi. Định dạng lại để đọc nó.

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; 
Các vấn đề liên quan