Encontre todos os IPs ou usuários que acessam um SQL Server específico

10

Digamos que encontrei um SQL Server e não tenho idéia de quais aplicativos se conectam a ele. Talvez eu encontre um aplicativo, mas não tenho certeza se é o único a usá-lo.

Existe uma boa maneira de encontrar todas as conexões distintas?

RayofCommand
fonte

Respostas:

14

Você pode ver os processos atualmente em execução no SSMS no Activity Monitor.

Você também pode obtê-lo usando sys.dm_exec_sessions , bem como sys.dm_exec_connections e sys.dm_exec_requests .

Inquerir:

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;

Nome do host, nome do processo ou nomes de usuário do domínio geralmente fornecem mais informações do que apenas um endereço IP. Outras colunas podem ser adicionados, tais como: login_time,last_successful_logon

IP e outras informações podem ser recuperadas com um JOIN para sys.dm_exec_connections on session_id: client_net_address, local_net_address, connect_time, portos, ...

sys.dm_exec_requests também pode fornecer informações úteis: commandtype ,,sql_handle ...

Esta consulta é apenas uma amostra. Você deve JOINjuntar essas três visualizações e gerar / armazenar informações relevantes de qualquer uma delas.

Os dados desses modos de exibição desaparecem quando o SQL Server é reiniciado. Portanto, se o aplicativo não estiver conectado regularmente, pode ser uma boa ideia armazená-los regularmente usando um trabalho ou um script (Powershell).

Julien Vavasseur
fonte
3

Eu também sugeriria o que Julien sugeriu, mas acho que agendar a consulta pelo SQL Server Agent seria uma ideia melhor e, toda vez que for executada, você despeja as informações em uma tabela física. Duas DMVs são unidas sys.dm_exec_connectionsesys.dm_exec_sessions

Como primeiro criar uma tabela 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
);

Em seguida, insira registros nesta tabela:

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 isso para ser executado via SQL Server Agent a cada 15 minutos ou mais e, no final do dia, você poderá ver tudo o que quiser da tabela session_information.

Shanky
fonte
2

Habilite a auditoria de logon do SQL Server para logons com êxito e com falha: https://docs.microsoft.com/en-us/sql/ssms/configure-login-auditing-sql-server-management-studio

Alterar o escopo da auditoria exigiria uma reinicialização do serviço SQL. Depois que o serviço for reiniciado, todos os logons bem-sucedidos (usuário) e seu endereço IP começarão a ser registrados nos logs do SQL Server. Esses dados podem ser coletados por cerca de uma semana ou 2 e, em seguida, o arquivo de log é analisado para listar todos os endereços IP (e usuário) que acessaram os bancos de dados do SQL Server durante o período monitorado.

Se o componente SSRS também estiver instalado na mesma caixa, a tabela ExecutionLog do banco de dados ReportServer poderá ser analisada para listar todos os logons que acessam o portal SSRS.

Masood Hashim
fonte
-2

De Obter endereço IP do cliente no 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
fonte
Isso retornará o client_net_address da conexão que está sendo executada. Isso pode ser útil em alguns casos, mas não é o necessário aqui, principalmente porque o aplicativo desconhecido não chamará essa função.
Julien Vavasseur 02/03