Czy w SQL Server 2005 jest zapytanie, za pomocą którego mogę uzyskać adres IP lub nazwę serwera?
sql
sql-server
Seibar
źródło
źródło
Odpowiedzi:
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 da ci adres IP;
Będzie to działać dla zdalnego żądania klienta do SQL 2008 i nowszych.
Jeśli masz dozwolone połączenia z pamięcią współdzieloną, to uruchomi się powyżej na samym serwerze
<local machine>
” pojawi się w „client_net_address”.„client_net_address” to adres komputera, z którego pochodzi żądanie, podczas gdy „local_net_address” oznaczałby serwer SQL (czyli NULL w połączeniach z pamięcią współdzieloną), a adres, który dałbyś komuś, kto nie może używać NetBios serwera name lub FQDN z jakiegoś powodu.
Odradzam używanie tej odpowiedzi . Włączenie powłoki to bardzo zły pomysł na produkcyjnym serwerze SQL.
źródło
Możesz uzyskać [nazwa hosta] \ [nazwa instancji] przez:
SELECT @@SERVERNAME;
Aby uzyskać tylko nazwę hosta, jeśli masz format nazwa hosta \ nazwa instancji:
SELECT LEFT(ltrim(rtrim(@@ServerName)), Charindex('\', ltrim(rtrim(@@ServerName))) -1)
Alternatywnie, jak wskazał @GilM:
SELECT SERVERPROPERTY('MachineName')
Możesz 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
Źródło skryptu SQL .
źródło
Serwer może mieć wiele adresów IP, na których nasłuchuje. Jeśli twoje połączenie ma przyznane uprawnienie serwera VIEW SERVER STATE, możesz uruchomić tę kwerendę, aby uzyskać adres, który podłączyłeś do SQL Server:
SELECT dec.local_net_address FROM sys.dm_exec_connections AS dec WHERE dec.session_id = @@SPID;
To rozwiązanie nie wymaga wysyłania do systemu operacyjnego za pośrednictwem xp_cmdshell, co jest techniką, którą należy wyłączyć (lub przynajmniej ściśle zabezpieczyć) na serwerze produkcyjnym. Może wymagać nadania VIEW SERVER STATE do odpowiedniego loginu, ale jest to znacznie mniejsze zagrożenie bezpieczeństwa niż uruchomienie xp_cmdshell.
Preferowana jest technika wymieniona przez GilM dla nazwy serwera:
SELECT SERVERPROPERTY(N'MachineName');
źródło
Większość rozwiązań do uzyskiwania adresu IP za pośrednictwem t-sql należy do tych dwóch obozów:
Uruchom
ipconfig.exe
przezxp_cmdshell
i przeanalizuj dane wyjścioweZapytanie DMV
sys.dm_exec_connections
Nie jestem fanem opcji nr 1. Włączenie xp_cmdshell ma wady bezpieczeństwa, a mimo to wymaga wielu analiz. To kłopotliwe. Opcja nr 2 jest elegancka. I jest to czyste rozwiązanie t-sql, które prawie zawsze wolę. Oto dwa przykładowe zapytania dla opcji nr 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 jednak żadne z powyższych zapytań nie działa. Zapytanie nr 1 zwraca NULL, jeśli masz połączenie za pośrednictwem pamięci współużytkowanej (jesteś zalogowany i uruchamiasz SSMS na hoście SQL). Zapytanie nr 2 może nic nie zwrócić, jeśli nie ma połączeń korzystających z protokołu pamięci niedzielonej. Ten scenariusz jest prawdopodobny w przypadku połączenia z nowo zainstalowanym wystąpieniem SQL. Rozwiązanie? Wymuś połączenie przez TCP / IP. Aby to zrobić, utwórz nowe połączenie w programie SSMS i użyj przedrostka „tcp:” z nazwą serwera. Następnie ponownie uruchom dowolne zapytanie, a otrzymasz adres IP.
źródło
Znajduje się w zmiennej @@ SERVERNAME ;
SELECT @@SERVERNAME;
źródło
- Wypróbuj ten skrypt, który działa na moje potrzeby. Sformatuj ponownie, aby to 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;
źródło
możesz użyć zapytania z linii poleceń i wykonać w mssql:
źródło
xp_cmdshell
jest włączone w konfiguracji bezpieczeństwa serweraselect @@servername
źródło
Prostszym sposobem uzyskania nazwy komputera bez \ InstanceName jest:
SELECT SERVERPROPERTY('MachineName')
źródło
Wiem, że to stary post, ale być może to rozwiązanie przyda się, gdy chcesz pobrać adres IP i port TCP z połączenia Shared Memory (np. Ze skryptu uruchamianego w SSMS lokalnie na serwerze). Kluczem jest otwarcie dodatkowego połączenia z serwerem SQL za pomocą OPENROWSET, w którym należy określić „tcp:” w ciągu połączenia. Pozostała część kodu to po prostu budowanie dynamicznego kodu SQL, aby obejść ograniczenie OPENROWSET polegające na niemożności przyjęcia zmiennych jako 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
źródło
Ad Hoc Distributed Queries
to włączenia.