Как безопасно хранить данные строки подключения в VBA - PullRequest
13 голосов
/ 10 июля 2010

У меня есть шаблон Excel с жестко запрограммированным путем Ms Access MDB в коде VBA, который используется для подключения к таблицам Access и сохранения, извлечения данных.

Я перенес базу данных MS Access на SQL Server со встроеннымАутентификация для пользователей шаблона Excel.

У меня такой вопрос: каков рекомендуемый способ / рекомендации для хранения строки подключения к базе данных SQL Server и ее извлечения в Excel 2007 VBA для сохранения и извлечения данных?

В прошлом я делал следующее.

  1. Используйте параметр ключа реестра, в котором есть строка подключения.Затем в VBA напишите функцию, которая считывает раздел реестра и возвращает строку подключения.

  2. Наличие скрытого листа «Настройки» в шаблоне Excel с именованной ячейкой для строки подключения,Прочитайте строку подключения в VBA, обратившись к указанному диапазону.

  3. Используйте текстовый файл .INI, который идет с шаблоном Excel.(Это не идеально, и я хочу избежать этого, поскольку это создает зависимость от этого внешнего файла)

Мне не нравится # 1, потому что я хочу избежать записи в / чтения изРеестр, если это возможно.# 2 чувствует себя хорошо, подумал, что я не уверен, есть ли лучший «чище» способ сделать это.

Ответы [ 2 ]

29 голосов
/ 03 октября 2013

Это то, что я бы сделал, чтобы безопасно хранить учетные данные строки подключения

Скачать и установить Visual Studio Express 2012 для Windows ( БЕСПЛАТНО )

Откройте его как администратор и создайте новый проект. Выберите Visual C#, затем Class Library и переименуйте его в HiddenConnectionString

enter image description here

В Solution Explorer переименуйте Class1.cs в MyServer.cs

enter image description here

Щелкните правой кнопкой мыши проект MyConnection в Solution Explorer и выберите Add Reference

Введите activeX в поле поиска и отметьте Microsoft ActiveX Data Objects 6.1 Library

enter image description here

Скопируйте и вставьте приведенный ниже код в 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

Нажмите *Build* в меню слева и отметьте Register For COM Interop

enter image description here

Примечание. Если вы разрабатываете для 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


Теперь откройте Excel и перейдите к VBE. Нажмите Tools и выберите References.

Нажмите кнопку Обзор и перейдите к HiddenConnectionString.tlb.

Также добавьте ссылки на Microsoft ActiveX Object 6.1 Library - так вы можете использовать библиотеку ADODB.

enter image description here

Теперь щелкните правой кнопкой мыши в любом месте окна 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

Если все прошло хорошо, вы должны увидеть возвращенную таблицу в своей таблице.

мой образец:

enter image description here


Как видите. Добавление ссылок в вашу собственную COM-библиотеку и хранение учетных данных для входа и других конфиденциальных данных в скомпилированном .dll защищает ваши данные (строка подключения). Очень сложно декомпилировать файл *.dll, чтобы получить из него какую-либо разумную информацию. Существуют различные методы кодирования , чтобы защитить ваш *.dll еще больше, но я не буду сейчас вдаваться в подробности. Это само по себе достигает того, о чем вы просили.

myCn.GetConnection возвращает объект ADODB.Connection, который был инициализирован в указанной COM-библиотеке. Ни одному пользователю Excel не будет предоставлена ​​строка подключения или конфиденциальные данные (на самом деле никто другой).

Вы можете изменить код C # так, чтобы он принимал параметры из VBA, такие как логин, пароль, исходный каталог, запрос на выполнение и т. Д. ... если у вас есть пользователи с разными привилегиями на экземпляре вашего SQL Server, это не будет плохо идея разрешить людям войти в систему.


Примечание: обработка ошибок не добавлена ​​в код C # и VBA. Я настоятельно рекомендую поработать над этим, если вы планируете использовать технику, которую я описал выше.


2 голосов
/ 11 июля 2010

Как насчет хранения его в CustomDocumentProperties?

Примечание: я не уверен, что книга (на основе заданного шаблона) унаследует свойство, определенное с помощью CustomDocumentPropertiesв шаблоне.

...