2008-09-26 16 views

Odpowiedz

3
select @@servername 
35

można pobrać [nazwa hosta] \ [instancename] przez:

SELECT @@SERVERNAME; 

Aby uzyskać tylko nazwę hosta, gdy masz hosta \ nazwa instancji format:

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

Alternatywnie jako @ GilM wskazał:

SELECT SERVERPROPERTY('MachineName') 

można uzyskać rzeczywisty adres IP za pomocą tego:

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

Prostszym sposobem, aby uzyskać nazwę komputera bez \ Nazwa_wystąpienia to:

SELECT SERVERPROPERTY('MachineName') 
15

Serwer może mieć wiele adresów IP, że nasłuchuje. Jeśli połączenie ma uprawnienia serwera STAN VIEW SERVER przyznanego temu, można uruchomić tę kwerendę, aby uzyskać adres podłączonego do serwera SQL:

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

To rozwiązanie nie wymaga bulić do systemu operacyjnego poprzez xp_cmdshell, która jest techniką, która powinna być wyłączona (lub przynajmniej ściśle zabezpieczona) na serwerze produkcyjnym. Może wymagać przyznania VIEW SERVER STATE odpowiedniego logowania, ale jest to o wiele mniejsze ryzyko bezpieczeństwa niż uruchomienie xp_cmdshell.

Technika wspomniał GilM dla nazwy serwera jest preferowana:

SELECT SERVERPROPERTY(N'MachineName'); 
+0

Dzięki tej odpowiedzi ... Wierzę, że to jest prawdziwy sposób określania adresu IP serwera, jeśli trzeba zweryfikować go z boku połączenia klienta, szczególnie jeśli połączenie klienta powstała z połączenia ciąg, który zawierał alias SQL lub nazwaną instancję jako źródło danych. –

+0

przegłosowano za mówienie nie tylko po to, aby zablokować xp_cmdshell, ale w celu zapewnienia ścisłej ochrony – 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 

kod tutaj daje adres IP;

To będzie działać dla zdalnego żądania klienta do SQL 2008 i nowszych.

Jeśli wspólna połączeń pamięci dozwolone, następnie uruchomić powyżej na serwerze Sam daje

  • "Shared Memory" jako wartość 'net_transport' i
  • NULL dla 'local_net_address' i
  • "<local machine>" zostaną wyświetlone w "adres_adresu_użytkownika".

„client_net_address” to adres komputera, że ​​żądanie pochodzi od, natomiast „local_net_address” byłoby serwera SQL (czyli NULL nad wspólną połączeń pamięci) i adres dałbyś komuś, jeśli to możliwe z jakiegoś powodu używa nazwy NetBios lub nazwy FQDN serwera.

Gorąco radzę przed używaniem this answer. Włączenie powłoki jest bardzo złym pomysłem na produkcyjnym serwerze SQL.

+0

Dobra odpowiedź, z wyjątkiem tego, że otrzymuję ujemny numer portu (-15736) dla portu, który powinien być 49800. Więc jeśli negatywny jest bezpieczny, aby po prostu dodać 65536? – crokusek

+0

Jeśli ktoś chce się zalogować zdalnie do serwera SQL mojego komputera, to jaki adres IP mu podaję? local_net_address lub client_net_address? –

+0

To nie działa w 2012 roku - adres jest pusty – scar80

7

Większość rozwiązań na uzyskanie adresu IP za pomocą T-SQL upadku na te dwa obozy:

  1. Run ipconfig.exe poprzez xp_cmdshell i analizować dane wyjściowe

  2. Zapytanie DMV sys.dm_exec_connections

Nie jestem fanem opcji nr 1. Włączenie xp_cmdshell ma pewne wady bezpieczeństwa, a mimo to jest mnóstwo związanych z nim analiz. To kłopotliwe. Opcja nr 2 jest elegancka. I to jest czyste rozwiązanie t-sql, które prawie zawsze wolę. Oto dwa przykładowe zapytania dla opcji # 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; 

Czasami żadne z powyższych zapytań nie działa. Zapytanie nr 1 zwraca wartość NULL, jeśli połączenie jest połączone za pośrednictwem pamięci współużytkowanej (zalogowane i działające w systemie SSMS na hoście SQL). Zapytanie nr 2 może nic nie zwrócić, jeśli nie ma połączeń przy użyciu protokołu z inną pamięcią. Ten scenariusz prawdopodobnie po podłączeniu do nowo zainstalowanej instancji SQL. Rozwiązanie? Wymuś połączenie przez TCP/IP. Aby to zrobić, utwórz nowe połączenie w systemie SSMS i użyj prefiksu "tcp:" z nazwą serwera. Następnie ponownie uruchom zapytanie, a otrzymasz adres IP.

SSMS - Connect to Database Engine

+0

Niesamowite dzięki za napiwek! Idealne dla mnie. – Munk

+0

To da ipv4 .. czy możemy uzyskać ipv6? –

0

Wiem, że to stary post, ale może to rozwiązanie może być przydatne, gdy chcemy pobrać adres IP i port TCP z połączenia z pamięci współdzielonej (np skrypcie prowadzonym w SSMS lokalnie na serwer). Kluczem jest otwarcie dodatkowego połączenia z serwerem SQL za pomocą OPENROWSET, w którym w łańcuchu połączenia określa się "tcp:". Reszta kodu jest jedynie budowaniem dynamicznego SQL, aby ominąć ograniczenie OPENROWSET polegające na niemożności przyjmowania zmiennych jako jego parametrów.

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

można użyć wiersza polecenia i wykonać kwerendy w MSSQL:

exec xp_cmdshell 'ipconfig' 
+0

To zadziała tylko wtedy, gdy w konfiguracji zabezpieczeń serwera włączona jest opcja 'xp_cmdshell' – D0dger

1

--try tego skryptu to działa na moje potrzeby. Przeformatuj, aby go przeczytać.

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;