这是我安全存储连接字符串凭据的方法
下载并安装Visual Studio Express 2012 for Windows (免费)
以管理员身份打开并创建一个新项目。选择Visual C#
,然后选择类库
并将其重命名为HiddenConnectionString
![enter image description here](https://istack.dev59.com/8U2Tr.webp)
在“解决方案资源管理器”中,将
Class1.cs
重命名为
MyServer.cs
。
![enter image description here](https://istack.dev59.com/IFa68.webp)
在“解决方案资源管理器”中右键单击您的
MyConnection
项目,然后选择
添加引用
。
在搜索框中输入
activeX
,并选中
Microsoft ActiveX Data Objects 6.1 Library
。
![enter image description here](https://istack.dev59.com/W84TP.webp)
将以下代码复制并粘贴到MyServer.cs
文件中,完全替换文件中的任何内容。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.IO;
using ADODB;
namespace HiddenConnectionString
{
[InterfaceType(ComInterfaceType.InterfaceIsDual),
Guid("2FCEF713-CD2E-4ACB-A9CE-E57E7F51E72E")]
public interface IMyServer
{
Connection GetConnection();
void Shutdown();
}
[ClassInterface(ClassInterfaceType.None)]
[Guid("57BBEC44-C6E6-4E14-989A-B6DB7CF6FBEB")]
public class MyServer : IMyServer
{
private Connection cn;
private string cnStr = "Provider=SQLOLEDB; Data Source=SERVER\\INSTANCE; Initial Catalog=default_catalog; User ID=your_username; Password=your_password";
public MyServer()
{
}
public Connection GetConnection()
{
cn = new Connection();
cn.ConnectionString = cnStr;
cn.Open();
return cn;
}
public void Shutdown()
{
cn.Close();
}
}
}
在代码中找到cnStr
变量并更新连接字符串的详细信息。
在解决方案资源管理器中右键单击*HiddenConnectionString
*解决方案,然后选择属性。
单击左侧的应用程序
选项卡,然后单击程序集信息
并选中使程序集可由COM调用
。
![enter image description here](https://istack.dev59.com/556v6.webp)
点击左侧菜单中的*生成*
,并选中注册COM互操作性
![enter image description here](https://istack.dev59.com/e1jHb.webp)
注意:如果您正在为64位Office开发,则确保在“生成”菜单上更改
平台目标
为
x64
!这对于64位Office COM库是强制性的,以避免任何与ActiveX相关的错误。
在解决方案资源管理器中右键单击
HiddenConnectionString
,然后从菜单中选择
Build
。
如果一切顺利,那么你的
HiddenConnectionString.dll
和
HiddenConnectionString.tlb
应该已经成功生成。现在前往此路径。
C:\Users\administrator\Documents\Visual Studio 2012\Projects\HiddenConnectionString\HiddenConnectionString\bin\Debug
然后你应该能看到你的文件。
![enter image description here](https://istack.dev59.com/Oju4X.webp)
现在打开Excel并进入VBE。 点击工具
并选择引用
。
点击浏览按钮,然后导航到HiddenConnectionString.tlb
。
此外,还要添加对Microsoft ActiveX Object 6.1 Library
的引用-这样您就可以使用ADODB库。
![enter image description here](https://istack.dev59.com/5YbT9.webp)
现在在“项目资源管理器”窗口的任何位置右键单击,并插入一个新的“模块”。
将下面的代码复制并粘贴到其中。
Option Explicit
Sub Main()
Dim myCn As MyServer
Set myCn = New MyServer
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open "Select * from [TABLE_NAME]", myCn.GetConnection
Range("A1").CopyFromRecordset rs
rs.Close
myCn.Shutdown
Set rs = Nothing
Set myCn = Nothing
Columns.AutoFit
End Sub
在你的数据库中,用一个实际的表名替换[TABLE_NAME]
。
按下F5或点击功能区上的绿色播放按钮。
![enter image description here](https://istack.dev59.com/seuaV.webp)
如果一切顺利,您现在应该在电子表格上看到返回的表格。
我的示例:
![enter image description here](https://istack.dev59.com/eIv1V.webp)
正如您所看到的。将自己的COM库引用添加到编译的.dll
中并将登录凭据和其他敏感数据存储在其中可以保护您的数据(连接字符串)。从*.dll
文件反编译获取任何有意义的信息非常困难。有各种编码技术可以进一步保护您的*.dll
,但我现在不打算详细介绍。这本身就实现了您要求的内容。
myCn.GetConnection
返回初始化在引用的COM库内的ADODB.Connection
对象。没有Excel用户会看到连接字符串或敏感数据(实际上其他人也不会)。
如果您拥有对SQL Server实例具有不同特权的用户,允许人们登录可能不是一个坏主意,您可以修改C#代码以从VBA接受参数,即登录、密码、初始目录、要执行的查询等。
注意:C#代码和VBA中没有添加错误处理。如果您计划使用我上面描述的技术,我强烈建议您进行错误处理。