web-dev-qa-db-ja.com

特定のSQL ServerにアクセスするすべてのIPまたはユーザーを検索する

SQLサーバーを見つけたのに、どのアプリケーションがそれに接続しているのかわかりません。多分私は1つのアプリケーションを見つけますが、それがそれを使用している唯一のアプリケーションかどうかはわかりません。

すべての個別の接続を見つける良い方法はありますか?

10
RayofCommand

SSMSで現在実行中のプロセスをアクティビティモニターで確認できます。

sys.dm_exec_sessionssys.dm_exec_connections および sys.dm_exec_requests を使用して取得することもできます。

クエリ:

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;

ホスト名、プロセス名、またはドメインユーザー名は、IPアドレスだけではなく、多くの情報を提供します。 login_timelast_successful_logonなどの他の列を追加できます。

IPおよびその他の情報は、session_idclient_net_addresslocal_net_addressconnect_time、ports、。 sys.dm_exec_connections へのJOINを使用して取得できます。 。

sys.dm_exec_requests も役立つ情報を提供できます:commandタイプ、sql_handle、...

このクエリは単なるサンプルです。これらの3つのビューを一緒にJOINして、どちらかから関連情報を出力/保存する必要があります。

これらのビューのデータは、SQL Serverを再起動すると消えます。したがって、アプリケーションが定期的に接続されていない場合は、ジョブまたはスクリプト(Powershell)を使用して定期的にアプリケーションを保存することをお勧めします。

14

Julienの提案もお勧めしますが、SQL Serverエージェントを介してクエリをスケジュールする方が適切だと思います。実行するたびに、情報を物理テーブルにダンプします。 2つのDMVが結合されますsys.dm_exec_connectionsおよびsys.dm_exec_sessions

最初に物理テーブルを作成するように

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

次に、このテーブルにレコードを挿入します。

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;

これをSQL Serverエージェント経由で15分ごとに実行するようにスケジュールします。1日の終わりに、テーブルsession_information

3
Shanky

成功したログインと失敗したログインのSQL Serverログイン監査を有効にします。 https://docs.Microsoft.com/en-us/sql/ssms/configure-login-auditing-sql-server-management-studio

監査スコープを変更すると、SQLサービスの再起動が必要になります。サービスが再起動されると、成功したすべてのログイン(ユーザー)とそのIPアドレスがSQL Serverログに記録され始めます。このデータは約1週間または2週間収集できます。その後、ログファイルを分析して、監視期間中にSQL ServerデータベースにアクセスしたすべてのIPアドレス(およびユーザー)を一覧表示します。

SSRSコンポーネントも同じボックスにインストールされている場合、ReportServerデータベースのExecutionLogテーブルを分析して、SSRSポータルにアクセスするすべてのログインを一覧表示できます。

2
Masood Hashim