Jueves, 28-Mar-24, 2:25 AM
Le saludo Visitante | RSS
Menú del sitio
Búsqueda

byronlcl, Access y algunas cosillas...

Seguridad en Access 1

Páginas de este artículo: 1  2  3

Seguridad En Microsoft Access 2,003
 
Introducción
A menudo las personas se preguntan acerca de la implementación de técnicas para asegurar sus bases de datos, de cómo impedir el ingreso de usuarios a sus códigos, objetos y datos, en este artículo intentaré aclarar algunas de esas dudas.
Hay que tomar nota que las técnicas que aquí veremos son las que nos ofrece Access.
Existen muchas otras técnicas de seguridad que se han inventado usuarios creativos, si tu conoces de programación VBA seguramente te puedes inventar algunas, pero estas no las tocaremos, nos enfocaremos en las técnicas dadas por Access.
Lo interesante de este artículo es que veremos los temas desde estos puntos:
 
- Explicación resumida del tema
- Aplicación del tema de forma manual, tipo usuario
- Aplicación del tema con código, tipo programador
- Aplicación y reversión
 
Abordaremos las diferentes técnicas desde las más sencillas hasta las más seguras, solo hay que tener claro que ninguna técnica es 100% segura. Entre las técnicas de seguridad que abarcaremos están:
 
 
Índice
1. Ocultar objetos
1.1. Atributo oculto de los objetos
1.2. Activar el atributo de oculto en un objeto
1.3. Mostrar Objetos con el atributo de oculto activado
2. Propiedades de inicio de la base de datos
2.1. Una Propiedad especial, AllowByPassKey
3. Macro AutoExec
4. Codificar û Descodificar las bases de datos
5. Automatización de bases de datos
5.1. ¿Qué es automatización?
5.2. Automatizando una base de datos
6. Poner contraseña al código VBA
7. Convertir las bases de datos a formato MDE
8. Poner una contraseña general de apertura
8.1. Abrir una base de datos con contraseña
8.2. Automatizar una base de datos con contraseña
9. Seguridad por usuarios
9.1. ¿Que es?
9.2. ¿Cómo funciona?
9.3. ¿Qué son los Usuarios y los Grupos de Usuarios?
9.4. Algo Más...
9.5. Activar La Seguridad Por Usuarios A Una Base De Datos
9.6. Programando
9.7. Grupos de trabajo, Grupos, Usuarios y Contraseñas
9.8. Objetos De La Base De Datos Y Permisos
9.9. Permisos Específicos
9.10. Casos Especiales De Permisos
9.11. Verificar Si Un Usuario Tiene Un Permiso
9.12. Propietario De Los Objetos (Owner)
9.13. Funciones útiles
9.14. ¿Cómo puedo Abrir Una Base De Datos Definida Con Seguridad Por Usuarios?
9.15. ¿Cómo valida Access los permisos?
9.16. ¿Cómo Puedo Quitarle La Seguridad Por Usuarios A Una Base de Datos?
9.18 Consultas Con Acceso De Propietario (With OwnerAccess Option)
9.17. Para Finalizar
 
 
1. Ocultar Objetos
1.1. Atributo Oculto de los Objetos
Todos los objetos cuentan con el atributo de oculto, el cual se encuentra desactivado predeterminadamente, al activarlo el objeto se hace invisible en la ventana de base de datos, que es la ventana que siempre vemos de fondo.
Este atributo funciona de la mano de una de las opciones de la base de datos "Mostrar objetos ocultos", cuando esta opción está en Falso todos los objetos con el atributo activado se hacen invisibles, por el contrario, con la opción de "Mostrar objetos ocultos" en Verdadero se pueden observar todos los objetos, los cuales pueden verse de un color tenue
 
 
1.2. Activar el Atributo de Oculto En Un Objeto
Para aplicar este atributo manualmente le damos un clic secundario sobre el objeto que nos interesa (tabla, consulta, reporte, formulario, macro ó módulo), se nos desplegará el menú contextual, allí hacemos clic en "Propiedades", donde se nos abrirá un formulario, en el podemos ver un Check para activar el atributo de "Oculto". De la misma manera podemos revertir el proceso, solo desactivando el Check mencionado
 
