Temukan semua IP atau pengguna yang mengakses SQL Server tertentu

10

Katakanlah saya menemukan SQL Server dan saya tidak tahu aplikasi mana yang terhubung. Mungkin saya menemukan satu aplikasi tetapi saya tidak yakin apakah itu satu-satunya yang menggunakannya.

Apakah ada cara yang bagus untuk menemukan semua koneksi yang berbeda?

Perintah Rayof
sumber

Jawaban:

14

Anda dapat melihat proses yang sedang berjalan di SSMS di Activity Monitor.

Anda juga bisa mendapatkannya menggunakan sys.dm_exec_sessions serta sys.dm_exec_connections dan sys.dm_exec_requests .

Pertanyaan:

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;

Nama host, nama proses, atau nama pengguna domain sering kali memberikan informasi lebih dari sekadar alamat IP. Kolom lain dapat ditambahkan seperti: login_time,last_successful_logon

IP dan informasi lainnya dapat diambil dengan BERGABUNG untuk sys.dm_exec_connections pada session_id: client_net_address, local_net_address, connect_time, pelabuhan, ...

sys.dm_exec_requests juga dapat memberikan informasi bermanfaat: commandketik sql_handle,, ...

Kueri ini hanya sampel. Anda harus JOIN3 pandangan ini bersama-sama dan mengeluarkan / menyimpan informasi yang relevan dari keduanya.

Data dari tampilan ini menghilang ketika SQL Server dihidupkan ulang. Oleh karena itu jika aplikasi tidak terhubung secara teratur, mungkin ide yang baik untuk menyimpannya secara teratur menggunakan pekerjaan atau skrip (Powershell).

Julien Vavasseur
sumber
3

Saya juga akan menyarankan apa yang disarankan Julien tapi saya kira menjadwalkan query melalui SQL Server Agent akan menjadi ide yang lebih baik dan kemudian setiap kali berjalan Anda membuang informasi ke dalam tabel fisik. Dua DMV bergabung sys.dm_exec_connectionsdansys.dm_exec_sessions

Seperti pertama membuat tabel fisik

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

Kemudian masukkan catatan ke dalam tabel ini:

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;

Jadwalkan ini untuk dijalankan melalui SQL Server Agent setiap 15 menit atau lebih dan pada akhirnya Anda dapat melihat semua yang Anda suka dari tabel session_information.

Shanky
sumber
2

Aktifkan audit masuk SQL Server untuk login yang berhasil dan gagal: https://docs.microsoft.com/en-us/sql/ssms/configure-login-auditing-sql-server-management-studio

Mengubah ruang lingkup audit akan membutuhkan restart layanan SQL. Setelah layanan dimulai ulang, semua login yang berhasil (pengguna) dan Alamat IP-nya akan mulai masuk log SQL Server. Data ini dapat dikumpulkan selama sekitar satu atau dua minggu dan kemudian file log dianalisis untuk mendaftar semua Alamat IP (dan pengguna) yang telah mengakses database SQL Server selama periode yang dipantau.

Jika komponen SSRS juga diinstal pada kotak yang sama, maka tabel ExecutionLog dari database ReportServer dapat dianalisis untuk mendaftar semua login yang mengakses portal SSRS.

Masood Hashim
sumber
-2

Dari Get Client IP Address di SQL Server oleh 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
sumber
Ini akan mengembalikan client_net_address dari koneksi yang menjalankannya. Ini mungkin berguna dalam beberapa kasus tetapi bukan yang dibutuhkan di sini, terutama karena aplikasi yang tidak dikenal tidak akan memanggil fungsi ini.
Julien Vavasseur