Это то, что я бы сделал, чтобы безопасно хранить учетные данные строки подключения
Скачать и установить Visual Studio Express 2012 для Windows ( БЕСПЛАТНО )
Откройте его как администратор и создайте новый проект. Выберите Visual C#
, затем Class Library
и переименуйте его в HiddenConnectionString
![enter image description here](https://i.stack.imgur.com/8U2Tr.png)
В Solution Explorer переименуйте Class1.cs
в MyServer.cs
![enter image description here](https://i.stack.imgur.com/IFa68.png)
Щелкните правой кнопкой мыши проект MyConnection
в Solution Explorer и выберите Add Reference
Введите activeX
в поле поиска и отметьте Microsoft ActiveX Data Objects 6.1 Library
![enter image description here](https://i.stack.imgur.com/W84TP.png)
Скопируйте и вставьте приведенный ниже код в 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
* в Solution Explorer и выберите Свойства.
Нажмите вкладку Application
с левой стороны, затем Assembly Info
и отметьте Make Assembly COM-Visible
![enter image description here](https://i.stack.imgur.com/556v6.png)
Нажмите *Build*
в меню слева и отметьте Register For COM Interop
![enter image description here](https://i.stack.imgur.com/e1jHb.png)
Примечание. Если вы разрабатываете для 64-битной версии Office, убедитесь, что вы изменили Platform Target
в меню Build на 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://i.stack.imgur.com/Oju4X.png)
Теперь откройте Excel и перейдите к VBE. Нажмите Tools
и выберите References
.
Нажмите кнопку Обзор и перейдите к HiddenConnectionString.tlb
.
Также добавьте ссылки на Microsoft ActiveX Object 6.1 Library
- так вы можете использовать библиотеку ADODB.
![enter image description here](https://i.stack.imgur.com/5YbT9.png)
Теперь щелкните правой кнопкой мыши в любом месте окна Project Explorer и Вставьте новый Module
скопируйте и вставьте в него приведенный ниже код
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 или нажмите зеленую кнопку play на ленте.
![enter image description here](https://i.stack.imgur.com/seuaV.png)
Если все прошло хорошо, вы должны увидеть возвращенную таблицу в своей таблице.
мой образец:
![enter image description here](https://i.stack.imgur.com/eIv1V.png)
Как видите. Добавление ссылок в вашу собственную COM-библиотеку и хранение учетных данных для входа и других конфиденциальных данных в скомпилированном .dll
защищает ваши данные (строка подключения). Очень сложно декомпилировать файл *.dll
, чтобы получить из него какую-либо разумную информацию. Существуют различные методы кодирования , чтобы защитить ваш *.dll
еще больше, но я не буду сейчас вдаваться в подробности. Это само по себе достигает того, о чем вы просили.
myCn.GetConnection
возвращает объект ADODB.Connection
, который был инициализирован в указанной COM-библиотеке. Ни одному пользователю Excel не будет предоставлена строка подключения или конфиденциальные данные (на самом деле никто другой).
Вы можете изменить код C # так, чтобы он принимал параметры из VBA, такие как логин, пароль, исходный каталог, запрос на выполнение и т. Д. ... если у вас есть пользователи с разными привилегиями на экземпляре вашего SQL Server, это не будет плохо идея разрешить людям войти в систему.
Примечание: обработка ошибок не добавлена в код C # и VBA. Я настоятельно рекомендую поработать над этим, если вы планируете использовать технику, которую я описал выше.