¿Cómo lo realizamos por código?
Imaginemos que tenemos una tabla llamada "Clientes", para aplicarlo:
 
Application.SetHiddenAttribute acTable,"Clientes", True
 
Para quitarlo:
 
Application.SetHiddenAttribute acTable,"Clientes", False
 
 
-Byron, ¿Como podría hacer si quisiera aplicarle el atributo a todas las tablas ó a todos los formularios?
 
Ok, usa este procedimiento con el que puedes aplicar el atributo a los objetos por colecciones completas:
 
Sub AplicarAtributoOculto(intTipoObjeto As AcObjectType, _
                          ByVal Ocultar As Boolean, _
                          Optional ByVal strFormularioEjecucion As String = "")
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
'Objetivo: Aplicar/Quitar el atributo Oculto de TODOS los objetos de un tipo de objeto específico
'
'Parámetros
'intTipoObjeto: Tipo de objeto que deseamos modificar (se modifica toda la colección de ese tipo)
'Ocultar: True para aplicar el atributo Oculto, False para quitarlo
'strFormularioEjecucion: Si corremos este procedimiento para modificar formularios, seguramente _
estaremos operando desde un formulario, este formulario no _
puede ser modificado porque se encuentra abierto y nos genera error, _
entonces, en este parámetro le pasamos el nombre de este formulario _
para pasarlo por alto
Dim strFiltroName As String
Dim strFiltroType As String
Dim strSQL As String
Dim rst As DAO.Recordset
 
   'Definir filtros...
   'para el nombre, pasar por alto objetos de sistema, temporales y el formulario de ejecución
   If strFormularioEjecucion < > "" And intTipoObjeto = acForm Then
      strFiltroName = "(Name Not Like '~TMP*' And Name Not Like '" & strFormularioEjecucion & "')"
   Else
      strFiltroName = "(Name Not Like 'Msys*' And Name Not Like '~sq_*' And Name Not Like '~TMP*')"
   End If
   'para el tipo de objeto
   Select Case intTipoObjeto
   Case acTable: strFiltroType = "(Type=1 Or Type=4)"
   Case acQuery: strFiltroType = "Type=5"
   Case acForm: strFiltroType = "Type=-32768"
   Case acReport: strFiltroType = "Type=-32764"
   Case acMacro: strFiltroType = "Type=-32766"
   Case acModule: strFiltroType = "Type=-32761"
   Case Else: Exit Sub
   End Select
   strSQL = "Select Name From MsysObjects Where " & strFiltroName & " And " & strFiltroType & ";"
   Set rst = CurrentDb.OpenRecordset(strSQL)
   If Not (rst.BOF And rst.EOF) Then
      rst.MoveLast
      rst.MoveFirst
      While Not rst.EOF
         Application.SetHiddenAttribute intTipoObjeto, rst!Name, Ocultar
      rst.MoveNext
      Wend
   End If
   rst.Close
   Set rst = Nothing
End Sub
 
 
1.3. Mostrar Objetos con el atributo de Oculto Activado
Para ver ó no ver los objetos ocultos vamos al menú:
 
Herramientas/Opciones/Pestaña Ver/Activar-Desactivar la casilla "Objetos ocultos"
 
Por código, para mostrar los objetos ocultos:
 
Application.SetOption "Show Hidden Objects", True
 
Para no mostrarlos:
 
Application.SetOption "Show Hidden Objects", False
 
Como se puede observar, cualquier usuario con acceso a la barra de menú puede mostrar los objetos con atributo de oculto activado
 
 
2. Propiedades de inicio de la base de datos
Las propiedades de inicio nos dan una serie de opciones, las cuales se ejecutan en el momento de la apertura de la aplicación. Para verlas/modificarlas vamos al menú:
 
