如何将敏感信息获取到数据流中的 SSIS 脚本组件

How to Get Sensitive Information Into SSIS Script Component in a Data Flow

我有一个 SSIS 数据流,其中包含一个脚本组件作为源。我想通过 运行 服务器数据库上的脚本生成源数据。用于连接数据库的连接字符串设置为敏感的。如何使用 C# 读取脚本组件中的敏感参数?

在脚本任务中,通常是这样读取的,例如:

string mySecretPassword = Dts.Variables["$Project::MySecretPassword"].GetSensitiveValue().ToString

未定义 GetSensitiveValue 方法的 Variable class in a Script Task has a GetSensitiveValue method. However, the Script Component Variable implements the interface Microsoft.SqlServer.Dts.Runtime.Wrapper.Variable

我们假设连接字符串现在是一个项目参数。

尽管脚本组件中缺少 GetSensitiveValue 方法,但我能够很好地访问该值。

我摸索的是我的包保护级别以及它如何与标记为敏感的项目参数交互。

我定义了一个名为 MySecretPassword 的项目参数并用 SO_71308161 填充它并将其标记为敏感。

脚本来源

我定义了单列输出,我的目的是将密码推送到数据流中以确认我能够访问它

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
    public string MySecret;
    public override void PreExecute()
    {
        base.PreExecute();
        MySecret = Variables.MySecretPassword;
    }

    public override void CreateNewOutputRows()
    {
        Output0Buffer.AddRow();
        Output0Buffer.Column = this.MySecret;
    }

}

然后我将数据路由到派生列,并在两者之间放置了一个数据查看器。我的代码没有抛出异常,但它确实显示了一个空字符串。

如果我尝试使用 myVariable.Value 在脚本任务中访问我的敏感参数值,它会按预期抛出错误,但我正在取回我的敏感值。

包保护级别

我喜欢 Whosebug 的问题,这些问题可以教会我一些东西。我的默认模式是定义使用 DontSaveSensitive 项目和包保护级别的项目。这与使用敏感项目参数不兼容。并非不兼容,因为它会抛出异常,但是当您 运行 包时,访问该值将被清除(至少对于字符串)。

一旦我将项目和包的保护级别更改为 EncryptSensitiveWithUserKey(或任何不是 DontSaveSensitive 的级别),脚本任务的 .GetSensitiveValue() 和脚本组件的 Variables.MySecretPassword 都起作用了。