Tengo un flujo de datos SSIS que contiene un componente de secuencia de comandos como fuente. Me gustaría generar los datos de origen ejecutando un script en una base de datos de SQL Server. La cadena de conexión que se usará para conectarse a la base de datos está configurada para ser sensible. ¿Cómo puedo leer este parámetro sensible dentro del componente del script usando C#?
En una Tarea de Script, normalmente se lee por ejemplo como sigue:
string mySecretPassword = Dts.Variables["$Project::MySecretPassword"].GetSensitiveValue().ToStringLa clase Variable en una Tarea de secuencia de comandos tiene un método GetSensitiveValue . Sin embargo, Script Component Variable implementa la interfaz Microsoft.SqlServer.Dts.Runtime.Wrapper.Variable que no tiene definido el método GetSensitiveValue.
Supongamos que la cadena de conexión es un parámetro del proyecto por ahora.
A pesar de la falta de un método GetSensitiveValue existente en el Script Component, pude acceder al valor sin problemas.
Lo que me molestó fue mi nivel de protección de paquetes y cómo interactúa con los parámetros del proyecto que están marcados como confidenciales.
Definí un parámetro de proyecto llamado MySecretPassword y lo rellené con SO_71308161 y lo marqué como sensible.
Definí una salida de una sola columna y mi intención era simplemente insertar la contraseña en el flujo de datos para confirmar que podía acceder a ella.
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; } }Luego enruté los datos a una columna derivada y solté un visor de datos entre los dos. Mi código no lanzó una excepción, pero mostró una cadena vacía.
Si intentaba acceder a mi valor de parámetro confidencial en una tarea de secuencia de comandos usando myVariable.Value, arrojaría un error como se esperaba, pero estaba recuperando mi valor confidencial.
Me encantan las preguntas de StackOverflow que me enseñan cosas. Mi modo predeterminado es definir proyectos que usan un nivel de protección de Proyecto y paquete de DontSaveSensitive. Lo cual es incompatible con el uso de parámetros de proyecto sensibles. No es incompatible en el sentido de que arrojará una excepción, pero cuando ejecute el paquete, el acceso a ese valor se borrará (al menos para las cadenas).
Tan pronto como cambio el proyecto y luego el nivel de protección del paquete a EncryptSensitiveWithUserKey (o cualquier cosa que no sea DontSaveSensitive), tanto .GetSensitiveValue() de la tarea de secuencia de comandos como Variables.MySecretPassword del componente de secuencia de comandos funcionaron.