关于SSIS中解密FTP字符串的方法

FTP(File Transfer Protocol),是文件传输协议的简称。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。用户可以通过它把自己的PC机与世界各地所有运行FTP协议的服务器相连,访问服务器上的大量程序和信息。

而在SSIS中,有一个FTP的组件,可以对它进行信息的配置,包括用户名、密码、端口号等等,如下图:

一般情况下,这些信息都是存在数据库中,然后通过SSIS菜单下的包配置来进行赋值,然而弊端就在于包配置信息无法直接读取加密信息,选择直接给FTP连接管理直接赋值的话,密码是无法保存的(PS:这是SSIS的一种自带保护机制),脚本是个好东西,在这里可以用来解决这个问题。

     在上一篇有写到DES加密解密的方法,这里就不做赘述了,其实最主要的是要获得FTP的这个对象,首先我想到的是用DTS对象的Connections["FTPName"]来获取整个连接信息,结果经过测试得到的只是:Server name 和 Server port 值,所以用Dts对象的Connections获取这条路走不通,只能想另外的办法。在 SQL Server 2012 Integration Services 高级教程(第二版) 中提到FtpClientConnected这个对象,测试可以通过

 ConnectionManager conn = default(ConnectionManager);
 FtpClientConnection ftp = default(FtpClientConnection);
//获取FTP连接,名字保持一致,中文会导致乱码                
conn = Dts.Connections["FTP Connection Manager"];
 ftp = new FtpClientConnection(conn.AcquireConnection(null));
//ZCC为数据库中FTP连接信息表中的主键,获取密文密码
string CryPwd = GetConDb("ZCC")[0];
//对密文密码就行解密,得到明文
string Oldpwd = DecryptDES(CryPwd, UUkey);
//将解密后的密码赋值给FTP对应的参数
 ftp.ServerName = GetConDb("ZCC")[1];
 ftp.ServerPort = int.Parse(GetConDb("ZCC")[2]);
 ftp.ServerUserName = GetConDb("ZCC")[3];
 ftp.ServerPassword = Oldpwd;

代码是其次,最主要的是思想,在这里我做得处理是,从数据库中取出来对应的 Server Name、Server Port、ServerUserName、ServerPassword,然后用拼接字符串的方式连一起,然后用Split分割成一个数组,当然也可以直接将这四个数据放到数组中,GetConDb就是一个返回类型为数组的方法,返回的数组就是这四个数值,所以当得到ftp这个对象的时候,就可以根据数组的索引来给ftp对象中对应的配置参数赋值了。

  public static string[] GetConDb(string MainConn)
        {
            string Username = "";
            string UserPassword = "";
            string Ip = "";
            string Port = "";
            string constr = "Data Source=.;Initial Catalog=ICBC;Integrated Security=SSPI;";
            string sqlstr = @"select * from ICBC.dbo.[FTPConfigurations] where FTPMainConn='" + MainConn+ "'";
            SqlConnection conn = new SqlConnection(constr);
            SqlCommand cmd = new SqlCommand(sqlstr, conn);
            conn.Open();
            try
            {
                DataTable dt = new DataTable();
                SqlDataAdapter sda = new SqlDataAdapter(cmd);
                sda.Fill(dt);
                string ccc = dt.Rows[1]["FTPConnPath"].ToString();
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    string Sername = dt.Rows[i]["FTPConnPath"].ToString();
                    if (Sername.Contains("ServerUserName"))
                    {
                        Username = dt.Rows[i]["ConfiguredValue"].ToString();
                    }
                    if (Sername.Contains("ServerPassword"))
                    {
                        UserPassword = dt.Rows[i]["FTPConnPwd"].ToString();
                    }
                    if (Sername.Contains("[FTPConnectionString]"))
                    {
                        string ServerPort = dt.Rows[i]["FTPConnValue"].ToString();
                        Ip = ServerPort.Substring(0, ServerPort.Length - 3);
                        Port = ServerPort.Substring(ServerPort.Length - 2, 2);
                    }

                }


                string all = Username + ";" + UserPassword + ";" + Ip + ";" + Port;
                string[] strDb = all.Split(';');
                return strDb;
            }

            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }

            finally
            {
                conn.Close();
            }

        }

 权当做学习笔记

-----市人皆大笑,举手揶揄之

原文地址:https://www.cnblogs.com/Sientuo/p/5969347.html