Czy istnieje zapytanie w SQL Server 2005 Czy mogę użyć adresu IP lub nazwy serwera?SQL - Zapytanie o adres IP serwera
Odpowiedz
select @@servername
Jest to zmienna @@SERVERNAME;
SELECT @@SERVERNAME;
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
Prostszym sposobem, aby uzyskać nazwę komputera bez \ Nazwa_wystąpienia to:
SELECT SERVERPROPERTY('MachineName')
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');
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.
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
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? –
To nie działa w 2012 roku - adres jest pusty – scar80
Większość rozwiązań na uzyskanie adresu IP za pomocą T-SQL upadku na te dwa obozy:
Run
ipconfig.exe
poprzezxp_cmdshell
i analizować dane wyjścioweZapytanie 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.
Niesamowite dzięki za napiwek! Idealne dla mnie. – Munk
To da ipv4 .. czy możemy uzyskać ipv6? –
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
można użyć wiersza polecenia i wykonać kwerendy w MSSQL:
exec xp_cmdshell 'ipconfig'
To zadziała tylko wtedy, gdy w konfiguracji zabezpieczeń serwera włączona jest opcja 'xp_cmdshell' – D0dger
--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;
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. –
przegłosowano za mówienie nie tylko po to, aby zablokować xp_cmdshell, ale w celu zapewnienia ścisłej ochrony – SheldonH