Herramientas/Inicio...
Realmente aquí no hay mucho que decir sobre su funcionamiento porque el nombre ó título que tienen nos deja saber de que se trata cada una (Favor de ir al cuadro de diálogo de las propiedades de inicio y ver cuales existen).
Lo útil aquí es que se puede jugar con las opciones para limitar al usuario a realizar ciertas cosas, como usar solo las barras de menús ó de herramientas que nosotros hemos creado, podemos poner un formulario que se abra al inicio, en el cual podemos agregar un evento "Al abrir" ó "Al Cargar" donde hagamos todas las validaciones que creamos convenientes, como la existencia de archivos necesarios, verificar fechas, usuarios, versiones, etc. Si creemos conveniente, en este formulario podemos salir de la aplicación si no se cumple alguna validación, como algún archivo que sea necesario para el buen funcionamiento.
Otro ejemplo, si pulsas las teclas Ctrl+Q se abre la ventana del código VBA, con lo que cualquier usuario puede ver el código, pero desactivando las teclas especiales ya no se puede usar combinaciones de teclas como esta.
Las limitaciones que se pongan a los usuarios dependen de cómo hemos planteado nuestra aplicación.
-¿Byron, y por código como se hacen las modificaciones?
Antes de ver el código debemos aclarar unos puntos:
Si abrimos el cuadro de diálogo de propiedades de inicio podemos ver todas las propiedades, pero no significa que existan. En una base de datos nueva estas propiedades no existen, cada propiedad es creada la primera vez que le realizamos una modificación.
Las propiedades de tipo Boolean al ser creadas se quedan allí y podemos consultar ó cambiar su valor en cualquier momento
Las propiedades de tipo String, son creadas ó eliminadas, no se mantienen grabadas en la base de datos
Tomemos por ejemplo la opción "Mostrar formulario/página" (que como mencionamos antes se trata del formulario que se abrirá al iniciar la aplicación), inicialmente en el cuadro de diálogo de Inicio aparece "(Ninguno)", pero esto no quiere decir que este nombre esté guardado en esta propiedad, aquí realmente lo que pasa es que esta propiedad NO existe en la base de datos. Si cambiamos este nombre por el de algún formulario existente, lo que hace Access es que crea dicha propiedad y le agrega el nombre del formulario. Si después volvemos a escoger la opción "(Ninguno)", lo que hace Access es que elimina la propiedad, ojo aquí, Access no le cambia el nombre, elimina la propiedad.
Entonces, para cambiar una propiedad por código primero debemos revisar por su existencia; Si encontramos que Sí existe, solo le cambiamos el valor, si encontramos que No existe debemos crearla
Con el siguiente procedimiento podemos cambiar el valor de cualquier propiedad, si la propiedad no existe se creará:
 
Sub CambiarPropiedadInicio(ByVal NombrePropiedad As String, _
                           ByVal TipoValor As Variant, _
                           ByVal NuevoValor As Variant)
'TipoValor: Boolean = DB_BOOLEAN, String = DB_TEXT
On Error GoTo Error_Procedimiento
 
Dim db As DAO.Database
Dim prp As DAO.Property
 
   Set db = CurrentDb
   db.Properties(NombrePropiedad) = NuevoValor
 
Salir:
   Set prp = Nothing
   Set db = Nothing
   Exit Sub
 
Error_Procedimiento:
   If Err.Number = 3270 Then
      'Propiedad no encontrada, creamos la propiedad
      Set prp = db.CreateProperty(NombrePropiedad, TipoValor, NuevoValor)
      db.Properties.Append prp
      Resume Next
   Else
      'Error desconocido
      MsgBox Err.Description, vbCritical, "Error número: " & Err.Number
      Resume Salir
   End If
End Sub
 
Ejemplo de uso:
Para cambiar la propiedad "Mostrar ventana Base de datos" que es tipo Boolean:
 
CambiarPropiedadInicio "StartupShowDBWindow", DB_Boolean, False
 
Ahora cambiemos la propiedad "Mostrar formulario o página", que es tipo String:
 
