Trova tutti gli IP o gli utenti che accedono a uno specifico SQL Server


10

Diciamo che ho trovato un SQL Server e non ho idea di quali applicazioni si connettano ad esso. Forse trovo un'applicazione ma non sono sicuro che sia l'unica a utilizzarla.

C'è un modo carino per trovare tutte le connessioni distinte?

Risposte:


14

È possibile esaminare i processi attualmente in esecuzione in SSMS in Activity Monitor.

Puoi anche ottenerlo utilizzando sys.dm_exec_sessions , nonché sys.dm_exec_connections e sys.dm_exec_requests .

Query:

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 host, nome processo o nomi utente dominio spesso forniscono più informazioni di un semplice indirizzo IP. Le altre colonne possono essere aggiunte come ad esempio: login_time,last_successful_logon

IP e altre informazioni possono essere recuperate con una JOIN per sys.dm_exec_connections su session_id: client_net_address, local_net_address, connect_time, porti, ...

sys.dm_exec_requests può anche fornire informazioni utili: commandtipo ,,sql_handle ...

Questa query è solo un esempio. È necessario JOINdisporre di queste 3 viste insieme e generare / archiviare informazioni pertinenti da una di esse.

I dati di queste viste scompaiono al riavvio di SQL Server. Pertanto, se l'applicazione non è regolarmente connessa, può essere una buona idea archiviarli su base regolare usando un lavoro o uno script (Powershell).


3

Vorrei anche suggerire ciò che Julien ha suggerito, ma immagino che la pianificazione della query tramite SQL Server Agent sarebbe un'idea migliore e quindi ogni volta che viene eseguito scaricare le informazioni in una tabella fisica. Due DMV sono uniti sys.dm_exec_connectionsesys.dm_exec_sessions

Come prima crea una tabella fisica

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
);

Quindi inserire i record in questa tabella:

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;

Pianifica che venga eseguito tramite SQL Server Agent ogni 15 minuti circa e alla fine della giornata puoi vedere tutto ciò che ti piace dalla tabella session_information.


2

Abilitare il controllo dell'accesso a SQL Server per accessi riusciti e non riusciti: https://docs.microsoft.com/en-us/sql/ssms/configure-login-auditing-sql-server-management-studio

La modifica dell'ambito del controllo richiederebbe un riavvio del servizio SQL. Una volta riavviato il servizio, tutti gli accessi riusciti (utente) e il suo indirizzo IP inizieranno a essere registrati nei log di SQL Server. Questi dati possono essere raccolti per circa una settimana o 2 e quindi il file di registro può essere analizzato per elencare tutti gli indirizzi IP (e l'utente) che hanno avuto accesso ai database di SQL Server durante il periodo monitorato.

Se il componente SSRS è installato anche nella stessa casella, è possibile analizzare la tabella ExecutionLog del database ReportServer per elencare tutti gli accessi che accedono al portale SSRS.


-2

Da Ottieni indirizzo IP client in SQL Server di 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

Questo restituirà il client_net_address della connessione che lo esegue. Questo può essere utile in alcuni casi, ma non è quello che è necessario qui, soprattutto perché l'applicazione sconosciuta non chiamerà questa funzione.
Julien Vavasseur
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.