Encuentra todas las IP o usuarios que acceden a un servidor SQL específico

10

Digamos que encontré un SQL Server y no tengo idea de qué aplicaciones se conectan a él. Quizás encuentre una aplicación, pero no estoy seguro de si es la única que la usa.

¿Hay una buena manera de encontrar todas las conexiones distintas?

RayofCommand
fuente

Respuestas:

14

Puede ver los procesos actualmente en ejecución en SSMS en el Monitor de actividad.

También puede obtenerlo utilizando sys.dm_exec_sessions , así como sys.dm_exec_connections y sys.dm_exec_requests .

Consulta:

SELECT DB_NAME(database_id) as [DB]
    , login_name
    , nt_domain
    , nt_user_name
    , status
    , host_name
    , program_name
    , COUNT(*) AS [Connections]
FROM sys.dm_exec_sessions
WHERE database_id > 0 -- OR 4 for user DBs
GROUP BY database_id, login_name, status, host_name, program_name, nt_domain, nt_user_name;

El nombre de host, el nombre de proceso o los nombres de usuario de dominio a menudo brindan más información que solo una dirección IP. Otras columnas se pueden añadir tales como: login_time,last_successful_logon

IP y otros datos pueden ser recuperados con un JOIN a sys.dm_exec_connections en session_id: client_net_address, local_net_address, connect_time, puertos, ...

sys.dm_exec_requests también puede proporcionar información útil: commandtipo ,,sql_handle ...

Esta consulta es solo una muestra. Debe tener JOINestas 3 vistas juntas y generar / almacenar información relevante de cualquiera de ellas.

Los datos de esta vista desaparecen cuando se reinicia SQL Server. Por lo tanto, si la aplicación no está conectada regularmente, puede ser una buena idea almacenarla regularmente utilizando un trabajo o un script (Powershell).

Julien Vavasseur
fuente
3

También sugeriría lo que sugirió Julien, pero supongo que programar la consulta a través del Agente SQL Server sería una mejor idea y luego, cada vez que se ejecuta, vuelca la información en una tabla física. Dos DMV se unen sys.dm_exec_connectionsysys.dm_exec_sessions

Como crear primero una tabla física

create table Session_Information 
( session_id int,
net_transport nvarchar(40),
host_name nvarchar(128),
program_name nvarchar(128),
nt_user_name nvarchar(128), 
connect_time datetime,
client_interface_name  nvarchar(128),
client_net_address varchar(48),
local_net_address varchar(48),
login_name nvarchar(128),
nt_domain nvarchar(128),
login_time datetime
);

Luego inserte registros en esta tabla:

Insert into Session_Information
  SELECT 
      c.session_id, 
      c.net_transport, 
      s.host_name, 
      s.program_name, 
      s.nt_user_name,
      c.connect_time, 
      s.client_interface_name,
      c.client_net_address,
      c.local_net_address, 
      s.login_name, 
      s.nt_domain, 
      s.login_time 
  FROM sys.dm_exec_connections AS c
  JOIN sys.dm_exec_sessions AS s
    ON c.session_id = s.session_id;

Programe que se ejecute a través del Agente SQL Server cada 15 minutos más o menos y al final del día podrá ver todo lo que quiera de la tabla session_information.

Shanky
fuente
2

Habilite la auditoría de inicio de sesión de SQL Server para inicios de sesión exitosos y fallidos: https://docs.microsoft.com/en-us/sql/ssms/configure-login-auditing-sql-server-management-studio

Cambiar el alcance de la auditoría requeriría un reinicio del servicio SQL. Una vez que se reinicia el servicio, todos los inicios de sesión exitosos (usuario) y su dirección IP comenzarán a registrarse en los registros de SQL Server. Estos datos se pueden recopilar durante aproximadamente una semana o 2 y luego se puede analizar el archivo de registro para enumerar todas las direcciones IP (y usuarios) que han accedido a las bases de datos de SQL Server durante el período monitoreado.

Si el componente SSRS también está instalado en el mismo cuadro, se puede analizar la tabla ExecutionLog de la base de datos ReportServer para enumerar todos los inicios de sesión que acceden al portal SSRS.

Masood Hashim
fuente
-2

De Obtener la dirección IP del cliente en SQL Server por Sarvesh Kumar Gupta :

CREATE FUNCTION [dbo].[GetCurrentIP] ()
RETURNS varchar(255)
AS
BEGIN
    DECLARE @IP_Address varchar(255);

   SELECT @IP_Address = client_net_address
    FROM sys.dm_exec_connections
    WHERE Session_id = @@SPID;

   Return @IP_Address;
END
MD Haidar Ali Khan
fuente
Esto devolverá el client_net_address de la conexión que lo ejecuta. Esto puede ser útil en algunos casos, pero no es lo que se necesita aquí, especialmente porque la aplicación desconocida no llamará a esta función.
Julien Vavasseur