CambiarPropiedadInicio "StartupForm", DB_Text, "Nombre del formulario"
 
Como se puede observar, los nombres de las propiedades están en ingles. A continuación te pongo la lista de propiedades y el tipo de dato que tienen:
Título aplicación: AppTitle (String)
Icono aplicación: AppIcon (String)
Mostrar formulario o página: StartupForm (String)
Mostrar ventana Base de datos: StartupShowDBWindow (Boolean)
Mostrar barra de estado: StartupShowStatusBar (Boolean)
Barra de menús: StartupMenuBar (String)
Barra de menús contextuales: StartupShortcutMenuBar (String)
Permitir menús completos. AllowFullMenus (Boolean)
Permitir menús contextuales predeterminados: AllowShortcutMenus (Boolean)
Permitir barras de herramientas incorporadas: AllowBuiltInToolbars (Boolean)
Permitir cambios de barras de herramientas/menús: AllowToolbarChanges
Permitir examinar código después de un error: AllowBreakIntoCode (Boolean)
Usar teclas especiales de Access: AllowSpecialKeys (Boolean)
Como mencionamos anteriormente, las propiedades de tipo String existen ó no Existen. Si tenemos definido un formulario de inicio, pero ya no queremos ninguno, lo que tenemos que hacer es eliminar la propiedad:
 
Dim db As DAO.Database
   Set db = CurrentDb
   db.Properties.Delete "StartupForm"
   Set db = Nothing
 
Pero claro, antes de eliminar una propiedad sería bueno revisar si existe. Aquí te pongo una función para averiguarlo:
 
Function ExistePropiedadInicio(ByVal NombrePropiedad As String) As Boolean
'Byron Contreras - byronlcl@gmail.com - 2009
'.............................................
Dim db As DAO.Database
Dim prp As Property
 
On Error Resume Next
 
   Set db = CurrentDb
   Set prp = db.Properties(NombrePropiedad)
 
   If Err.Number = 0 Then
      ExistePropiedadInicio = True
   Else
      Err.Clear
   End If
   Set db = Nothing
End Function
 
Entonces tendríamos:
 
Dim db As DAO.Database
Dim strPropiedad as String
 
   Set db = CurrentDb
   strPropiedad = "StartupForm"
   If ExistePropiedadInicio(strPropiedad) Then db.Properties.Delete "StartupForm"
   Set db = Nothing
 
 
2.1 Una Propiedad Especial, AllowByPassKey
¿Por qué es especial?, porque si abres el cuadro de diálogo de propiedades de inicio puedes ver que no se encuentra incluida. ¿Por qué no está incluida? Pregúntale a Microsoft... puede ser que se les haya olvidado.
Pero veamos que hace:
Como recordarás, en la propiedad "Mostrar formulario o página" (StarUpForm) podemos definir un formulario que se abra al inicio, este formulario puedes utilizarlo para realizar validaciones y si no te convence lo que encuentras puedes salir de la aplicación.
Existe una forma de saltarse este formulario, es decir, que la aplicación se abra y el formulario de inicio no se abra. Para hacer esto, solo debes mantener presionada la tecla Shift y abrir el archivo, esto funciona así predeterminadamente.
Para cambiar este comportamiento tenemos la propiedad "Permitir tecla Shift de inicio" / "AllowByPassKey", de tipo Boolean. Si la propiedad se encuentra en True, se puede abrir la aplicación con la tecla Shift y saltarse el formulario de inicio, si la propiedad está en False, el formulario de inicio siempre se abrirá.
 
Para cambiar el valor por código podemos usar la misma función de arriba:
 
CambiarPropiedadInicio "AllowByPassKey", DB_Boolean, False
CambiarPropiedadInicio "AllowByPassKey", DB_Boolean, True
 
