非SQL Server Agent运行SSIS时平面文件文件夹权限错误咨询
根因分析
你遇到的问题核心是Kerberos双跳身份验证限制,以及SSIS目录默认执行上下文的权限逻辑:
- 当你通过SQL Agent作业运行时,作业直接用你配置的凭据访问网络共享,属于单跳身份验证,NTLM协议也支持,所以运行正常
- 当你通过SSMS、DTEXEC、
catalog.start_execution发起执行时,身份验证链路是「发起请求的客户端→SQL Server→网络共享」,属于两跳请求,默认NTLM协议不支持身份信息传递,导致SSIS执行进程拿到的身份是匿名或者无效身份,无法访问网络共享,哪怕你登录SSMS的账号有权限也没用。
最优解决方案(无需修改现有业务逻辑,无需新增中间层)
方案1:配置Kerberos约束委派(无侵入,无需改包)
适合企业AD管理规范的场景,操作完成后所有调用方式都可以直接用,不需要改任何包逻辑:
- 为SQL Server服务账号注册服务主体名称(SPN),在域控上用域管理员权限执行以下命令:
setspn -S MSSQLSvc/<SQL实例主机名>:<端口> <域\SQL服务账号> setspn -S MSSQLSvc/<SQL实例主机FQDN>:<端口> <域\SQL服务账号>
- 在域控的用户属性中,为SQL Server服务账号配置约束委派,允许它委派到网络共享所在服务器的
CIFS服务 - 调用
catalog.start_execution启动包前,显式指定执行身份为你配置的有权限的域账号:
DECLARE @execution_id BIGINT EXEC SSISDB.catalog.create_execution @package_name=N'你的包名.dtsx', @execution_id=@execution_id OUTPUT, @folder_name=N'你的SSIS目录文件夹名', @project_name=N'你的项目名', @use32bitruntime=False, @reference_id=Null -- 显式指定运行身份(系统参数,参数类型为2) EXEC SSISDB.catalog.set_execution_parameter_value @execution_id, @object_type=2, @parameter_name=N'RUNAS_USER_NAME', @parameter_value=N'域\有权限的账号' -- 设置你要修改的自定义参数 EXEC SSISDB.catalog.set_execution_parameter_value @execution_id, @object_type=30, @parameter_name=N'你的自定义参数名', @parameter_value=N'参数值' EXEC SSISDB.catalog.start_execution @execution_id
方案2:包内挂载网络共享(改包成本极低,无需改AD配置)
适合不想动AD配置的场景,只需要给包加2个参数、2个执行进程任务即可:
- 在SSIS包中新增两个项目参数:
NetShareUser:字符串类型,默认值填你配置的有权限的域账号(格式:域\账号)NetSharePwd:字符串类型,设置为敏感参数,默认值填对应账号的密码
- 在现有数据流任务之前,新增一个「执行进程任务」,配置如下:
- 可执行文件:
cmd.exe - 参数:
/c net use \\<网络共享根路径> /user:@[$Project::NetShareUser] @[$Project::NetSharePwd]
- 可执行文件:
- 在包所有访问网络共享的任务执行完成后,再新增一个「执行进程任务」,配置如下:
- 可执行文件:
cmd.exe - 参数:
/c net use \\<网络共享根路径> /delete
- 可执行文件:
- 重新部署包即可,定时运行时用默认参数,手动运行时可以传自定义的参数值,也可以单独传共享账号密码参数适配不同权限场景。
方案对比
以上两个方案都不需要新增参数表、额外同步任务,不会引入新的故障点,远优于你提到的两个替代方案:
- 方案1完全无侵入,不需要改包,适合包逻辑复杂、不想修改的场景
- 方案2改造成本极低,不依赖AD配置,通用性更强
内容的提问来源于stack exchange,提问作者samp
相关产品推荐
相关产品推荐

