Gibt es in SQL Server 2005 eine Abfrage, mit der ich die IP-Adresse oder den Namen des Servers abrufen kann?
Gibt es in SQL Server 2005 eine Abfrage, mit der ich die IP-Adresse oder den Namen des Servers abrufen kann?
Antworten:
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
Der Code hier gibt Ihnen die IP-Adresse;
Dies funktioniert für eine Remoteclientanforderung an SQL 2008 und höher.
Wenn Sie Shared Memory-Verbindungen zugelassen haben, erhalten Sie eine Ausführung oben auf dem Server
<local machine>
' wird in 'client_net_address' angezeigt.'client_net_address' ist die Adresse des Computers, von dem die Anforderung stammt, während 'local_net_address' der SQL-Server (also NULL über Shared Memory-Verbindungen) und die Adresse ist, die Sie jemandem geben würden, wenn dieser die NetBios des Servers nicht verwenden kann Name oder FQDN aus irgendeinem Grund.
Ich rate dringend davon ab, diese Antwort zu verwenden . Das Aktivieren der Shell ist auf einem Produktions-SQL Server eine sehr schlechte Idee.
Sie können den [Hostnamen] \ [Instanznamen] erhalten durch:
SELECT @@SERVERNAME;
So erhalten Sie nur den Hostnamen, wenn Sie das Format Hostname \ Instanzname haben:
SELECT LEFT(ltrim(rtrim(@@ServerName)), Charindex('\', ltrim(rtrim(@@ServerName))) -1)
Alternativ, wie @GilM hervorhob:
SELECT SERVERPROPERTY('MachineName')
Sie können die tatsächliche IP-Adresse folgendermaßen abrufen:
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
Der Server verfügt möglicherweise über mehrere IP-Adressen, die er abhört. Wenn Ihrer Verbindung die Serverberechtigung VIEW SERVER STATE erteilt wurde, können Sie diese Abfrage ausführen, um die Adresse abzurufen, die Sie mit SQL Server verbunden haben:
SELECT dec.local_net_address
FROM sys.dm_exec_connections AS dec
WHERE dec.session_id = @@SPID;
Für diese Lösung müssen Sie nicht über xp_cmdshell an das Betriebssystem senden. Dies ist eine Technik, die auf einem Produktionsserver deaktiviert (oder zumindest streng gesichert) werden sollte. Möglicherweise müssen Sie dem entsprechenden Login VIEW SERVER STATE zuweisen. Dies ist jedoch ein weitaus geringeres Sicherheitsrisiko als das Ausführen von xp_cmdshell.
Die von GilM für den Servernamen erwähnte Technik ist die bevorzugte:
SELECT SERVERPROPERTY(N'MachineName');
Die meisten Lösungen zum Abrufen der IP-Adresse über t-sql fallen in diese beiden Lager:
Führen Sie ipconfig.exe
via aus xp_cmdshell
und analysieren Sie die Ausgabe
DMV abfragen sys.dm_exec_connections
Ich bin kein Fan von Option 1. Das Aktivieren von xp_cmdshell hat Sicherheitsnachteile und es ist sowieso viel Parsen erforderlich. Das ist umständlich. Option 2 ist elegant. Und es ist eine reine T-SQL-Lösung, die ich fast immer bevorzuge. Hier sind zwei Beispielabfragen für Option 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;
Manchmal funktioniert jedoch keine der oben genannten Abfragen. Abfrage 1 gibt NULL zurück, wenn Sie über Shared Memory verbunden sind (angemeldet und SSMS auf dem SQL-Host ausgeführt). Abfrage Nr. 2 gibt möglicherweise nichts zurück, wenn keine Verbindungen mit einem nicht gemeinsam genutzten Speicherprotokoll bestehen. Dieses Szenario ist wahrscheinlich, wenn eine Verbindung zu einer neu installierten SQL-Instanz besteht. Die Lösung? Erzwingen Sie eine Verbindung über TCP / IP. Erstellen Sie dazu eine neue Verbindung in SSMS und verwenden Sie das Präfix "tcp:" mit dem Servernamen. Führen Sie dann eine der Abfragen erneut aus und Sie erhalten die IP-Adresse.
Es befindet sich in der Variablen @@ SERVERNAME .
SELECT @@SERVERNAME;
Sie können die Befehlszeilenabfrage verwenden und in mssql ausführen:
exec xp_cmdshell 'ipconfig'
xp_cmdshell
es in der Server-Sicherheitskonfiguration aktiviert ist
- Versuchen Sie dieses Skript, das meinen Anforderungen entspricht. Formatieren Sie es neu, um es zu lesen.
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;
select @@servername
Ich weiß, dass dies ein alter Beitrag ist, aber vielleicht kann diese Lösung nützlich sein, wenn Sie die IP-Adresse und den TCP-Port von einer Shared Memory-Verbindung abrufen möchten (z. B. von einem Skript, das in SSMS lokal auf dem Server ausgeführt wird). Der Schlüssel besteht darin, mit OPENROWSET eine sekundäre Verbindung zu Ihrem SQL Server herzustellen, in der Sie in Ihrer Verbindungszeichenfolge 'tcp:' angeben. Der Rest des Codes erstellt lediglich dynamisches SQL, um die Einschränkung von OPENROWSET zu umgehen, dass Variablen nicht als Parameter verwendet werden können.
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
Ad Hoc Distributed Queries
sein muss.