Tìm tất cả IP hoặc người dùng truy cập SQL Server cụ thể


10

Giả sử tôi đã tìm thấy SQL Server và tôi không biết ứng dụng nào kết nối với nó. Có thể tôi tìm thấy một ứng dụng nhưng tôi không chắc đó có phải là ứng dụng duy nhất sử dụng nó không.

Có một cách tốt đẹp để tìm tất cả các kết nối khác biệt?

Câu trả lời:


14

Bạn có thể xem các quy trình hiện đang chạy trong SSMS trong Trình giám sát hoạt động.

Bạn cũng có thể lấy nó bằng sys.dm_exec_sments cũng như sys.dm_exec_connectionssys.dm_exec numquests .

Truy vấn:

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;

Tên máy chủ, tên quá trình hoặc tên người dùng tên miền thường cung cấp nhiều thông tin hơn chỉ là một địa chỉ IP. Các cột khác có thể được thêm vào như : login_time,last_successful_logon

IP và các thông tin khác có thể được lấy ra với lệnh JOIN để sys.dm_exec_connections trên session_id: client_net_address, local_net_address, connect_time, bến cảng, ...

sys.dm_exec numquests cũng có thể cung cấp thông tin hữu ích: commandloại sql_handle, ...

Truy vấn này chỉ là một mẫu. Bạn phải JOINcùng nhau xem 3 lượt xem và xuất / lưu trữ thông tin liên quan từ một trong hai lượt xem.

Dữ liệu từ các chế độ xem này không xuất hiện khi SQL Server được khởi động lại. Do đó, nếu ứng dụng không được kết nối thường xuyên, có thể nên lưu trữ chúng một cách thường xuyên bằng cách sử dụng một công việc hoặc một tập lệnh (Powershell).


3

Tôi cũng sẽ đề xuất những gì Julien đề xuất nhưng tôi đoán lập lịch truy vấn thông qua SQL Server Agent sẽ là ý tưởng tốt hơn và sau đó mỗi khi nó chạy bạn sẽ đổ thông tin vào một bảng vật lý. Hai DMV được tham gia sys.dm_exec_connectionssys.dm_exec_sessions

Giống như lần đầu tiên tạo một bảng vật lý

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

Sau đó chèn hồ sơ vào bảng này:

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;

Lên lịch để chạy qua SQL Server Agent cứ sau 15 phút hoặc lâu hơn và vào cuối ngày bạn có thể thấy mọi thứ bạn thích từ bảng session_information.


2

Cho phép kiểm tra đăng nhập SQL Server để đăng nhập thành công và thất bại: https://docs.microsoft.com/en-us/sql/ssms/configure-login-auditing-sql-server-manloyment-studio

Thay đổi phạm vi kiểm toán sẽ yêu cầu khởi động lại dịch vụ SQL. Khi dịch vụ được khởi động lại, tất cả thông tin đăng nhập thành công (người dùng) và Địa chỉ IP của nó sẽ bắt đầu đăng nhập vào nhật ký SQL Server. Dữ liệu này có thể được thu thập trong khoảng một hoặc 2 tuần và sau đó tệp nhật ký được phân tích để liệt kê tất cả các Địa chỉ IP (và người dùng) đã truy cập cơ sở dữ liệu SQL Server trong khoảng thời gian được theo dõi.

Nếu thành phần SSRS cũng được cài đặt trên cùng một hộp, thì bảng ExecutLog của cơ sở dữ liệu ReportServer có thể được phân tích để liệt kê tất cả các thông tin đăng nhập truy cập vào cổng SSRS.


-2

Từ Nhận địa chỉ IP của máy khách trong SQL Server của 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

Điều này sẽ trả về client_net_address của liên kết chạy nó. Điều này có thể hữu ích trong một số trường hợp nhưng không phải là điều cần thiết ở đây, đặc biệt là vì ứng dụng không xác định sẽ không gọi chức năng này.
Julien Vavasseur
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.