Un Tip Adicional:
Si has desactivado la propiedad "Mostrar ventana Base de datos" (StartupShowDBWindow), y ya estas dentro de la aplicación y deseas ver la ventana de base de datos, solo pulsa la tecla F11 para que aparezca. Si sales de la aplicación y vuelves a entrar, estará oculta de nuevo.
 
 
3. Macro AutoExec
Si creas una macro y le pones como nombre "AutoExec", esta se ejecutará al inicio, cuando tu aplicación se abre. Esta macro también puedes utilizarla para realizar configuraciones ó validaciones iniciales, similar al formulario de inicio.
Esta macro también puede ser saltada si se tiene presionada la tecla Shift al abrir tu aplicación, pero también puedes cambiar este comportamiento cambiando la propiedad de inicio "Permitir tecla Shift de inicio" ("AllowByPassKey"), como se explica en el capítulo anterior.
 
 
4. Codificar û Descodificar Las Bases De Datos
Una base de datos puede ser abierta por un Procesador de palabras, como el Block de Notas ó Word, al hacerlo se puede observar todo el código insertado.
Para evitar esto debes codificar tu base de datos, el procesador de palabras aún puede abrir el archivo pero ya no se podrá entender nada.
Hay que tomar nota que aunque una base de datos esté codificada, cualquier usuario puede abrir el archivo normalmente con Access. Este método debe ser usado conjuntamente con otras técnicas de seguridad.
Para codificar ó descodificar debes ir al menú:
 
Herramientas/Seguridad/Codificar ó descodificar la base de datos...
 
Por código tienes:
 
DoCmd.RunCommand acCmdEncryptDecryptDatabase
 
Pero por código da error y no deja realizar el proceso, así que no lo uses.
 
 
5. Automatización De Bases De Datos
5.1 ¿Que es automatización?
Es el proceso con el cual podemos abrir un archivo de base de datos por código, y de esta manera podemos tener acceso a todos sus objetos, propiedades, métodos, etc.
Con la automatización podemos realizar operaciones que nos facilitan el trabajo al usar bases de datos externas, pero a la vez, como se tiene acceso a todo, se pueden crear ó anular algunas de las técnicas de seguridad.
 
 
5.2 Automatizando Una Base De Datos
Veamos como podemos abrir las bases de datos para automatizarlas:
 
Creando el objeto de aplicación (Access):
 
Sub ObjApl_AbrirBD()
'Byron Contreras - byronlcl@gmail.com - 2009
'.............................................
On Error GoTo Err_Procedimiento
Dim strArchivoMDB As String
Dim aplAccess As Access.Application
 
   strArchivoMDB = "Ruta completa del archivo .mdb"
 
   Set aplAccess = New Access.Application
   aplAccess.OpenCurrentDatabase strArchivoMDB, False
 
   MsgBox aplAccess.CurrentDb.Name
 
   aplAccess.CloseCurrentDatabase
   aplAccess.Quit
 
Salir_Procedimiento:
   Set aplAccess = Nothing
   Exit Sub
 
Err_Procedimiento:
   MsgBox Err.Description, vbCritical, "Error número " & Err.Number
   Resume Salir_Procedimiento
End Sub
 
Por el método CreateObject:
 
Sub CreObj_AbrirBD()
'Byron Contreras - byronlcl@gmail.com - 2009
'.............................................
On Error GoTo Err_Procedimiento
Dim strArchivoMDB As String
Dim aplAccess As Access.Application
 
   strArchivoMDB = "Ruta completa del archivo .mdb"
 
   Set aplAccess = CreateObject("Access.Application")
   aplAccess.OpenCurrentDatabase strArchivoMDB, False
 
   aplAccess.CloseCurrentDatabase
   aplAccess.Quit
 
Salir_Procedimiento:
   Set aplAccess = Nothing
   Exit Sub
 
Err_Procedimiento:
   MsgBox Err.Description, vbCritical, "Error número " & Err.Number
   Resume Salir_Procedimiento
End Sub
 
Por el método GetObject:
 
