由于扩展了旧系统,我需要从较旧的SSIS(另一台服务器)运行SSIS2016程序包。该软件包可以从SQL Agent正常运行,但是我无法使用tsql或DTEXEC运行它。问题是,即使在提升的cmd(在sysadmin下)运行,程序包也无法访问网络
当使用execute运行SSMS,TSQL或DTEXEC时,程序包无法将文件保存到网络。
DTEXEC /ISSERVER "\SSISDB\XXXX\Exports\package.dtsx" /SERVER "." /Par
"$Package::FilePath(String)";"C:\TEMP"
从我在Internet上阅读的所有内容来看,似乎运行SSIS2016软件包的唯一方法是使用SQL Agent和作业。
我对DTEXEC忽略执行命令行的帐户的安全上下文感到惊讶。 有没有办法强迫它使用代理帐户?
我很难相信,只有在获得网络许可的情况下运行软件包的唯一方法就是使用Sql代理和作业。
谢谢。 ps。 good article是关于运行程序包的信息,但它完全忽略了网络访问问题。
编辑2019-06-10
我应用了MSSQL2016 CU7并重新启动了服务器。 之后,
平面文件目标未通过预执行阶段并返回错误 代码0xC020200E。
无法打开数据文件..
在数据流中还警告“访问被拒绝”,应该保存文件。
存储过程的源代码
DECLARE @execution_id BIGINT;
EXEC [SSISDB].[catalog].[create_execution]
@package_name = N'package.dtsx',
@execution_id = @execution_id OUTPUT,
@folder_name = N'XXXX',
@project_name = N'Exports',
@use32bitruntime = False,
@reference_id = NULL;
SELECT @execution_id;
DECLARE @var0 SQL_VARIANT = N'\\NETWORK\PATH\Export\test_files';
EXEC [SSISDB].[catalog].[set_execution_parameter_value]
@execution_id,
@object_type = 30,
@parameter_name = N'FilePath',
@parameter_value = @var0;
DECLARE @var1 SMALLINT = 1;
EXEC [SSISDB].[catalog].[set_execution_parameter_value]
@execution_id,
@object_type = 50,
@parameter_name = N'LOGGING_LEVEL',
@parameter_value = @var1;
EXEC [SSISDB].[catalog].[start_execution]
@execution_id;
我还添加了System :: UserName来登录程序包的开始,我看到了正确的帐户。 我认为,该问题可能是@Piotr提到的双跳问题。 我正在挖掘文件服务器日志以查看。
EDIT2 2019-06-10
好的。经过大量的讨论,我可以将问题缩小到委派执行对CIFS的用户权限。
我做了什么
在启用匿名访问(using this article)之前,该程序包无法保存文件。
AFAIK我们仅启用了MSSQLSvc kerberos委派。
关闭:
问题是由从TSQL调用时获得用户安全上下文的SSIS目录的行为引起的,但是为了使其正常工作,在访问netwrok共享时,还需要为CIFS设置Kerberos委派。
在我们的环境中,我无法执行此操作,因此我恢复为xp_cmdshell。
感谢大家的支持。