双跳场景下向SQL Server委托凭证失败的排查求助
我的需求
我们使用任务计划程序(Task Scheduler)启动一个EXE程序,该程序运行过程中需要连接SQL Server。
流程如下:
- taskServer.myDomain触发任务计划程序操作
- taskServer.myDomain本地运行该EXE
- taskServer.myDomain发起与sqlServer.myDomain的连接
该计划任务关联服务账户svc_user,设置为以最高权限运行、无论用户是否登录都运行,并存储访问非本地资源的凭据。
实际现象
任务计划程序确实以svc_user身份运行,成功触发EXE,且EXE也以svc_user身份运行。但当EXE发起SQL Server连接时,出现身份验证错误。
查看事件查看器(Event Viewer)可见SQL连接初始化失败信息:
Exception Info: System.Data.SqlClient.SqlException at System.Data.SqlClient.SqlInternalConnectionTds..ctor(System.Data.ProviderBase.DbConnectionPoolIdentity, System.Data.SqlClient.SqlConnectionString, System.Data.SqlClient.SqlCredential, System.Object, System.String, System.Security.SecureString, Boolean, System.Data.SqlClient.SqlConnectionString, System.Data.SqlClient.SessionData, System.Data.ProviderBase.DbConnectionPool, System.String, Boolean, System.Data.SqlClient.SqlAuthenticationProviderManager)
查看SQL Server日志发现问题根源:
Logon,Unknown,Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'. Reason: Could not find a login matching the name provided.
EXE发起的SQL Server连接尝试以ANONYMOUS LOGON身份验证。
已尝试的操作
背景
该问题出现在IT团队部署组策略(GPO)锁定环境之后。为排查到当前阶段,先添加GPO例外,允许svc_user:
- 本地登录
- 作为批处理作业登录
进展
此时开始能在SQL Server中捕获到ANONYMOUS LOGON错误。之后尝试了其他GPO例外,包括:
- 允许凭据保存(Allow Credential Save)
- 允许计算机和用户账户被信任用于委托(Enable computer and user accounts to be trusted for delegation)
实际问题分析
这似乎是双跳委托问题。尝试添加GPO策略,允许使用WSMAN/*协议+通配符委托新凭据(Fresh credentials),但存在两个问题:
Fresh凭据指运行时提示的凭据,而该EXE在非工作时间以服务形式运行,继承自任务计划程序的凭据WSMAN协议用于远程PowerShell会话,而非SQL服务连接
因此,将MSSQLSvc/*协议添加到启用的委托中,并尝试了Fresh、Saved和Default委托的所有组合。(所有操作均在本地计算机策略 -> 计算机配置 -> 管理模板 -> 系统 -> 凭据委托中完成)
异常情况
我们有另一台服务器otherServer.myDomain,配置了相同的任务计划程序和GPO成员身份,但它能成功连接SQL Server。据了解,两台服务器的设置和配置完全相同。
当前排查情况
进一步排查了所有可能提供线索的地方,包括监控taskServer与sqlServer、otherServer与sqlServer之间的流量。
发现sqlServer向taskServer/otherServer发起了NTLM质询:
- taskServer的NTLM响应仅包含
workstationString=taskServer - otherServer的NTLM响应包含
workstationString=otherServer、domainString=myDomain和userString=svc_user
核心问题
- 第一跳(任务计划程序到EXE)和第二跳(EXE到sqlServer上的SQL)之间的断开点是什么?
- 为什么taskServer和otherServer的行为不一致?
内容的提问来源于stack exchange,提问作者Preston Aoki

