SQL Server 2012:Security_error_ring_buffer_recorded:ImpersonateSecurityContext

Jen*_* W. 10 sql-server-2012

我管理的几台服务器在 system_health XE 会话中记录了很多事件。

error_code 5023 应该是(系统错误代码):

ERROR_INVALID_STATE    5023 (0x139F)

The group or resource is not in the correct state to perform the requested operation.
Run Code Online (Sandbox Code Playgroud)

我在事件安全日志和 SQL Server 日志中都没有登录失败事件。

sta*_*ray 5

我假设您正在寻找这些事件的定义和根本原因。

\n

它的工作原理:SQL Server 2005 SP2 安全环形缓冲区 \xe2\x80\x93 RING_BUFFER_SECURITY_ERROR 存档

\n
\n

SQL Server 2005 SP2 针对各种安全错误添加了新的环形缓冲区条目 ( sys.dm_os_ring_buffers)。添加环形缓冲区条目的原因是为了向 DBA 提供有关客户端为何收到登录失败或其他此类错误的更多详细信息。

\n
\n

您声明事件日志和错误日志中都没有失败的登录条目。相反,您可以直接查询此环形缓冲区:

\n
SELECT CONVERT (varchar(30), GETDATE(), 121) as runtime,\ndateadd (ms, (a.[Record Time] - sys.ms_ticks), GETDATE()) as [Notification_Time],\na.* , sys.ms_ticks AS [Current Time]\nFROM\n(SELECT\nx.value(\'(//Record/Error/ErrorCode)[1]\', \'varchar(30)\') AS [ErrorCode],\nx.value(\'(//Record/Error/CallingAPIName)[1]\', \'varchar(255)\') AS [CallingAPIName],\nx.value(\'(//Record/Error/APIName)[1]\', \'varchar(255)\') AS [APIName],\nx.value(\'(//Record/Error/SPID)[1]\', \'int\') AS [SPID],\nx.value(\'(//Record/@id)[1]\', \'bigint\') AS [Record Id],\nx.value(\'(//Record/@type)[1]\', \'varchar(30)\') AS [Type],\nx.value(\'(//Record/@time)[1]\', \'bigint\') AS [Record Time]\nFROM (SELECT CAST (record as xml) FROM sys.dm_os_ring_buffers\nWHERE ring_buffer_type = \'RING_BUFFER_SECURITY_ERROR\') AS R(x)) a\nCROSS JOIN sys.dm_os_sys_info sys\nORDER BY a.[Record Time] ASC\n
Run Code Online (Sandbox Code Playgroud)\n

通知时间可能会揭示根本原因。

\n

我想您会发现条目的日期/时间将与错误日志中的登录失败条目对齐,类似于:

\n
\n

“用户\'domain\\user\'登录失败。原因:基于令牌的服务器访问验证因基础结构错误而失败。检查以前的错误。[客户端:]错误:18456 严重性:14 状态:11。”

\n
\n

来自对特定登录失败错误消息进行故障排除 存档

\n
\n

状态 11 对应于\xe2\x80\x9cValid Login but server access failure\xe2\x80\x9d,这表示登录有效,但缺少某些安全权限,而这些权限将授予其访问实例的权限。

\n
    \n
  1. 通过查看 sys.server_principals 的输出,检查该登录名是否直接映射到 SQL Server 登录名之一。
  2. \n
  3. 如果登录名直接映射到 SQL 实例中的可用登录名之一,则检查登录名的 SID 是否与 Windows 登录名的 SID 匹配。
  4. \n
\n
\n

如果有人删除了 Windows/AD 级别的登录名并将其添加回来,它将获得一个新的 SID,该 SID 与 SQL 存储在其系统目录中的 SID 不匹配,并且它将失败。

\n

  • 我在非 AD 服务器上看到了同样的行为,并且它们与任何登录失败或其他错误无关。它只是记录安全错误环形缓冲区并淹没 system_health,而没有其他原因导致其发生。 (4认同)