Sub GetObj_AbrirBD()
'Byron Contreras - byronlcl@gmail.com - 2009
'.............................................
On Error GoTo Err_Procedimiento
Dim strArchivoMDB As String
Dim aplAccess As Access.Application
 
   strArchivoMDB = ""Ruta completa del archivo .mdb"
 
   Set aplAccess = GetObject(strArchivoMDB)
 
   MsgBox aplAccess.CurrentDb.Name
 
   aplAccess.CloseCurrentDatabase
   aplAccess.Quit
 
Salir_Procedimiento:
   Set aplAccess = Nothing
   Exit Sub
 
Err_Procedimiento:
   MsgBox Err.Description, vbCritical, "Error número " & Err.Number
   Resume Salir_Procedimiento
End Sub
Por Shell:
 
Sub Shell_AbrirBD()
'Byron Contreras - byronlcl@gmail.com - 2009
'.............................................
On Error GoTo Err_Procedimiento
Dim strArchivoEXE As String
Dim strArchivoMDB As String
Dim aplAccess As Access.Application
Dim strShell As String
 
   'Definir datos de apertura...
   'Archivo ejecutable de Microsoft Access
   strArchivoEXE = SysCmd(acSysCmdAccessDir) & "MSACCESS.exe"
   strArchivoMDB = "Ruta completa del archivo .mdb"
 
   'Construir la cadena para la función Shell
   strShell = """" & strArchivoEXE & """" & " " & _
              """" & strArchivoMDB & """"
 
   'Si la función Shell tiene éxito tomamos el archivo/objeto(aplicación Access)
   If Shell(strShell, vbHide) Then
      'A veces el archivo tarda en abrir. Si GetObjet no lo encuentra
      'nos dará error, entonces lo metemos a un bucle hasta que lo encuentre
      Do
         On Error Resume Next
         Set aplAccess = GetObject(strArchivoMDB)
         DoEvents
      Loop Until Err.Number = 0
   End If
   MsgBox aplAccess.CurrentDb.Name
 
   aplAccess.CloseCurrentDatabase
   aplAccess.Quit
 
Salir_Procedimiento:
   Set aplAccess = Nothing
   Exit Sub
 
Err_Procedimiento:
   MsgBox Err.Description, vbCritical, "Error número " & Err.Number
   Resume Salir_Procedimiento
End Sub
 
 
6. Poner Contraseña Al Código VBA
Esta es una forma de proteger tu código para que no pueda ser leído, solo se podrá acceder a él introduciendo la contraseña correcta
 
Para poner la contraseña ve a la ventana VBA, luego vas al menú:
Herramientas/Propiedades de "Nombre de la aplicación"...
En el formulario que se abre, ve a la página "Protección", allí podrás observar un check "Bloquear proyecto para visualización", actívalo. Justo abajo aparece los cuadros de texto de "Contraseña" y "Confirmar contraseña", llénalos y listo, tu código esta protegido contra lectura.
 
 
7. Convertir Las Bases De Datos A Formato MDE
Con este método puedes proteger todo tu código VBA, al aplicarlo, Access crea una copia de tu archivo actual .mdb y convierte la copia en archivo .mde. Con esto tu código queda empaquetado y nadie pude verlo, ni siquiera tu, es por eso que solo debes aplicar esta protección cuando tu aplicación este terminada, lista para distribuir.
Si después necesitas hacer cambios en tu aplicación deberás recuperar la copia original en .mdb, realizarle los cambios pertinentes y después volver a convertir tu base de datos a .mde.
Para convertir tu base de datos vas al menú:
 
Herramientas/Utilidades de la bases de datos/Crear archivo MDE...
 
Por código debería hacerse por:
 
DoCmd.RunCommand acCmdMakeMDEFile
 
Pero por código da error y no se puede utilizar
 
 
8. Poner Una Contraseña General De Apertura
Esta es una contraseña general, cada vez que abrimos la base de datos nos la pregunta y nunca varía, aquí no importa que usuario esta abriendo la base de datos.
La confiabilidad de este tipo de seguridad depende de que contraseña definamos, el número de caracteres que pongamos y el tipo de caracteres que utilicemos.
Para establecer esta contraseña tenemos que tener abierta la base de datos en Modo Exclusivo, si lo hacemos manualmente lo haremos desde el menú:
 
