我们如何找到谁使用了专用管理连接

San*_* KB 3 sql-server sql-server-2012 dac

有什么方法可以找到谁使用了专用管理连接?

不是活动连接而是前一个已经关闭的连接?

Aar*_*and 16

SQL Server 不会在任何地方维护此信息;如果您试图抓住滥用 DAC 的人,要么从显然不应该拥有它的人手中夺走系统管理员,要么至少设置某种轮询机制来抓住他们。你可以有一个这样的表:

CREATE TABLE dbo.DBA_DacAccess
(
  ConnectTime      datetime,
  FirstObservance  datetime2 NOT NULL DEFAULT SYSUTCDATETIME(),
  LoginName        sysname,
  HostName         sysname,
  AppName          sysname,
  Interface        nvarchar(32),
  ClientNetAddress nvarchar(48)
);
Run Code Online (Sandbox Code Playgroud)

然后确定一些合理的时间间隔以在存在 DAC 连接时收集有关 DAC 连接的信息,然后以该频率运行以下命令(可能使用 SQL Server 代理作业):

INSERT dbo.DBA_DacAccess
(
  ConnectTime, 
  LoginName, 
  HostName, 
  AppName, 
  Interface, 
  ClientNetAddress
)
SELECT 
  c.connect_time, 
  s.login_name, 
  s.[host_name], 
  s.[program_name], 
  s.client_interface_name, 
  c.client_net_address
FROM sys.dm_exec_connections AS c 
INNER JOIN sys.dm_exec_sessions AS s
ON c.session_id = s.session_id
WHERE c.endpoint_id = 1
AND NOT EXISTS 
(
  SELECT 1 FROM dbo.DBA_DacAccess 
  WHERE connect_time = c.connect_time
);
Run Code Online (Sandbox Code Playgroud)

这将继续有效,但是如果他们快速进出,您必须很幸运(或经常轮询)才能抓住它们,因此您可能需要微调该时间表。此外,如果您想知道为什么这不是LOGON TRIGGER,有两个原因:(1) DAC 根据设计和必要绕过这些,以及 (2) 这些 DMV 中的行/数据在它们逃脱触发器之前不存在反正。

对于过去的事件,如果幸运的话,尝试从 SSMS 访问 DAC 的人将被尝试再次连接的后台连接咬住,因为失败的尝试将被写入错误日志,并且IP 地址附加到消息的末尾(但不包含任何其他信息)。如果有人使用远程桌面连接到服务器,或者使用非 SSMS 的应用程序不尝试使用相同的ADMIN:凭据建立其他连接,这将无济于事,但如果他们远程使用 SSMS,则应该很有用:

04/23/2018 08:11:18 未知
登录 无法连接,因为“1”专用管理员连接的最大数量已经存在。在建立新连接之前,必须通过注销或结束进程来删除现有的专用管理员连接。[客户:192.168.0.99]