You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双跳场景下向SQL Server委托凭证失败的排查求助

问题排查:任务计划程序启动EXE连接SQL Server时身份验证失败

我的需求

我们使用任务计划程序(Task Scheduler)启动一个EXE程序,该程序运行过程中需要连接SQL Server。
流程如下:

  1. taskServer.myDomain触发任务计划程序操作
  2. taskServer.myDomain本地运行该EXE
  3. 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

核心问题

  1. 第一跳(任务计划程序到EXE)和第二跳(EXE到sqlServer上的SQL)之间的断开点是什么?
  2. 为什么taskServer和otherServer的行为不一致?

内容的提问来源于stack exchange,提问作者Preston Aoki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:30:54