通过命令行

时间:2019-06-07 15:29:49

标签: sql-server ssis dtexec

由于扩展了旧系统,我需要从较旧的SSIS(另一台服务器)运行SSIS2016程序包。该软件包可以从SQL Agent正常运行,但是我无法使用tsql或DTEXEC运行它。问题是,即使在提升的cmd(在sysadmin下)运行,程序包也无法访问网络

  1. 我可以从运行程序包(admin)的帐户访问网络驱动器
  2. 我知道从同一个帐户的Sql代理运行程序包时,程序运行良好。
  3. 将文件保存到本地临时文件夹(DTEXEC和TSQL)时,程序包运行良好
  4. 当使用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并重新启动了服务器。 之后,

  • 我能够使用DTEXEC命令将文件保存到网络,并且在本地服务器上运行(记录为sysadmin)
  • 我能够使用本地服务器上的sp(以sysadmin身份登录)将文件保存到网络中
  • 以sysadmin身份登录到另一台计算机时,我无法将文件保存到网络驱动器。错误是
  

平面文件目标未通过预执行阶段并返回错误   代码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的用户权限。

我做了什么

  • 在开发人员计算机上设置共享
  • 使用scriptask创建软件包,该脚本试图创建测试文件并获取调用用户WindowsIdentity.GetCurrent()。Name的安全上下文
  • 然后,在总是被拒绝访问结束的情况下,我使用上面的代码运行了存储过程。

在启用匿名访问(using this article)之前,该程序包无法保存文件。

AFAIK我们仅启用了MSSQLSvc kerberos委派。

关闭:

问题是由从TSQL调用时获得用户安全上下文的SSIS目录的行为引起的,但是为了使其正常工作,在访问netwrok共享时,还需要为CIFS设置Kerberos委派。

在我们的环境中,我无法执行此操作,因此我恢复为xp_cmdshell。

感谢大家的支持。

0 个答案:

没有答案