SQL Server,如何记录失败登录尝试的客户端PID?

Spa*_*sle 2 security sql-server extended-events error-log

我试图找出哪个进程正在尝试使用错误的密码连接到我的 SQL Server 实例。日志文件仅包含发起连接的 IP 地址。例子:

日期 4/05/2021 9:43:34 AM 日志 SQL Server(当前 - 5/05/2021 10:11:00 AM)

源登录

消息 用户“SA”登录失败。原因:密码与提供的登录密码不匹配。[客户端:10.120.1.99]

它不会记录来自客户端计算机的哪个 PID 进行了尝试。
我知道我可以使用探查器来找出哪台机器的哪个 PID 对此负责。但我不想为此保持分析器运行。(特别是如果这种情况很少发生,在这种情况下,我需要让分析器运行几天才能捕获这种尝试)。

有没有办法记录此类失败登录的 PID 和 IP?

Ron*_*ldo 6

默认服务器跟踪

尝试从默认服务器跟踪中获取更多信息,如 Eitan Blumin 的文章Finding the Details Missing from the SQL Server Failed Logins Audit使用以下查询所示:

SELECT  trc.*
FROM fn_trace_getinfo(default) AS inf
CROSS APPLY fn_trace_gettable (convert(nvarchar(255), inf.value),default ) AS trc
WHERE inf.property = 2 AND inf.value IS NOT NULL
AND trc.EventClass= 20 
ORDER BY trc.StartTime DESC
Run Code Online (Sandbox Code Playgroud)

XE会议

或者,Dave Bland 的文章使用扩展事件查找失败的登录有一个示例,说明如何使用 XE 会话来实现它:

CREATE EVENT SESSION [FailedLogins] ON SERVER   
ADD EVENT sqlserver.error_reported(  
ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.nt_username)  
WHERE ([severity]=(14) AND [error_number]=(18456) AND [state]>(1)))  
ADD TARGET package0.event_file(SET filename=N'C:\temp\FailedLogins.xel')  
GO
Run Code Online (Sandbox Code Playgroud)

不要忘记创建路径上列出的文件夹(或更改它)。通过该 XE 会话,您将能够捕获client_app_name您实际要查找的内容,而不仅仅是 PID。

SQL Server审计

您还可以配置SQL Server Audit,但文档说:

SQL Server 审核使用扩展事件来帮助创建审核。

因此,使用审核的成本与创建 XE 会话的成本大致相同。