2010-07-09 22 views
11

Tengo una Plantilla de Excel que ha codificado Ms Access MDB path en el código VBA utilizado para conectarse a las tablas de Access y guardar, recuperar datos.Cómo almacenar de forma segura los detalles de la Cadena de conexión en VBA

Migré la base de datos de MS Access a SQL Server con autenticación integrada para los usuarios de la plantilla de Excel.

Mi pregunta es, ¿cuál es la forma recomendada/mejor práctica para almacenar la cadena de conexión de base de datos de SQL Server y recuperarla en Excel 2007 VBA para guardar y recuperar datos?

En el pasado, he hecho lo siguiente.

  1. Utilice una configuración de clave de registro que tenga la cadena de conexión. Luego, en el VBA, escriba una función que lea la clave de registro y devuelva la cadena de conexión.

  2. Tenga una hoja oculta "Configuraciones" dentro de la Plantilla de Excel, con una celda con nombre para la cadena de conexión. Lea la cadena de conexión en VBA accediendo a ese rango con nombre.

  3. Utilice un archivo .txt txt que vaya con la plantilla de Excel. (Esto no es ideal y quiero evitar esto, ya que crea una dependencia de ese archivo externo)

no me gusta # 1 porque quiero evitar escribir a/lectura de registro si es posible. # 2 se siente bien, pensó que no estoy seguro de si hay una mejor manera de "limpieza" para hacer esto.

¿Alguna idea?

+0

Véase mi respuesta para enhebrar http://stackoverflow.com/questions/1987333/excel-vba-secure-way-to-get-users-database-login-password-for-connection-string/2018970 # 2018970 – MikeD

+0

@Remou. Gracias. @MikeD. Gracias, lo verifiqué. Está usando el registro, y estoy tratando de evitar eso. Debido a que la solución de problemas de un dispositivo se convertiría en una pesadilla al usar la configuración del registro (ya que será la configuración específica de la máquina del usuario) .... – Shiva

+0

He encontrado que el registro es un lugar excelente, pero eso requiere configuración adicional para cada usuario. Puedo entender por qué querrías evitar eso. – RubberDuck

Respuesta

21

Esto es lo que haría con seguridad almacenar las credenciales de cadena de conexión

Descargar e instalar Visual Studio Express 2012 for Windows (FREE)

abrirlo como administrador y crear un nuevo proyecto.Seleccionar Visual C# continuación Class Library y cambiarle el nombre a HiddenConnectionString

enter image description here

En el Explorador de soluciones , cambiar el nombre de Class1.cs a MyServer.cs

enter image description here

Haga clic derecho en su proyecto MyConnection en el Explorador de soluciones y seleccione Add Reference

Tipo activeX en el cuadro de búsqueda y marque la Microsoft ActiveX Data Objects 6.1 Library

enter image description here

copiar y pegar el siguiente código en el MyServer.cs reemplazando completamente lo que está en el archivo.

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(); 
     } 
    } 
} 

Localizar la variable cnStr en el código y actualización sus detalles de la conexión de cadena.

Haga clic con el botón secundario en la solución *HiddenConnectionString * en Solution Explorer y seleccione Propiedades.

Haga clic en la pestaña Application en el lado izquierdo, a continuación, Assembly Info y garrapatas Make Assembly COM-Visible

enter image description here

Haga clic en el *Build* en el menú de la izquierda y de la señal Register For COM Interop

enter image description here

Nota: Si está desarrollando Office de 64 bits, asegúrese de cambiar Platform Target en el menú Generar en x64. Esto es obligatorio para las bibliotecas COM de 64 bits para evitar cualquier error relacionado con ActiveX.


haga clic derecho en el HiddenConnectionString en el Explorador de soluciones y seleccione Build en el menú.

Si todo fue bien, entonces su HiddenConnectionString.dll y HiddenConnectionString.tlb deben generarse correctamente.Vaya a esta ruta ahora

C:\Users\administrator\Documents\Visual Studio 2012\Projects\HiddenConnectionString\HiddenConnectionString\bin\Debug 

y debería ver sus archivos.

enter image description here


Ahora abra Excel y vaya a VBE. Haga clic en Tools y seleccione References.

Haga clic en el botón Navegar y navegue hasta el HiddenConnectionString.tlb.

Además, agregue referencias a Microsoft ActiveX Object 6.1 Library - esto es para que pueda usar la biblioteca ADODB.

enter image description here

Ahora haga clic derecho en cualquier parte del ventana Explorador de proyectos y Insert un nuevo Module

copiar y pegar el siguiente código para que

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 

Vuelva a colocar la [TABLE_NAME] con un nombre de tabla real en y nuestra base de datos

Hit F5 o golpear el botón verde juego en la cinta.

enter image description here

Si todo ha ido bien, ahora debería ver la tabla devuelta a la hoja de cálculo.

mi muestra:

enter image description here


Como se puede ver. Agregar referencias a su propia biblioteca COM y almacenar las credenciales de inicio de sesión y otros datos confidenciales dentro del compilado .dll protege sus datos (cadena de conexión). Es muy difícil descompilar el archivo *.dll para obtener información sensible de él. Hay varias técnicas de codificación para proteger su *.dll aún más, pero no voy a entrar en detalles ahora. Esto mismo logra lo que pediste.

myCn.GetConnection devuelve el objeto ADODB.Connection que se inicializó dentro de la biblioteca COM a la que se hace referencia. A ningún usuario de Excel se le presentará la cadena de conexión o los datos confidenciales (en realidad nadie más).

Puede modificar el código C# para aceptar parámetros de VBA, es decir, inicio de sesión, contraseña, catálogo inicial, consulta para ejecutar etc. ... si tiene usuarios con diferentes privilegios en la instancia de su SQL Server, no sería un mala idea para permitir que las personas inicien sesión.


Nota: no se ha generado ningún error al agregar el código C# y VBA.Recomiendo encarecidamente trabajar en ello si planea usar la técnica que he descrito anteriormente.


+1

"También publiqué esta respuesta en mi blog" - ¡Marcado como favorito! Gracias por sus increíbles contribuciones en este tipo de subprocesos. – tbur

+1

@mehow Gracias por la respuesta detallada. Como puede ver, esto fue hace más de 3 años y ya no trabajo en ese proyecto o cliente, pero aún así acepté su respuesta. Parece que funcionará. – Shiva

+2

@Shiva gracias. Decidí dar esta respuesta de todos modos porque no pude encontrar una respuesta en algún momento. Esperemos que sirva a otros bien :) –

2

¿Qué le parece guardarlo en CustomDocumentProperties?

Nota: No estoy seguro, si el libro (basado en una plantilla dada) heredará la propiedad definida usando CustomDocumentProperties en la plantilla.

Cuestiones relacionadas