SQL代理作业中使用Windows凭据运行SSIS包跨域访问权限异常咨询
无信任跨域环境下SQL Server代理运行SSIS包访问远端服务器的适配方案
核心矛盾拆解:域A、ServerA与域B无任何信任关系时,域级Kerberos认证链路完全失效,所有跨机认证只能依赖NTLM哈希对等校验。你之前本地RDP登录后用VS跑包正常、代理作业跑不通的核心原因,是SQL代理的进程运行上下文和你本地登录用户的上下文完全隔离,本地登录时存的凭据、拿到的权限令牌,SQL代理的后台进程根本访问不到;之前尝试的影子账号方案失效,绝大多数情况是漏了Windows对本地账号远程访问的默认降权策略。
先明确你之前尝试的方案失效的高频原因
- 存在凭据的用户上下文错位:你在Windows凭据管理器里存的能连通ServerB的凭据,是保存在你RDP登录的个人用户配置文件下的,SQL代理作为后台系统服务运行时,只会读取服务自身上下文、或者显式绑定到SQL凭据存储的内容,根本读不到你个人存的凭据
- 本地账号令牌被UAC过滤:Server 2012R2及以上版本默认开启本地账号远程访问的令牌过滤,只要是本地账号发起的远程连接,哪怕账号属于管理员组,系统也会自动过滤掉高权限令牌,给远端服务器传一个降级后的标准用户权限,哪怕账号名密码完全匹配,也会因为权限不足被拒
- 影子账号的权限缺失:把本地账号配成SQL代理的执行代理时,如果没有给账号分配批处理登录、服务登录的本地安全策略权限,SQL代理无法模拟该账号生成有效访问令牌,最终还是会用SQL代理自身的服务账号去连ServerB,自然没有访问权限
零信任域前提下的可落地方案
- 配置两侧服务器的对等本地账号
- 在ServerA的本地用户管理中创建固定永不过期的本地账号,例如命名为
SsisCrossRun,设置统一的无特殊编码问题的固定密码 - 在ServerB上找到对目标写入路径/目标数据库实例有明确读写权限的本地账号,确保账号名、密码和ServerA上的
SsisCrossRun完全一致(注意不要出现密码带首尾空格、两边密码编码不统一的问题)
- 在ServerA的本地用户管理中创建固定永不过期的本地账号,例如命名为
- 关闭本地账号的远程令牌过滤
- 分别在ServerA、ServerB上打开注册表编辑器,定位到
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System路径 - 新建DWORD类型的注册表项
LocalAccountTokenFilterPolicy,赋值为1,重启两台服务器后生效——这一步的作用是让本地账号发起远程连接时,传递完整的权限令牌,不会被系统自动降权
- 分别在ServerA、ServerB上打开注册表编辑器,定位到
- 给SQL代理侧配齐账号权限
- 在ServerA上打开本地安全策略,定位到
本地策略→用户权限分配 - 给
SsisCrossRun账号分配两个基础权限:作为批处理作业登录、作为服务登录
- 在ServerA上打开本地安全策略,定位到
- 配置SQL Server代理的凭据与执行代理
- 连接到运行SSIS包的SQL实例,在实例的
安全性→凭据路径下新建凭据,身份填写ServerA本地的ServerA\SsisCrossRun,密码填入之前设置的固定密码——注意不要在这里填写域B的账号,因为无信任场景下系统根本无法识别跨域的身份主体 - 定位到
SQL Server代理→代理→凭据代理,新建执行代理,绑定刚才创建的SsisCrossRun凭据,勾选为SSIS包执行子系统授权 - 修改你的SSIS作业步骤配置,把步骤的执行身份从默认的“SQL代理服务账号”改成刚才新建的代理
- 连接到运行SSIS包的SQL实例,在实例的
- 修正SSIS包的连接配置
- 找到包中连接ServerB的连接管理器,把连接的
RetainSameConnection属性设为True,同时把包的保护级别改成ServerStorage——避免因为包内加密的凭据在SQL代理上下文下解密失败 - 所有对ServerB的访问路径用UNC格式填写(例如
\\ServerB\TargetShare),不要使用你本地RDP登录时映射的网络盘符——这类盘符是绑定在你个人用户上下文下的,SQL代理运行时完全看不到
- 找到包中连接ServerB的连接管理器,把连接的
快速排查校验步骤
- 改完配置运行作业时,先在ServerA上开启安全登录审计日志,根据日志判断链路断点:
- 如果日志显示连ServerB的认证请求没有携带
SsisCrossRun的身份,说明SQL代理的执行代理绑定未生效,作业仍在使用SQL代理的默认服务账号运行 - 如果日志显示ServerB收到了认证请求但直接拒绝,说明两侧的账号密码哈希不匹配,回去核对两边账号的密码、名称是否完全一致
- 如果日志显示认证成功但访问被拒绝,说明
LocalAccountTokenFilterPolicy注册表配置未生效,重启服务器后重新校验配置项
- 如果日志显示连ServerB的认证请求没有携带
内容的提问来源于stack exchange,提问作者Hooman Nemati
相关产品推荐
相关产品推荐