Herramientas/Seguridad/Establecer contraseña para la base de datos...
 
Por código podemos establecerla de esta manera:
 
Dim db As DAO.Database
Set db = CurrentDB
db.NewPassword "NuevaContraseña", "ContraseñaAnterior"
Set db = Nothing
 
Si la base de datos no tenía contraseña establecida, en el parámetro "ContraseñaAnterior" dejamos una cadena vacía:
 
db.NewPassword "NuevaContraseña", ""
 
Si nuestra base de datos ya tiene una contraseña establecida y la queremos borrar, en el parámetro "NuevaContraseña" dejaremos una cadena vacía:
 
db.NewPassword "", "ContraseñaAnterior"
 
 
8.1 Abrir Una Base De Datos Con Contraseña
Podemos abrir este tipo de base de datos utilizando el método OpenDatabase como se muestra a continuación, los parámetros están puestos en variables donde pueden entenderse mejor:
 
Sub AbrirBD_Contraseña()
'Byron Contreras - byronlcl@gmail.com - 2009
'.............................................
 
On Error GoTo Err_Procedimiento
Dim strArchivoMDB As String
Dim strContraseñaBD As String
Dim blnBloquearBaseDatos As Boolean
Dim blnAbrirEnModoExclusivo As Boolean
Dim db As DAO.Database
 
   'definir datos de apertura
   strArchivoMDB = "Archivo de base de datos con extensión .mdb"
   strContraseñaBD = "Contraseña de la base de datos"
   blnBloquearBaseDatos = False '¿Bloquear el archivo para que no pueda accesarse?
   blnAbrirEnModoExclusivo = False '¿Abrir en modo exclusivo?
   'abrir la base de datos
   Set db = DBEngine.OpenDatabase(strArchivoMDB, blnBloquearBaseDatos, blnAbrirEnModoExclusivo, "MS Access;PWD=" & strContraseñaBD)
 
   MsgBox "Número total de tablas: " & db.TableDefs.Count
   db.Close
 
Salir_Procedimiento:
   Set db = Nothing
   Exit Sub
 
Err_Procedimiento:
   MsgBox Err.Description, vbCritical, "Error número " & Err.Number
   Resume Salir_Procedimiento
End Sub
 
Recuerda que con este método tienes acceso a los datos de tablas y consultas, o sea el objeto Database
 
 
8.2 Automatizar Una Base De Datos Con Contraseña
Si tu intención es trabajar con los objetos de Access, formularios, informes, macros, módulos, barras, etc. entonces necesitas obtener el objeto de la aplicación, en cuyo caso puedes crear una nueva instancia de Microsoft Access y luego usar el método OpenCurrentDatabase para abrir la base de datos:
 
Sub ObjApl_AbrirBD_Contraseña()
'Byron Contreras - byronlcl@gmail.com - 2009
'.............................................
On Error GoTo Err_Procedimiento
Dim strArchivoMDB As String
Dim strContraseñaBD As String
Dim aplAccess As Access.Application
 
   'Definir datos de apertura...
   strArchivoMDB = "Archivo de base de datos .mdb"
   strContraseñaBD = "Contraseña de la base de datos"
 
   Set aplAccess = New Access.Application
   'Set appAccess = CreateObject("Access.Application") '<< también se puede así
   'aplAccess.Visible = True '<< si deseas que sea visible
   aplAccess.OpenCurrentDatabase strArchivoMDB, False, strContraseñaBD
 
   MsgBox aplAccess.CurrentDb.Name
 
   aplAccess.CloseCurrentDatabase
   aplAccess.Quit
 
Salir_Procedimiento:
   Set aplAccess = Nothing
   Exit Sub
 
Err_Procedimiento:
   MsgBox Err.Description, vbCritical, "Error número " & Err.Number
   Resume Salir_Procedimiento
End Sub