SQL Server 2017链接服务器模拟与Kerberos约束委派问题排查
排查SQL Server链接服务器Kerberos约束委派+模拟的7437错误
问题背景
在4节点SQL Server 2017集群环境中,每个节点配置指向AG监听器的链接服务器,使用Windows域账户Domain\SQLProcUser模拟调用链接服务器时,触发错误:
Msg 7437, Level 16, State 1, Line 5 Linked servers cannot be used under impersonation without a mapping for the impersonated login.
已配置链接服务器映射、Kerberos约束委派(KCD)及权限,但SQL日志和事件查看器无额外关联信息。
排查与解决方向
1. 验证链接服务器登录映射有效性
- 确认远程AG监听器对应的SQL实例上,
Domain\SQLProcUser已创建有效登录(含目标数据库权限),避免因远程无该登录导致映射失效。 - 执行以下语句检查映射配置是否正确:
SELECT * FROM master.dbo.syslinkedsrvlogins WHERE rmtsrvname = N'MyLinkedServer' AND useself = 1
确保结果同时包含默认映射(locallogin IS NULL)和Domain\SQLProcUser的单独映射条目,无重复或冲突配置。
2. 核对Kerberos委派的细节配置
- SPN完整性检查:用
setspn -L Domain\SQLServiceUser验证已注册所有必要SPN,包括:- 每个集群节点的
MSSQLSvc/NodeFQDN:portnum、MSSQLSvc/NodeNetBIOSName:portnum - AG监听器的
MSSQLSvc/ListenerName.domain.co.uk:portnum、MSSQLSvc/ListenerName:portnum
- 每个集群节点的
- KCD范围校验:在ADSI编辑器中查看
SQLServiceUser的msDS-AllowedToDelegateTo属性,确保精确包含上述所有SPN(注意大小写和端口,无多余空格)。 - 委派类型确认:
SQLServiceUser需设置为**“仅信任此用户委派到指定服务(仅使用Kerberos)”**,且仅添加MSSQLSvc类型服务,取消“账户敏感且无法委派”勾选。
3. 检查模拟上下文的权限限制
- 执行
EXECUTE AS LOGIN = 'Domain\SQLProcUser'的账户,需具备对该账户的IMPERSONATE权限,可通过以下语句验证:
SELECT * FROM sys.server_permissions WHERE permission_name = 'IMPERSONATE' AND grantee_principal_id = (SELECT principal_id FROM sys.server_principals WHERE name = 'Domain\SQLProcUser')
- 若通过SQL Agent运行存储过程,需确认Agent服务账户为域账户,且作业“运行身份”设置正确,或作业账户具备模拟
Domain\SQLProcUser的权限。
4. 排查OLE DB Provider兼容性问题
- 尝试将
SQLNCLI替换为最新的MSOLEDBSQLProvider,重新创建链接服务器:
EXEC master.dbo.sp_addlinkedserver @server = N'MyLinkedServer', @srvproduct=N'SQL Server', @provider=N'MSOLEDBSQL', @datasrc=N'ListenerName.domain.co.uk,portnum' EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'MyLinkedServer',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'MyLinkedServer',@useself=N'True',@locallogin=N'Domain\SQLProcUser',@rmtuser=NULL,@rmtpassword=NULL
- 在SSMS的「服务器对象→链接服务器→Providers」中,确保对应Provider的“允许进程内”选项已勾选。
5. 验证Kerberos身份验证是否生效
- 调用链接服务器前执行以下语句,确认当前会话身份验证协议:
SELECT auth_scheme FROM sys.dm_exec_connections WHERE session_id = @@SPID
若返回NTLM,说明Kerberos未成功协商,需重新排查SPN和委派;若返回KERBEROS,则身份验证正常,问题聚焦于模拟映射或权限。
6. 开启远程实例登录审计定位
- 在远程AG主副本实例上,开启「登录审核→失败的登录」,重新触发错误后查看SQL日志,确认
Domain\SQLProcUser是否存在登录失败记录,进一步定位权限或映射问题。
内容的提问来源于stack exchange,提问作者Jonny_Bravo
相关产品推荐
相关产品推荐

