关于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(); } }
权当做学习笔记
-----市人皆大笑,举手揶揄之
大家好,我是新来的小白,文未佳,却已创。转载请声明(博客园-郎中令)出处,谢谢
---市人皆大笑,举手揶揄之(手动链接博客园)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构