允许用户远程执行SSIS包的安全方法

时间:2017-11-16 15:24:41

标签: c# sql-server reporting-services ssis

我的任务是创建一个有点自动化的过程,允许非SQL用户将数据从Excel电子表格导入SQL Server中的表。我们目前使用SQL Server 2012.用户需要能够在Excel电子表格中将数据整合到一起时上传数据。我创建了一个SSIS包,用于检查共享驱动器上该文件的特定文件夹。如果文件存在,则进行一些转换,然后插入到数据库的最终表中。用户实际上每年只需要做几次这样的事情,但我们永远都不知道他们什么时候想让用户能够在需要时做到这一点。我正处于需要找到一种方法来允许用户执行包或启动远程执行包的计算机的方法。我不想使用任何使用xp_cmdshell的东西,因为我听说这会造成不必要的漏洞。我已经读过,我可以使用Reporting Services来执行该程序包,但我不确定这是安全还是最佳方法。微软表示可以,但目前不支持或推荐https://msdn.microsoft.com/en-us/library/ms345250.aspx。我想知道我是否可以在C#中执行此操作而无需以纯文本格式存储凭据,因为用户没有数据库访问权限。 Microsoft有一篇文章(https://docs.microsoft.com/en-us/sql/integration-services/run-manage-packages-programmatically/loading-and-running-a-remote-package-programmatically)使用集成安全性远程运行SSIS包,但用户无法访问。如果有人有这样做的经验,我也不会完全反对使用Reporting Services,并且可以谈论这是否是最佳方式。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

我将直接询问此问题的SSRS特定部分,因为您已直接询问此选项。

如果使用以下代码连接到SSISDB数据库,则可以execute an SSIS package via T-SQL

Declare @execution_id bigint
EXEC [SSISDB].[catalog].[create_execution] @package_name=N'Package.dtsx',
    @execution_id=@execution_id OUTPUT,
    @folder_name=N'Deployed Projects',
      @project_name=N'Integration Services Project1',
    @use32bitruntime=False,
      @reference_id=Null
Select @execution_id
DECLARE @var0 smallint = 1
EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,
    @object_type=50,
      @parameter_name=N'LOGGING_LEVEL',
      @parameter_value=@var0
EXEC [SSISDB].[catalog].[start_execution] @execution_id
GO

因为SSRS允许您从数据集执行存储过程,所以您可以将任何类型的SQL逻辑放入该数据集并使其执行,包括类似的内容。您希望获得报告的程度取决于您,因为您可以在报告上有一个实际执行包的按钮,而不是仅在第一次运行报告时运行包。您需要在报告加载时使用一个参数,该参数具有您在T-SQL中检查的默认值,并绕过包执行,具体取决于值。由于您的凭据存储在常规SSRS数据源中,因此应将其视为与其他报告数据库一样安全

请注意,更好,更简洁的方法是让Web应用程序开发人员创建一个非常简单的应用程序,允许授权用户执行T-SQL命令。 SSRS选项可能被认为有点hacky,因为报告不是用于运行命令和修改数据,更多是作为数据的显示方法。但是,我一直在大型组织中,你的任务是这样的问题而不是自由使用任何"更好的"工具,所以这至少是一个选项。