SlideShare una empresa de Scribd logo
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 asegurarsus
bases de datos, de cómo impedirel 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 seguridadque 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 queninguna 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. MostrarObjetos 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 funcionade 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
observartodos 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 sobreel 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 quetenemos una tabla llamada "Clientes", para aplicarlo:
Application.SetHiddenAttribute acTable,"Clientes", True
Para quitarlo:
Application.SetHiddenAttribute acTable,"Clientes", False
-Byron, ¿Como podría hacersi 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 encuentraabierto y nos genera error, _
entonces, en este parámetro le pasamos el nombrede 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, pasarpor alto objetos de sistema, temporales y el formulario de ejecución
IfstrFormularioEjecucion < > "" 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)
IfNot (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 OcultoActivado
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 decirsobre su funcionamiento porqueel nombreó título que
tienen nos deja saber de que se trata cada una (Favorde 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 limitaral usuario a realizarciertas
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 agregarun evento "Al
abrir"ó "Al Cargar"donde hagamos todas las validaciones quecreamos convenientes, como la
existencia de archivos necesarios, verificarfechas, 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+Qse abre la ventana del código VBA,con lo que cualquier
usuario puede verel 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 vertodas 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), inicialmenteen el cuadro de diálogo
de Inicio aparece"(Ninguno)", pero esto no quiere decir queeste nombreesté guardado en esta
propiedad, aquí realmente lo que pasa es que esta propiedadNO existe en la base de datos. Si
cambiamos este nombrepor el de algún formulario existente, lo que hace Access es que crea
dicha propiedad y le agrega el nombredel formulario. Si después volvemosa 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 cambiaruna propiedadpor código primero debemos revisar por su existencia;Si
encontramos que Sí existe, solo le cambiamos el valor, si encontramos que No existedebemos
crearla
Con el siguiente procedimiento podemos cambiarel valor de cualquier propiedad, si la
propiedad no existe se creará:
Sub CambiarPropiedadInicio(ByVal NombrePropiedad As String, _
ByVal TipoValor As Variant, _
ByVal NuevoValorAs 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:
IfErr.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 yano 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)
IfErr.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"
IfExistePropiedadInicio(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 puedeabrir 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 deseasverla 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 utilizarlapara realizar configuraciones ó
validaciones iniciales, similar al formulario de inicio.
Esta macro también puede sersaltada 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 observartodo el código insertado.
Para evitar esto debescodificar 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, cualquierusuario 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ó descodificarla 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 porcódigo, y de esta
manera podemos tener acceso a todos sus objetos, propiedades, métodos, etc.
Con la automatización podemos realizaroperaciones 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 AutomatizandoUna Base De Datos
Veamos como podemos abrirlas 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 strArchivoMDBAs 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 strArchivoMDBAs 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 strArchivoMDBAs 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 strArchivoEXEAs String
Dim strArchivoMDBAs 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)
IfShell(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 protegertu código paraque no pueda ser leído, solo se podrá accedera él
introduciendo la contraseñacorrecta
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, vea la página "Protección", allí podrás observarun check
"Bloquear proyecto para visualización", actívalo. Justo abajo aparecelos 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 protegertodo tu código VBA, al aplicarlo, Access crea una copia de t u
archivo actual .mdby 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 esteterminada,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 datosa .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 hacersepor:
DoCmd.RunCommand acCmdMakeMDEFile
Pero por código da error y no se puedeutilizar
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 confiabilidadde este tipo de seguridaddepende de que contraseña definamos,el número de
caracteres que pongamos y el tipo de caracteres que utilicemos.
Para establecer estacontraseñatenemos que tener abierta la base de datos en Modo Exclusivo,
si lo hacemos manualmente lo haremosdesde 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 datosya 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 dondepueden entenderse mejor:
Sub AbrirBD_Contraseña()
'Byron Contreras - byronlcl@gmail.com - 2009
'.............................................
On Error GoTo Err_Procedimiento
Dim strArchivoMDBAs String
Dim strContraseñaBDAs 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 strArchivoMDBAs String
Dim strContraseñaBDAs 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
9. Seguridad Por Usuarios
9.1 ¿Que Es?
Este tipo de seguridad es la más completa y confiable que nos ofrece Access.
Una base de datos cuenta con varios OBJETOS, como tablas, consultas, reportes, formularios,
macros y módulos, nosotros podemos crearUSUARIOSy ponerles una contraseña de inicio,
luego podemos asignarlespermisos a esos usuarios para utilizartodos los objetos mencionados
o solo algunos.
En la vida real no siemprenos interesa que un usuario tenga permisos completos sobre un
objeto, por citar un ejemplo, a veces necesitamos que un usuario pueda verun reporte y que
pueda imprimirlo, pero no queremos quepueda hacercambiosen el diseño. La se guridad por
usuarios nos permite eso, definir permisos específicos para cada objeto.
Los diferentes objetos tienen varios niveles de permisos, quevarían según sea el objeto. Veamos
una tabla, a esta se le pueden definir los siguientes permisos:
-Leer datos (Abrirla tabla y leer los datos)
-Insertar datos (crearnuevos registros)
-Modificar datos
-Eliminar datos (eliminar registros)
-Leer definiciones (ver la tabla en vista de diseño)
-Modificar definiciones (agregar, modificar y eliminar campos, crear índices, etc.en la vista de
diseño)
-Leer información de permisos
-Modificar permisos
A un usuario se le puede asignar solo un permiso de estos, varios permisos ó todos los permisos.
La seguridad por usuarios te permite tener a tus usuarios definidos exactamentecomo los
necesitas,a lo mejor quieres que la secretaria lea los datos de las facturas de compra, pero no
necesitas que realice cambios en los datos, ni mucho menos que los elimine.
9.2 ¿Cómo Funciona?
Para entenderlo debemos comprendercomo funciona Access, queaunque algunos no sabían,
trabaja todo el tiempo con Seguridad por usuarios.
Cada vez que la aplicación de Access inicia, lo primero que hace es consultar un archivo exterior
de extensión .mdw, en este archivo se encuentran guardados los nombres de usuarios y
contraseñas,a este archivo se le llama GRUPO DE TRABAJO.
Access solamente inicia con un nombrede usuario y contraseña correctos, los cuales valida en el
Grupo de trabajo (archivo exterior .mdw), luego, Access se queda conectado al Grupo de trabajo
y cada vez que intentamos realizar cualquieroperación como abrir un objeto, modificardatos,
etc. Access consulta si tenemos los permisos necesarios para realizar tal operación,si no
tenemos el permiso lógicamente no nos deja realizar la operación y nos informa.
-Byron, tu dices que Access trabaja todo el tiempo con Seguridad por usuarios, pero a mi nunca
me a pedido un nombre de usuario y contraseña...
Te doy detalles del porque:
Cuando abres por primera vez Access, se crea un archivo de Grupo de trabajo llamado
"System.mdw", este grupo de trabajo es el que usa Access predeterminadamente,cada basede
datos que has creado se conecta a él. Este archivo de grupo de trabajo contiene dos usuarios:
-Admin (Administrador)
-User (Usuario)
Estos usuarios contienen permisos totales sobretoda la base de datos, estos usuarios además
están definidos sin contraseña, es decir, con una cadena vacía "".
Cuando Access inicia,predeterminadamente se conecta al grupo de trabajo "System.mdw"y te
ingresa predeterminadamentecon el usuario "Admin"(Administrador), que como no tiene una
contraseña definida, ingresalibremente y no se detiene. La verdades que el grupo de trabajo Sí
preguntó porUsuario y contraseña, pero Access le ingreso el usuario "Admin"y de contraseña
una cadena vacía.
Mientras estas usando normalmentetu base de datos tampoco te das cuenta de que se están
manejando validaciones de permisos sobrelos objetos, esto es porquecomo dijimos antes,estas
ingresado con el usuario Admin,el cual tiene permisos totales y nunca encuentra restricciones.
Hagamos unas pruebas para corroborarlo dicho, vamos a la ventana VBA de Access, abramos la
ventana de inmediato (Ctrl+G) y escribamos esto (Copia y pega):
Debug.Print "Mi archivo de grupo de trabajo actual es:"&
Syscmd(acSysCmdGetWorkgroupFile)
Y presiona Enter, te saldrá el nombre del archivo de grupo de trabajo que estas utilizando.
Ahora escribe esto:
Debug.Print "Mi usuario actual es:"& CurrentUser()
Y presiona Enter, se mostrará el nombre del usuario actual con el que estas trabajando, con el
que Access te ha ingresado a la base de datos.
Ahora que ya tienes una idea general sobre la seguridad porusuarios, entremos en conceptos...
9.3 ¿Qué Son Los Usuarios y Los Grupos De Usuarios?
Un usuario es una persona individual definida en el grupo de trabajo, al ingresardebe
proporcionar su nombre de usuario y una contraseña, esta persona tendrá ciertos permisos para
utilizar objetos, estos permisos han sido agregados con anticipación poralgún Administrador de
seguridad de la base de datos.
La asignación de permisospara un usuario puede ser muy delicada, recordemos que hay que
especificarlepermisos para cadaobjeto existente, y para cada objeto existen varios permisos, los
cuales varían según sea el tipo de objeto.
Para ahorrar este trabajo se crearon los GRUPOS DE USUARIOS (simplementelos llamaremos
GRUPOS), tu puedes crearun nuevo Grupo y asignarleun nombre, luego le puedes asignar
permisos de la misma manera que lo harías con un usuario,la ventaja es que cuando yatienes
un grupo bien definido,al grupo le puedes agregar/ingresar usuarios y estos heredan
automáticamentetodos los permisos del grupo, luego puedes agregar, modificar ó eliminar
permisos a dicho grupo y los cambios se reflejan también en los usuarios.
Para citar un ejemplo, puedes crearun grupo llamado "Ventas"que tenga todos los permisos
para darle seguimiento a marketing, cotizaciones, pedidos y facturas. Cuando se contrate a una
nueva persona para el área de ventas, solo le creas un usuario en el sistema,lo agregas al grupo
"Ventas" y ya estará listo para trabajar, sin tener que estar definiendo cada vez los mismos pasos
de asignación de permisos.
Luego probablemente te interesecrear otro grupo llamado "V endedores", "Compradores",
"Supervisores", etc.
Hay que tomar nota que un usuario puede pertenecer a varios Grupos
Aunque un usuario pertenezca a uno o a varios grupos, también puedes definirle permisos
extras.
9.4 Algo Más...
Ahora que ya sabes lo que son los Grupos, te cuento queel grupo de trabajo "System.mdw"
(predeterminado) también tiene dos grupos incluidos:
-Users
-Admins
El usuario User está incluido en el grupo Users
El usuario Adminsestá incluido en el grupo Admins
El grupo Admins tiene permisoscompletos sobre toda la base de datos
-íAhora si te he entendido Byron,entonces el usuario Admin es el de mayorjerarquía porque
tiene todos los permisos y porque esta incluido en el grupo Admins!
Siento decirte queno, el usuario "Admin"no es el que tiene mayor jerarquía. Revisemos como
esta funcionando Access, hagamos estas pruebas:
Crea una nueva base de datos, ponlecualquier nombre(porquenos servirá solo para pruebas)
Esta nueva base de datos no tiene ningún objeto porque no hemos creado nada, pero vamos a
las tablas y verás que ya hay tablas creadas,si no puedes verlasve al menu:
Herramientas/Opciones/Pestaña Ver/Activarcasilla"Objetos de Sistema"
El nombre de todas estas tablas comienza por "Msys..."
Ahora, si el usuario "Admin"(con el que estas ingresado) tiene todos los permisos de la base de
datos no deberías tener ningún problema en tratar de modificaró eliminar estas tablas.Haz la
prueba, intentaeliminar cualquiera de estas tablas (seleccionala tabla y pulsa la tecla Supr)...
Exacto, nos da un mensaje que diceque no tenemos permiso para eliminar la tabla, pero,
¿Quién tiene este permiso?, hagamos otra comprobación;Dale un clic secundario a cualquiera
de estas tablas, en el menú desplegado escojamos la opción "Propiedades", allí veamos quien es
el propietario,a mi me sale que es un usuario llamado "Engine".
Veamos otra cosa, entre estas tablas existe una llamada "MSysAccessObjects", repitamos los
pasos para ver quién es el propietario, a mi me sale "Admin" ("Administrador") ó sea nosotros
en este momento. Si somos los propietarios entonces seguramente podemos hacer lo que
queramos con esa tabla,pero no es cierto, si la abrimos para leer los datos no tenemos ningún
problema, pero si intentamos eliminarla nos dice que no tenemo s permiso (haz la prueba).Esto
quiere decirque un usuario mayornos puso como propietarios de esta tabla, nos dio permiso de
lectura y nos quitó el permiso para eliminarla.
Sigamos con las pruebas:
No te preocupes si no entiendes el código a continuación, adelante lo veremos más a detalle.
Ahora, en un Módulo nuevo escribe este procedimiento (copia y pega):
Sub ListarUsuarios()
Dim usr As DAO.User
For Each usr In DBEngine.Workspaces(0).Users
Debug.Print usr.Name
Next usr
End Sub
Ve a la Ventana Inmendiato (si no esta abierta presiona Ctrl+G), escribe lo siguiente:
ListarUsuarios
Y presiona Enter, se escribirán los usuarios quetiene la base de datos,a mí me sale:
- Admin
- Creator
- Engine
El usuario Admin somos nosotros,los otros dos usuarios, Creatory Engine le pertenecen a
Access y no podemos hacer nada con ellos, ni modificarlos ni eliminarlos.
Hay que mencionar también que los usuarios Admin y User no pueden ser eliminados.
Si quieres ver los grupos predeterminados,escribe este nuevo procedimiento:
Sub ListarGrupos()
Dim grp As DAO.Group
For Each grp In DBEngine.Workspaces(0).Groups
Debug.Print grp.Name
Next grp
End Sub
En la ventana de inmediato escribimos:
ListarGrupos
Y hacemos Enter, se nos lista los grupos de usuarios existentes, a mí me sale:
Admins
Users
Estos dos grupos son predeterminados y tampoco se pueden eliminar.Del grupo Admins ya
hemos hablado.
Cuando creas un nuevo usuario manualmente, este automáticamentequeda ingresado en el
grupo de Users (Usuarios),si quieres que este usuario esté también en el grupo de
Administradores tendrás que ingresarlo en un paso siguiente
9.5 Activar La Seguridad Por Usuarios A Una Base De Datos
Como mencionamos antes, Access trabaja siempre con la seguridad por usuarios, quese
encuentra en un Grupo de trabajo que es un archivo externo llamado "System.mdw", cada base
de datos nueva que creemos se conecta a este archivo.
Si nosotros necesitamos agregarle a una base de datos la seguridad por usuarios, en realidad lo
que hacemos es crear un nuevo Grupo de trabajo (un archivo .mdw), luego necesitamos decirle a
Access que para abrir esta BD lo haga a través de este nuevo grupo de trabajo.
Para realizar este proceso, lo más fácil es hacerlo porel asistente, que se encuentra en el menú:
Herramientas/Seguridad/Asistente para seguridad por usuarios...
Allí seguimos todos los pasos del asistente leyendo detenidamente cada paso hasta finalizar.
Cuando se termina este proceso,Access nos da un informe de cómo quedaron las cosas y nos
permite guardar la información en otro lugarpara que pueda servirnos más adelante. Todo este
proceso lo que hacees:
-Crear un nuevo grupo de trabajo, un archivo .mdw
-Obliga a crear un nuevo usuario en el grupo de Administradores
-Al usuario Admin se le quitan todos los permisos
-Al usuario Admin se le coloca una contraseña
Con esto se logra que al iniciar Access nos lance la pantalla de ingreso donde pide usuario y
contraseña, porque como vimosanteriormente, Access inicialmente intenta ingresar con un el
usuario Admin y con una contraseña vacía,la cual encuentra que no coincide(porque ahora hay
una contraseña) y nos lanza la pantalla de ingreso
-El usuario "Admin"es sacado del grupo de "Admins"
Esto es porque el grupo Admins siempremantiene los permisos completos
-A los objetos existentes se les cambia de propietario, se les pone el nuevo usuario
administrador ingresado en el proceso
9.6 Programando
A este punto debes tener entendido todo lo dicho anteriormente sobrecomo funciona la
seguridad por usuarios, si tienes dudas por favor vuelve a leer desde el principio y cuando todo
esté claro continuas
Bueno, aquí viene lo bonito ya que empezaremos a ver todo lo dicho anteriormente pero con
código.
IMPORTANTE
No trabajes los usuarios y grupos de usuarios sobre el grupo de trabajo predeterminado de
Access "System.mdw", porque si haces cambios, este se reflejará sobre todas las bases de datos
que tienes y las nuevas que crees.
Crea una base de datos nueva, agrégale un nuevo grupo de trabajo como se especifica en el
punto anterior "AgregarLa Seguridad Por Usuarios A Una Base De Datos", y así solo esa base de
datos estará protegida.
En este artículo intento dar las explicaciones de cómo se realizan las operaciones manualmente
y con código. Si eres nuevo en este tema (seguridad porusuarios), te aconsejo que vallas
aprendiendo de cómo se realizan las cosas solo manualmente, porqueel código puede
confundirte. Solo cuando ya tengas experiencia manejando las cosas manualmente empieza el
aprendizaje del código
Programando...
Microsoft Access trabaja la totalidad de operaciones de seguridad a través de dos conjuntos:
- Grupos de trabajo, Grupos, Usuarios y Contraseñas
- Objetos de la base de datos y permisos
Estos conjuntos se operan de manera diferente, y los detallamos a continuación
9.7 Grupos de trabajo,Grupos,Usuarios y Contraseñas
Para administrar manualmentelos Grupos,Usuarios y contraseñas puedes ir al menú:
Herramientas/Seguridad/Cuentas de usuario y de grupo...
Pero nuestra intención es automatizarlo, así que este conjunto lo podemos trabajar con el objeto
Application.DBEngine.
Veamos como podemos establecer referencias a los objetos, para hacer referencia al grupo de
trabajo actual tenemos:
Dim ws As DAO.Workspace
Set ws = DBEngine.Workspaces(0)
Para hacer referencia a un usuario:
Dim ws As DAO.Workspace
Dim usr As DAO.User
Set ws = DBEngine.Workspaces(0)
Set usr = ws.Users("NombreUsuario")
Para hacer referencia a un grupo:
Dim ws As DAO.Workspace
Dim grp As DAO.Group
Set ws = DBEngine.Workspaces(0)
Set grp = ws.Groups("NombreGrupo")
Para hacer referencia a los usuarios quepertenecen a un grupo:
Dim ws As DAO.Workspace
Dim usrs As DAO.Users
Set ws = DBEngine.Workspaces(0)
Set usrs = ws.Groups("NombreGrupo").Users
Para hacer referencia a los grupos a los cuales perteneceun usuario:
Dim ws As DAO.Workspace
Dim grps As DAO.Groups
Set ws = DBEngine.Workspaces(0)
Set grps = ws.Users("NombreUsuario").Groups
Conociendo esta lógica, ahora podemos entenderlos procedimientos siguientes:
Listar los usuarios del sistema:
Sub ListarUsuarios()
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
Dim usr As DAO.User
For Each usr In DBEngine.Workspaces(0).Users
Debug.Print usr.Name
Next usr
End Sub
Listar los grupos del sistema:
Sub ListarGrupos()
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
Dim grp As DAO.Group
For Each grp In DBEngine.Workspaces(0).Groups
Debug.Print grp.Name
Next grp
End Sub
Listar los usuarios que pertenecen a un grupo:
Sub ListarUsuariosEnGrupo(ByVal strGrupo As String)
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
Dim usr As DAO.User
For Each usr In DBEngine.Workspaces(0).Groups(strGrupo).Users
Debug.Print usr.Name
Next usr
End Sub
Lista de grupos a los cuales pertenece un usuario:
Sub ListarGruposDeUsuario(ByVal strUsuario As String)
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
Dim grp As DAO.Group
For Each grp In DBEngine.Workspaces(0).Users(strUsuario).Groups
Debug.Print grp.Name
Next grp
End Sub
Crear un usuario:
Sub CrearUsuario(ByVal strNombreUsuario As String, _
ByVal strIdUsuario As String, _
Optional ByVal strContraseña As String = "")
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
Dim usr As DAO.User
With DBEngine.Workspaces(0)
Set usr = .CreateUser(strNombreUsuario, strIdUsuario, strContraseña)
.Users.Appendusr
.Users.Refresh
'agregarlo al grupo Users
With .Groups("Users")
Set usr = .CreateUser(strNombreUsuario)
.Users.Append usr
.Users.Refresh
End With
End With
Set usr = Nothing
End Sub
Crear un grupo:
Sub CrearGrupo(ByVal strNombreGrupo As String, ByVal strIdGrupo As String)
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
Dim grp As DAO.Group
With DBEngine.Workspaces(0)
Set grp = .CreateGroup(strNombreGrupo, strIdGrupo)
.Groups.Append grp
.Groups.Refresh
End With
Set grp = Nothing
End Sub
Agregar un usuario a un grupo:
Sub AgregarUsuario_a_Grupo(ByVal strUsuario As String,ByVal strGrupo As String)
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
Dim usr As DAO.User
With DBEngine.Workspaces(0).Groups(strGrupo)
Set usr = .CreateUser(strUsuario)
.Users.Appendusr
.Users.Refresh
End With
End Sub
Eliminar un usuario definitivamente:
Sub EliminarUsuario(ByVal strUsuario As String)
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
DBEngine.Workspaces(0).Users.Delete strUsuario
End Sub
Eliminar un grupo definitivamente:
Sub EliminarGrupo(ByVal strGrupo As String)
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
DBEngine.Workspaces(0).Groups.Delete strGrupo
End Sub
Eliminar a un usuario de un grupo:
Sub EliminarUsuario_de_Grupo(ByVal strUsuario As String, ByVal strGrupo As String)
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
DBEngine.Workspaces(0).Groups(strGrupo).Users.Delete strUsuario
End Sub
Cambiar la contraseña para un usuario:
Sub CambiarContraseña(ByVal strUsuario As String, _
ByVal strContraseñaAnterior As String, _
ByVal strContraseñaNueva As String)
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
With DBEngine.Workspaces(0)
.Users(strUsuario).NewPassword strContraseñaAnterior, strContraseñaNueva
End With
End Sub
Determinar si existe un usuario:
Function ExisteUsuario(ByVal strUsuario As String) As Boolean
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
Dim usr As DAO.User
On Error Resume Next
Set usr = DBEngine.Workspaces(0).Users(strUsuario)
IfErr.Number = 0 Then
ExisteUsuario = True
Else
Err.Clear
End If
Set usr = Nothing
End Function
Determinar si existe un grupo:
Function ExisteGrupo(ByVal strGrupo As String) As Boolean
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
Dim grp As DAO.Group
On Error Resume Next
Set grp = DBEngine.Workspaces(0).Groups(strGrupo)
IfErr.Number = 0 Then
ExisteGrupo = True
Else
Err.Clear
End If
Set grp = Nothing
End Function
Determinar si un usuario pertenece a un grupo:
Function ExisteUsuarioEnGrupo(ByVal strGrupo As String, ByVal strUsuario As String) As Bool
ean
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
Dim usr As DAO.User
On Error Resume Next
Set usr = DBEngine.Workspaces(0).Groups(strGrupo).Users(strUsuario)
IfErr.Number = 0 Then
ExisteUsuarioEnGrupo = True
Else
Err.Clear
End If
Set usr = Nothing
End Function
9.8 Objetos De La Base De Datos Y Permisos
Para administrar manualmentelos permisos de los objetos puedes ir al menú:
Herramientas/Seguridad/Permisos de usuario y de grupo...
Para automatizar los permisos de la base de datos podemos trabajara través de dos métodos;
ADOX y DAO.
ADOX tiene la desventaja que falla a la hora de trabajar con reportes, formularios, macros y
módulos, ADOXesta bien para trabajar otro tipo de bases de datos, las cuales no incluyen estos
objetos.Por esta razón dejaremos ADOX por un lado y solo no s enfocaremos en DAO.
DAO nos ofrece la siguiente jerarquía de objetos:
Container > Document > Permission
Que más o menos quieren decir:
Container:Colección de objetos por tipo (Tablas, consultas,reportes, macros ó módulos)
Ducument:Objeto específico (tabla,consulta, reporte, formulario, macro ó módulo)
Permission:Permisos para el objeto específico
Podemos accedera estos elementos bajo el objeto "base de datos", que es fácil de describir
porque trabajamos con el a menudo:
Dim db As DAO.Database
Set db = Application.CurrentDb
Veamos los objetos más a detalle:
Container (Colección de objetos de un tipo específico)
Se refiere a la colección completa de un tipo específico. Entre los Containers tenemos:
- Tables (Tablas y Consultas)
- Forms (Formularios)
- Reports (Reportes)
- DataAccessPages (Páginas de datos)
- Scripts (Macros)
- Modules (Módulos)
- Databases (Bases de datos del grupo de trabajo)
También existen otros Containers que no usamos mucho:
- Relationships (Relaciones)
- SysRel (Relaciones del sistema)
Document (Objeto específico)
Se refiere a un objeto como una tabla, consulta, reporte, formulario, etc. Si tomamos por
ejemplo la tabla "Clientes", esta es un Document que se encuentra dentro del Container "Tables"
Permission (Permiso)
Los permisos son un valorde tipo Entero Largo (Long), en el cual podemos leer, asignar,
modificar ó eliminar valores de permisos.
Veamos algo de código sobre lo que hemos explicado hasta ahora:
Imaginemos quetenemos al usuario "Byron Contreras"y queremos obtenerlos permisos que
tiene sobre la tabla "Clientes"
Dim db As DAO.Database
Dim cont As DAO.Container
Dim doc As DAO.Document
Dim lngPermisos as Long
'Base de datos
Set db = CurrentDB
'Container (colección a la que perteneceel objeto que nos interesa)
Set cont = db.Containers("Tables")
'Document (Objeto específico)
Set doc = cont.Documents("Clientes")
'Usuario sobre el que se hará la consulta
doc.UserName= "Byron Contreras"
'Permisos
lngPermisos = doc.Permissions
En este momento, en la variable "lngPermisos"se encuentra un valorque representa a todos los
permisos que se tienen sobreel objeto.
9.9 Permisos Específicos
Los permisos que se pueden leer, asignar ó eliminar varían dependiendo del objeto. Entre las
constantes de permisos, para los diferentes objetos tenemos:
Constante:Valor:Container(Aplica a):Permiso para:
dbSecDBCreate 1 Base de datos Crear nuevas bases de datos
dbSecDBAdmin 8 Base de datos Replicaro cambiar contraseña
dbSecDBOpen 2 Base de datos Abrir
dbSecDBExclusive 4 Base de datos Abriren modo exclusivo
dbSecReadDef4 Tablas y Consultas Leer definiciones
dbSecWriteDef65548 Tablas y Consultas Editar/modificar/actualizary eliminar definiciones
dbSecRetrieveData 20 Tablas y ConsultasLeer datos
dbSecInsertData 32 Tablas y Consultas Insertardatos
dbSecReplaceData 64 Tablas y Consultas Editar/modificar/actualizar datos
dbSecDeleteData 128 Tablas y Consultas Eliminar datos
acSecFrmRptExecute256 Formularios y Reportes Abrir
acSecFrmRptReadDef4 Formularios y Reportes Leerel diseño
acSecFrmRptWriteDef65548 Formularios y Reportes Modificarel diseño
acSecMacExecute 8 Macros Ejecutar
acSecMacReadDef10 Macros Leer el diseño
acSecMacWriteDef65542Macros Modificar
acSecModReadDef2 Módulos Leer
acSecModWriteDef65542Módulos Editar
dbSecNoAccess 0 TodosNingún permiso
dbSecFullAccess 1048575 Todos Permisos completos(Administrar)
dbSecCreate 1 Todos Crear nuevos objetos
dbSecDelete 65536 Todos Eliminar
dbSecReadSec 131072 Todos Leer información de seguridad (permisos)
dbSecWriteSec 262144 Todos Editar/modificar/actualizar información de seguridad (permisos)
dbSecWriteOwner 524288 Todos Cambiar el propietario del objeto
En realidad los permisos son un valortipo BitMask, en el cual tenemos que realizar
comparaciones con los operadores AND, OR, AND NOT para obtener los resultados que
deseamos, por ejemplo:
En el código anteriorse puede observar como obtenerel valor de permisos que contiene un
Document, este valor lo encontramos en:
doc.Permissions
Para revisar si hay un permiso específico:
If (doc.Permissions ANDdbSecRetrieveData) Then
Msgbox "Si hay permiso para leer datos"
End if
Para asignar un permiso:
doc.Permissions = doc.Permissions OR dbSecInsertData
Para eliminar un permiso:
con.Permissions = con.Permissions ANDNOT dbSecDeleteData
Veamos esteejemplo completo:
Imaginemos quetenemos al usuario "Byron Contreras", y queremos sabersi tiene el permiso de
"Insertar datos"en la tabla "Clientes", si no tiene el permiso se lo asignamos. Al final también le
quitaremos el permiso de eliminar datos de la misma tabla
Dim db As DAO.Database
Dim cont As DAO.Container
Dim doc As DAO.Document
'Base de datos
Set db = CurrentDB
'Container (colección a la que perteneceel objeto que nos interesa)
Set cont = db.Containers("Tables")
'Document (Objeto específico)
Set doc = cont.Documents("Clientes")
'Usuario sobre el que se hará la consulta
doc.UserName= "Byron Contreras"
'¿Tiene Permiso?
'verificamos el valorBitMask de permisos con el valorespecífico del permiso
If(doc.Permissions ANDdbSecInsertData) then
Msgbox "Si hay permiso para leer datos"
Else
'aquí entramos porqueno hay permiso, entonces se lo asignamos
doc.permissions= doc.permissions OR dbSecInsertData
End If
'Quitarle el permiso para eliminar datos
doc.permissions = doc.permissions ANDNOT dbSecDeleteData
set doc = Nothing
set cont = Nothing
set db = Nothing
9.10 Casos Especiales De Permisos
Objetos Nuevos:
Existe un tipo de permiso para poder crear objetos nuevos, aquí no tenemos un nombre de
Document. Para verificar estepermiso lo hacemos directamente sobre el Container.
Revisemos si el usuario "Byron Contreras"tiene permiso de crearnuevas tablas:
Dim db As DAO.Database
Dim cont As DAO.Container
'Base de datos
Set db = CurrentDB
'Contenedor (colección a la que pertenece el objeto quenos interesa)
Set cont = db.Containers("Tables")
'Usuario sobre el que se hará la consulta
cont.UserName = "Byron Contreras"
'¿Tiene Permiso?
'verificamos el valorBitMask de permisos con el valorespecífico del permiso
Ifcont.Permissions ANDdbSecCreate then
Msgbox "Si existen permisos para creartablas nuevas"
End If
set cont = Nothing
set db = Nothing
Permisos Sobre La Base De Datos:
Cuando revisamos permisos para la Base de datos, el nombredel Document siempre se llama
"Msysdb".
Revisemos si el usuario "Byron Contreras"tiene permiso de abrirla base de datos:
Dim db As DAO.Database
Dim cont As DAO.Container
Dim doc As DAO.Document
'Base de datos
Set db = CurrentDB
'Contenedor (colección a la que pertenece el objeto quenos interesa)
Set cont = db.Containers("Databases")
'Documento (Objeto específico)
Set doc = cont.Documents("Msysdb")
'Usuario sobre el que se hará la consulta
doc.UserName= "Byron Contreras"
'¿Tiene Permiso?
'verificamos el valorBitMask de permisos con el valorespecífico del permiso
Ifdoc.Permissions ANDdbSecDBOpen then
MsgBox "Si tienes permiso para abrir la base de datos"
End If
set doc = Nothing
set cont = Nothing
set db = Nothing
9.11 Verificar Si Un Usuario T iene Un Permiso
(Para verificarun permiso específico favor de ir atrás al inciso 9.9 Permisos Específicos)
Nosotros podemos revisar si un usuario tiene algún permiso específico sobre un objeto y obtener
que NO existen permisos, pero podría ser queel usuario SI tenga el permiso porque estese
podría estar heredando. Un usuario puede tener permiso sobre un objeto porvarias razones:
- El usuario tiene permisos dados sobre el objeto
- El usuario pertenecea un grupo, este grupo tienepermisos sobre el objeto y el usuario está
heredando los permisos del grupo
- El usuario es el propietario del objeto (creador)
Para conocer si un usuario tiene un permiso, no importando de dondevenga podemos consultar
la propiedad "AllPermissions"del Document:
Dim db As DAO.Database
Dim cont As DAO.Container
Dim doc As DAO.Document
'Base de datos
Set db = CurrentDb
'Contenedor (colección a la que pertenece el objeto quenos interesa)
Set cont = db.Containers("Databases")
'Documento (Objeto específico)
Set doc = cont.Documents("Msysdb")
'Usuario sobre el que se hará la consulta
doc.UserName= "Byron Contreras"
'¿Tiene Permiso?
'verificamos el valorBitMask de permisos con el valorespecífico del permiso
Ifdoc.AllPermissions AnddbSecDBOpen Then
MsgBox "Si tienes permiso para abrir la base de datos"
End If
Set doc = Nothing
Set cont = Nothing
Set db = Nothing
Aquí sabemos si realmenteexisteel permisos para el usuario,auque no sabemos si viene por
permiso directo al usuario, si vienede algún grupo ó por serel propietario
9.12 Propietario De Los Objetos (Owner)
Todos los objetos tienen un propietario, que es el nombredel usuario que los ha creado. El
propietario del objeto predeterminadamente tienetodos los permisos sobre el objeto. También
es posible cambiarde propietario a los objetos.
Veamos un ejemplo de como conocerquién es el propietario (Owner) de un objeto:
Queremos conoceral dueño de la tabla "Clientes":
Dim db As DAO.Database
Dim cont As DAO.Container
Dim doc As DAO.Document
Dim strDueño As String
Set db = CurrentDb
Set cont = db.Containers("Tables")
Set doc = cont.Documents("Clientes")
strDueño = doc.Owner
MsgBox "El dueño de la tabla Clientes es:" & strDueño
Set doc = Nothing
Set cont = Nothing
Set db = Nothing
9.13 Funciones útiles
íFelicitaciones!
En este punto ya sabes como operar los permisos, y como ya te aprendistetodo muy bien, ya
podemos empezara simplificar el código y crear nuestros procedimientos:
Function ExistePermisoEnObjeto(ByVal strContainer, _
ByVal strDocumentAs String, _
ByVal strUsuarioGrupo As String, _
ByVal lngPermiso As Long) As Boolean
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
Dim db As DAO.Database
Set db = CurrentDb
With db.Containers(strContainer).Documents(strDocument)
.UserName = strUsuarioGrupo
If (.Permissions And lngPermiso) Then ExistePermisoEnObjeto = True
End With
Set db = Nothing
End Function
Function ExistePermisoCrearObjetos(ByVal strContainer,_
ByVal strUsuarioGrupo As String) As Boolean
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
Dim db As DAO.Database
Set db = CurrentDb
With db.Containers(strContainer)
.UserName = strUsuarioGrupo
If (.Permissions And dbSecCreate) Then ExistePermisoCrearObjetos = True
End With
Set db = Nothing
End Function
Sub AgregarPermisoEnObjeto(ByVal strContainer, _
ByVal strDocumentAs String, _
ByVal strUsuarioGrupo As String, _
ByVal lngPermiso As PermissionEnum)
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
Dim db As DAO.Database
Set db = CurrentDb
With db.Containers(strContainer).Documents(strDocument)
.UserName = strUsuarioGrupo
.Permissions = .Permissions Or lngPermiso
End With
Set db = Nothing
End Sub
Sub PermitirCrearObjetosNuevos(ByVal strContainer, _
ByVal strUsuarioGrupo As String, _
ByVal Permitir As Boolean)
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
Dim db As DAO.Database
Set db = CurrentDb
With db.Containers(strContainer)
.UserName = strUsuarioGrupo
If Permitir Then
.Permissions = .Permissions Or dbSecCreate
Else
.Permissions = .Permissions And Not dbSecCreate
End If
End With
Set db = Nothing
End Sub
Sub EliminarPermisoEnObjeto(ByVal strContainer, _
ByVal strDocument As String, _
ByVal strUsuarioGrupo As String, _
ByVal lngPermiso As PermissionEnum)
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
Dim db As DAO.Database
Set db = CurrentDb
With db.Containers(strContainer).Documents(strDocument)
.UserName = strUsuarioGrupo
.Permissions = .Permissions AndNot lngPermiso
End With
Set db = Nothing
End Sub
Function ObtenerPropietarioObjeto(ByVal strContainer, _
ByVal strDocument As String) As String
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
Dim db As DAO.Database
Set db = CurrentDb
ObtenerPropietarioObjeto = db.Containers(strContainer).Documents(strDocument).Owner
Set db = Nothing
End Function
Sub CambiarPropietarioObjeto(ByVal strContainer, _
ByVal strDocument As String, _
ByVal strUsuario As String)
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
Dim db As DAO.Database
Set db = CurrentDb
db.Containers(strContainer).Documents(strDocument).Owner = strUsuario
Set db = Nothing
End Sub
Sub QuitarTodosLosPermisos(ByVal strUsuarioGrupo As String)
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
Dim db As DAO.Database
Dim cont As DAO.Container
Dim doc As DAO.Document
On Error Resume Next
Set db = CurrentDb
For Each cont In db.Containers
'permisos en los objetos
For Each doc In cont.Documents
doc.UserName = strUsuarioGrupo
doc.Permissions = dbSecNoAccess
Next doc
'permisos para objetos nuevos
cont.UserName = strUsuarioGrupo
cont.Permissions = dbSecNoAccess
Next cont
Set db = Nothing
End Sub
Sub AsignarTodosLosPermisos(ByVal strUsuarioGrupo As String)
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
Dim db As DAO.Database
Dim cont As DAO.Container
Dim doc As DAO.Document
On Error Resume Next
For Each cont In db.Containers
'permisos para objetos nuevos
cont.UserName = strUsuarioGrupo
cont.Permissions = dbSecFullAccess
'permisos en los objetos
For Each doc In cont.Documents
doc.UserName = strUsuarioGrupo
doc.Permissions = dbSecFullAccess
Next doc
Next cont
Set db = Nothing
End Sub
9.14 ¿Cómo Puedo Abrir Una Base De Datos Definida Con Seguridad Por Usuarios?
Eso depende que quieras hacercon la base de datos, puedes tener dos intenciones:
- Acceder a los datos (tablas y consultas)
- Automatizar la base de datos, es decir, tener acceso también a los objetos como reportes,
formularios, macros, módulos, barras de herramientas, etc.
Abrir Base De Datos Y AccederA Los Datos (Tablas Y Consultas)
Puedes usar el siguiente procedimiento:
Sub DAO_AbrirBaseDatosSegura()
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
On Error GoTo Err_Procedimiento
Dim strArchivoMDBAs String
Dim strContraseñaBDAs String
Dim dbe As DAO.DBEngine
Dim db As DAO.Database
'Definir datos de apertura...
strArchivoMDB = "Archivo de base de datos .mdb"
strContraseñaBD= "Contraseña de la base de datos"
'Crear una nueva instancia del objeto DBEngine (Motor de base de datos Microsoft Jet)
Set dbe = New DAO.DBEngine
dbe.SystemDB= "Ruta completa archivo de grupo de trabajo .mdw"
dbe.DefaultUser= "Nombre del usuario"
dbe.DefaultPassword = "Contraseña del usuario"
'abrir la base de datos
Set db = dbe.OpenDatabase(strArchivoMDB, False, False, "MS Access;PWD=" &
strContraseñaBD)
MsgBox "Base de datos abierta:"& vbCrLf& db.Name, _
vbInformation, _
"Operación exitosa!"
db.Close
Salir_Procedimiento:
Set db = Nothing
Set dbe = Nothing
Exit Sub
Err_Procedimiento:
MsgBox Err.Description,vbCritical, "Error número "& Err.Number
Resume Salir_Procedimiento
End Sub
Abrir Base De Datos Y Automatizarla
Puedes usar el siguiente procedimiento:
Sub Shell_AbrirBaseDatosSegura()
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
'Procedimiento que abre una base de datos definida con Seguridad Por Usuarios _
y devuelve el objeto Application parapoder automatizarlo
'El procedimiento no funciona si existe contraseña de base de datos
On Error GoTo Err_Procedimiento
Dim strArchivoEXEAs String
Dim strArchivoMDBAs String
Dim strArchivoMDWAs String
Dim strUsuario As String
Dim strContraseña 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 = "Archivo de base de datos .mdb"
strArchivoMDW = "Archivo de grupo de trabajo .mdw"
strUsuario = "Nombre de usuario"
strContraseña = "Contraseña del usuario"
'Construir la cadena para la función Shell
strShell = """" & strArchivoEXE& """" & " " & _
"""" & strArchivoMDB& """" & " " & _
"/User " & strUsuario &" " & _
"/Pwd " & strContraseña &" " & _
"/NoStartup " & _
"/Wrkgrp " & """" & strArchivoMDW& """"
'Si la función Shell tiene éxito tomamos el archivo/objeto(aplicación Access)
IfShell(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 "Proyecto abierto:"& aplAccess.CurrentProject.Name, _
vbInformation, _
"Operación exitosa!"
'Acceso a datos:
'aplAccess.CurrentDB...
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
9.15 ¿Cómo valida Access los permisos?
Cuando creas un usuario nuevo, tienes que asignarleun ID. Este ID queda guardado en ambos
archivos, en el Grupo de trabajo y en tu base de datos,este IDes el que realmente cuenta todo el
tiempo.
Cuando ingresas a la base de datos proporcionas un nombrede usuario y contraseña,con estos
datos Access recupera el IDdel usuario internamente, luego va al archivo de grupo de trabajo y
revisa si el nombre del usuario y el IDcorresponden, de allí Access determinará si eres un
usuario válido ó no.
Esto es lógico, porque imagínate que en tu base de datos tienes un usuario llamado "Byron
Contreras"con su respectiva contraseña, este usuario tiene permisos completos sobretodo.
Alguien podríaintentarcrear un nuevo grupo de trabajo y agregarun usuario llamado también
"Byron Contreras"y que no tenga contraseña,luego puede intentarabrir la base de datos
mencionadacon estenuevo grupo de trabajo,esperando poder entrarcon el usuario "Byron
Contreras"y sin contraseña. Esto no es posible porque al crear el usuario en ambos grupos de
trabajo se les asignó un ID diferente, y por lo tanto no hay permiso de ingreso.
Si alguien conociera el IDcon el que "Byron Contreras"fue ingresado en el grupo de trabajo
original, si le funcionaría el truco, porqueen el nuevo grupo de trabajo crearía al usuario "Byron
Contreras"con el mismo ID.
Esto es importanteentenderlo porque:
¿Qué pasaría si alguien por error te borra el archivo de grupo de trabajo?
Si tienes debidamente guardados los IDy nombres de los usuarios y grupos, solo creas un nuevo
grupo de trabajo con esos datos.
Si no tienes guardada esa información es casi seguro que pierdes tu base de datos porque no
habrá como accesara ella.
¿Has pensado como se manejan los permisos entre bases de datos creadas en diferentes
máquinas?, ¿Por qué puedo abrirtus bases de datos y tu las mías?
La respuesta es simple, si recuerdas, Access trabaja predeterminadamente con el grupo de
trabajo "System.mdw", que es el mismo en tu máquina y en la mía. Este grupo de trabajo tiene
dos usuarios predeterminados "Admin"y "User", los cuales contienen cada uno un ID, que es el
mismo también en ambas máquinas.
Si creas un nuevo grupo de trabajo, se crearán estos mismos usuarios y el IDse mantendrá.
Los usuarios Admin y User ya vienen predeterminados y no podemos conocersu IDporque
nosotros no los hemos creado, solo la gente de Microsoft sabrá cual es.
Con esto podemos deducir que:
Si tú tienes una base de datos definida con Seguridad por usuarios, al usuario "Admin"le borras
la contraseña de ingreso, y además le concedes todos los permisos, casi le estas eliminando la
seguridad por usuarios, porque si recuerdas, Access predeterminadamente te ingresa con el
grupo de trabajo "System.mdw"y con el usuario "Admin"y sin contraseña, y como el IDdel
usuario "Admin"es el mismo en ambas bases de datos y grupos de trabajo, te dejará entrar
libremente.
9.16 ¿Cómo Puedo Quitarle La Seguridad Por Usuarios A Una Base de Datos?
Tendrías que seguir los siguientes pasos:
- Ingresar a la base de datos con una cuenta de Administrador
- Asignarle permisos completos de todos los objetos y de la base de datos a los usuarios Admin y
User
- Poner como propietario de todo al usuario Admin
- Agregar al usuario Admin al grupo de Admins (Administradores)
- Por último crear una nueva basede datos y desde allí realizar la importación de todos los
objetos
Aquí te dejo el código:
Sub EliminarSeguridadPorUsuarios()
'Byron Contreras - byronlcl@gmail.com - 2,009
'.............................................
'Para correreste procedimiento debes ser miembro del grupo _
de Administradores
On Error Resume Next
Dim db As DAO.Database
Dim i As Integer
Dim strUsuarioGrupo As String
Dim cont As DAO.Container
Dim doc As DAO.Document
Dim usr As DAO.User
Set db = CurrentDb
'asignarle todos los permisos al usuario Admin y al grupo Users,
'poner como propietario de todos los objetos al usuario Admin
For i = 1 To 2
strUsuarioGrupo = IIf(i = 1, "Admin", "Users")
For Each cont In db.Containers
'objetos nuevos
cont.UserName= strUsuarioGrupo
cont.Permissions= dbSecFullAccess
'objetos existentes
For Each doc In cont.Documents
doc.UserName= strUsuarioGrupo
doc.Permissions = dbSecFullAccess
IfstrUsuarioGrupo = "Admin" Then doc.Owner = strUsuarioGrupo
Next doc
Next cont
Next i
'agregar al usuario Admin al grupo Admins
With DBEngine.Workspaces(0).Groups("Admins")
Set usr = .CreateUser("Admin")
.Users.Appendusr
.Users.Refresh
End With
Set db = Nothing
End Sub
9.17 Consultas Con Acceso De Propietario (With OwnerAccess Option)
Existe una opción para que nadietenga acceso a tus tablas y que a la vez puedan ser
actualizadas. Para lograr esto, primero debes quitarlea los usuarios todos los permisos sobre la
tabla que deseas proteger, luego debes crear una Consulta de Acción (sobre la tabla) y la defines
con With Owner Access Option.
Através de esta consulta cualquierusuario puede modificar la tabla, aunque no tenga ningún
permiso sobre la misma. Este tipo de consulta no puedeser modificada por nadie, solo por el
propietario (creador). Si un usuario intentacualquier cosa directamente sobre la tabla los
permisos serán denegados.
Manualmente:
Crea tu consulta en la vista de diseño, en el área vacía donde se muestran las tablas le das un clic
secundario, en el menú desplegable seleccionas "Propiedades", dentro de las propiedades busca
por "Permisos de Ejecución", allí escoges "De Propietario"
Si estas creando la sentenciaSQL:
Crea tu cadena normalmente y al final de la sentencia SQL le agregas WIHT OWNER
ACCESS OPTION
9.18 Para Finalizar
Utilizando la Seguridad Por Usuarios estamos Administrando a nuestrosusuarios tal y como
Access nos Administra a nosotros
Algunas personas crean sus propias tablas para manejar sus Usuarios, Objetos y Permisos, pero
en lo personal me pareceque es no aprovechar las herramientas que Access ya nos ha dado,
además tienen que volver a inventar lo mismo, y lo que me parecemás delicado es que el
usuario Admin sigue con los permisos completos, lo cual quiere decir quepor automatización
podemos abrir esas bases de datos y hacerles lo que deseemos. Tengo un ejemplo quehace eso,
demostrarlo vulnerable que pueden ser esas bases de datos con esas condiciones, por ahí se los
pongo también...
La seguridad por usuarios funciona completamente en Access 2,003ó inferior, en Access 2,007
también es compatiblepero ya no da la opción de asegurar bases de datos en el formato 2,007,y
este es un gran tema de debate...
Saludos cordiales,
Byron Contreras

Más contenido relacionado

La actualidad más candente

SQL Visual Basic 6.0
SQL Visual Basic 6.0SQL Visual Basic 6.0
SQL Visual Basic 6.0
odairfunez
 
pasos para hacer una mini agenda en visual basic 6.0
pasos para hacer una mini agenda en visual basic 6.0pasos para hacer una mini agenda en visual basic 6.0
pasos para hacer una mini agenda en visual basic 6.0
yeimimorel
 
CONTROLES COMUNES VISUAL BASIC
CONTROLES COMUNES VISUAL BASICCONTROLES COMUNES VISUAL BASIC
CONTROLES COMUNES VISUAL BASIC
luismy055
 
20091223 Creacion De Bibliotecas Parametricas En Catia
20091223 Creacion De Bibliotecas Parametricas En Catia20091223 Creacion De Bibliotecas Parametricas En Catia
20091223 Creacion De Bibliotecas Parametricas En Catia
Xavier Conesa
 
Guia no2 ado.net
Guia no2 ado.netGuia no2 ado.net
Guia no2 ado.net
Manuel Hormechea
 
Visual basic 2010 data por codigo
Visual basic 2010 data por codigoVisual basic 2010 data por codigo
Visual basic 2010 data por codigo
juan fernandez
 
61229578 acceso-a-base-de-datos-mysql-con-netbeans
61229578 acceso-a-base-de-datos-mysql-con-netbeans61229578 acceso-a-base-de-datos-mysql-con-netbeans
61229578 acceso-a-base-de-datos-mysql-con-netbeans
epilefmtx
 
Controles Mas Habituales Leidy Cita
Controles Mas Habituales Leidy CitaControles Mas Habituales Leidy Cita
Controles Mas Habituales Leidy Cita
Rokr02
 
Ejerciciosj query
Ejerciciosj queryEjerciciosj query
Ejerciciosj query
Benjamín Joaquín Martínez
 
Formularios y contenedores
Formularios y contenedoresFormularios y contenedores
Formularios y contenedores
zeta2015
 
Form y container
Form y containerForm y container
Form y container
zeta2015
 
Formulario mdi
Formulario mdiFormulario mdi
Formulario mdi
Lic. Rolando Torres
 
Aplica los fundamentos de programacion web
Aplica los fundamentos de programacion webAplica los fundamentos de programacion web
Aplica los fundamentos de programacion web
miguel9728
 
Jasreport
JasreportJasreport
Jasreport
Vicente Alberca
 
CONEXION VISUAL STUDIO.NET - SQL SERVER
CONEXION VISUAL STUDIO.NET - SQL SERVERCONEXION VISUAL STUDIO.NET - SQL SERVER
CONEXION VISUAL STUDIO.NET - SQL SERVER
Darwin Durand
 
Jueves
JuevesJueves
Jueves
nera24mx
 
Visual y sql
Visual y sqlVisual y sql
Conectar con bases de datos
Conectar con bases de datosConectar con bases de datos
Conectar con bases de datos
Rafael Quintero
 
A toda máquina con herencia visual
A toda máquina con herencia visualA toda máquina con herencia visual
A toda máquina con herencia visual
Ignacio Monllor
 

La actualidad más candente (19)

SQL Visual Basic 6.0
SQL Visual Basic 6.0SQL Visual Basic 6.0
SQL Visual Basic 6.0
 
pasos para hacer una mini agenda en visual basic 6.0
pasos para hacer una mini agenda en visual basic 6.0pasos para hacer una mini agenda en visual basic 6.0
pasos para hacer una mini agenda en visual basic 6.0
 
CONTROLES COMUNES VISUAL BASIC
CONTROLES COMUNES VISUAL BASICCONTROLES COMUNES VISUAL BASIC
CONTROLES COMUNES VISUAL BASIC
 
20091223 Creacion De Bibliotecas Parametricas En Catia
20091223 Creacion De Bibliotecas Parametricas En Catia20091223 Creacion De Bibliotecas Parametricas En Catia
20091223 Creacion De Bibliotecas Parametricas En Catia
 
Guia no2 ado.net
Guia no2 ado.netGuia no2 ado.net
Guia no2 ado.net
 
Visual basic 2010 data por codigo
Visual basic 2010 data por codigoVisual basic 2010 data por codigo
Visual basic 2010 data por codigo
 
61229578 acceso-a-base-de-datos-mysql-con-netbeans
61229578 acceso-a-base-de-datos-mysql-con-netbeans61229578 acceso-a-base-de-datos-mysql-con-netbeans
61229578 acceso-a-base-de-datos-mysql-con-netbeans
 
Controles Mas Habituales Leidy Cita
Controles Mas Habituales Leidy CitaControles Mas Habituales Leidy Cita
Controles Mas Habituales Leidy Cita
 
Ejerciciosj query
Ejerciciosj queryEjerciciosj query
Ejerciciosj query
 
Formularios y contenedores
Formularios y contenedoresFormularios y contenedores
Formularios y contenedores
 
Form y container
Form y containerForm y container
Form y container
 
Formulario mdi
Formulario mdiFormulario mdi
Formulario mdi
 
Aplica los fundamentos de programacion web
Aplica los fundamentos de programacion webAplica los fundamentos de programacion web
Aplica los fundamentos de programacion web
 
Jasreport
JasreportJasreport
Jasreport
 
CONEXION VISUAL STUDIO.NET - SQL SERVER
CONEXION VISUAL STUDIO.NET - SQL SERVERCONEXION VISUAL STUDIO.NET - SQL SERVER
CONEXION VISUAL STUDIO.NET - SQL SERVER
 
Jueves
JuevesJueves
Jueves
 
Visual y sql
Visual y sqlVisual y sql
Visual y sql
 
Conectar con bases de datos
Conectar con bases de datosConectar con bases de datos
Conectar con bases de datos
 
A toda máquina con herencia visual
A toda máquina con herencia visualA toda máquina con herencia visual
A toda máquina con herencia visual
 

Similar a Seguridad en access

DAM-S7.pptx
DAM-S7.pptxDAM-S7.pptx
Hack x crack_sq_linjection
Hack x crack_sq_linjectionHack x crack_sq_linjection
Hack x crack_sq_linjection
Juan Jose Garcia Sanchez
 
Clase numero 6
Clase numero 6Clase numero 6
Clase numero 6
cesitar2010
 
Trabajo de programacion
Trabajo de programacionTrabajo de programacion
Trabajo de programacion
CarlosAguilera73
 
Visual basic 1º Año
Visual basic  1º AñoVisual basic  1º Año
Visual basic 1º Año
Ricardo Viqueira
 
bases de datos desde visual basic
bases de datos desde visual basicbases de datos desde visual basic
bases de datos desde visual basic
santiagomario8
 
Asp
AspAsp
Asp
adezhiz
 
Base de datos desde vb 6.0
Base de datos desde vb 6.0Base de datos desde vb 6.0
Base de datos desde vb 6.0
WendyMendez30
 
Visual basic
Visual basicVisual basic
Visual basic
rockpaisa
 
284
284284
Programación_del_lado_del_servidor......
Programación_del_lado_del_servidor......Programación_del_lado_del_servidor......
Programación_del_lado_del_servidor......
SaulSalinasNeri
 
Trabajo de tecnologia(macro)
Trabajo de tecnologia(macro)Trabajo de tecnologia(macro)
Trabajo de tecnologia(macro)
dmcbtcv
 
Ejercicio de automatizacion IntelliJ+reporte.docx
Ejercicio de automatizacion IntelliJ+reporte.docxEjercicio de automatizacion IntelliJ+reporte.docx
Ejercicio de automatizacion IntelliJ+reporte.docx
ssuser2e6b96
 
Power builder 7.0 diseno de aplicaciones
Power builder 7.0   diseno de aplicacionesPower builder 7.0   diseno de aplicaciones
Power builder 7.0 diseno de aplicaciones
David
 
Aplicación abc. asp net mvc 3
Aplicación abc. asp net mvc 3Aplicación abc. asp net mvc 3
Aplicación abc. asp net mvc 3
jose luis barrientos
 
Manual completo del manejador de base de datos Postgre SQL
Manual completo del manejador de base de datos Postgre SQLManual completo del manejador de base de datos Postgre SQL
Manual completo del manejador de base de datos Postgre SQL
Lorenzo Antonio Flores Perez
 
Microsoft Excel
Microsoft ExcelMicrosoft Excel
Microsoft Excel
dmcbtcv
 
Manual Basico De Struts
Manual Basico De StrutsManual Basico De Struts
Manual Basico De Struts
carlossanchezvillena
 
Desarrollo de Aplicaciones Web II - Sesión 03 - Formularios y Validaciones
Desarrollo de Aplicaciones Web II - Sesión 03 - Formularios y ValidacionesDesarrollo de Aplicaciones Web II - Sesión 03 - Formularios y Validaciones
Desarrollo de Aplicaciones Web II - Sesión 03 - Formularios y Validaciones
Didier Granados
 
Taller WP8 en TEC de Monterrey
Taller WP8 en TEC de MonterreyTaller WP8 en TEC de Monterrey
Taller WP8 en TEC de Monterrey
Vicente Gerardo Guzman Lucio
 

Similar a Seguridad en access (20)

DAM-S7.pptx
DAM-S7.pptxDAM-S7.pptx
DAM-S7.pptx
 
Hack x crack_sq_linjection
Hack x crack_sq_linjectionHack x crack_sq_linjection
Hack x crack_sq_linjection
 
Clase numero 6
Clase numero 6Clase numero 6
Clase numero 6
 
Trabajo de programacion
Trabajo de programacionTrabajo de programacion
Trabajo de programacion
 
Visual basic 1º Año
Visual basic  1º AñoVisual basic  1º Año
Visual basic 1º Año
 
bases de datos desde visual basic
bases de datos desde visual basicbases de datos desde visual basic
bases de datos desde visual basic
 
Asp
AspAsp
Asp
 
Base de datos desde vb 6.0
Base de datos desde vb 6.0Base de datos desde vb 6.0
Base de datos desde vb 6.0
 
Visual basic
Visual basicVisual basic
Visual basic
 
284
284284
284
 
Programación_del_lado_del_servidor......
Programación_del_lado_del_servidor......Programación_del_lado_del_servidor......
Programación_del_lado_del_servidor......
 
Trabajo de tecnologia(macro)
Trabajo de tecnologia(macro)Trabajo de tecnologia(macro)
Trabajo de tecnologia(macro)
 
Ejercicio de automatizacion IntelliJ+reporte.docx
Ejercicio de automatizacion IntelliJ+reporte.docxEjercicio de automatizacion IntelliJ+reporte.docx
Ejercicio de automatizacion IntelliJ+reporte.docx
 
Power builder 7.0 diseno de aplicaciones
Power builder 7.0   diseno de aplicacionesPower builder 7.0   diseno de aplicaciones
Power builder 7.0 diseno de aplicaciones
 
Aplicación abc. asp net mvc 3
Aplicación abc. asp net mvc 3Aplicación abc. asp net mvc 3
Aplicación abc. asp net mvc 3
 
Manual completo del manejador de base de datos Postgre SQL
Manual completo del manejador de base de datos Postgre SQLManual completo del manejador de base de datos Postgre SQL
Manual completo del manejador de base de datos Postgre SQL
 
Microsoft Excel
Microsoft ExcelMicrosoft Excel
Microsoft Excel
 
Manual Basico De Struts
Manual Basico De StrutsManual Basico De Struts
Manual Basico De Struts
 
Desarrollo de Aplicaciones Web II - Sesión 03 - Formularios y Validaciones
Desarrollo de Aplicaciones Web II - Sesión 03 - Formularios y ValidacionesDesarrollo de Aplicaciones Web II - Sesión 03 - Formularios y Validaciones
Desarrollo de Aplicaciones Web II - Sesión 03 - Formularios y Validaciones
 
Taller WP8 en TEC de Monterrey
Taller WP8 en TEC de MonterreyTaller WP8 en TEC de Monterrey
Taller WP8 en TEC de Monterrey
 

Último

EXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDAD
EXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDADEXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDAD
EXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDAD
AngelCristhianMB
 
Programming & Artificial Intelligence ebook.pdf
Programming & Artificial Intelligence ebook.pdfProgramming & Artificial Intelligence ebook.pdf
Programming & Artificial Intelligence ebook.pdf
Manuel Diaz
 
TIC en educacion.rtf.docxlolololololololo
TIC en educacion.rtf.docxlolololololololoTIC en educacion.rtf.docxlolololololololo
TIC en educacion.rtf.docxlolololololololo
KukiiSanchez
 
Manual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputoManual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputo
doctorsoluciones34
 
Presentación de Tic en educación y sobre blogger
Presentación de Tic en educación y sobre bloggerPresentación de Tic en educación y sobre blogger
Presentación de Tic en educación y sobre blogger
larapalaciosmonzon28
 
computacion global 3.pdf pARA TERCER GRADO
computacion global 3.pdf pARA TERCER GRADOcomputacion global 3.pdf pARA TERCER GRADO
computacion global 3.pdf pARA TERCER GRADO
YaniEscobar2
 
Second Life, informe de actividad del maestro Tapia
Second Life, informe de actividad del maestro TapiaSecond Life, informe de actividad del maestro Tapia
Second Life, informe de actividad del maestro Tapia
al050121024
 
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador ValenciaCatalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
AMADO SALVADOR
 
mantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptxmantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptx
MiguelAtencio10
 
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)
AbrahamCastillo42
 
Informació Projecte Iniciativa TIC HPE.pdf
Informació Projecte Iniciativa TIC HPE.pdfInformació Projecte Iniciativa TIC HPE.pdf
Informació Projecte Iniciativa TIC HPE.pdf
Festibity
 
PLAN DE MANTENMIENTO preventivo de un equipo de computo.pdf
PLAN DE MANTENMIENTO preventivo de un equipo de computo.pdfPLAN DE MANTENMIENTO preventivo de un equipo de computo.pdf
PLAN DE MANTENMIENTO preventivo de un equipo de computo.pdf
70244530
 
625204013-64-Camino-a-----La-Lectura.pdf
625204013-64-Camino-a-----La-Lectura.pdf625204013-64-Camino-a-----La-Lectura.pdf
625204013-64-Camino-a-----La-Lectura.pdf
yuberpalma
 
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
codesiret
 
Manual Web soporte y mantenimiento de equipo de computo
Manual Web soporte y mantenimiento de equipo de computoManual Web soporte y mantenimiento de equipo de computo
Manual Web soporte y mantenimiento de equipo de computo
mantenimientocarbra6
 
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
AMADO SALVADOR
 
Projecte Iniciativa TIC 2024 SOPRA STERIA. inCV.pdf
Projecte Iniciativa TIC 2024 SOPRA STERIA. inCV.pdfProjecte Iniciativa TIC 2024 SOPRA STERIA. inCV.pdf
Projecte Iniciativa TIC 2024 SOPRA STERIA. inCV.pdf
Festibity
 
Modo test refrigeradores y codigos de errores 2018 V2.pdf
Modo test refrigeradores y codigos de errores 2018 V2.pdfModo test refrigeradores y codigos de errores 2018 V2.pdf
Modo test refrigeradores y codigos de errores 2018 V2.pdf
ranierglez
 
Nuevos tiempos, nuevos espacios.docxdsdsad
Nuevos tiempos, nuevos espacios.docxdsdsadNuevos tiempos, nuevos espacios.docxdsdsad
Nuevos tiempos, nuevos espacios.docxdsdsad
larapalaciosmonzon28
 
Inteligencia Artificial
Inteligencia ArtificialInteligencia Artificial
Inteligencia Artificial
YashiraPaye
 

Último (20)

EXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDAD
EXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDADEXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDAD
EXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDAD
 
Programming & Artificial Intelligence ebook.pdf
Programming & Artificial Intelligence ebook.pdfProgramming & Artificial Intelligence ebook.pdf
Programming & Artificial Intelligence ebook.pdf
 
TIC en educacion.rtf.docxlolololololololo
TIC en educacion.rtf.docxlolololololololoTIC en educacion.rtf.docxlolololololololo
TIC en educacion.rtf.docxlolololololololo
 
Manual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputoManual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputo
 
Presentación de Tic en educación y sobre blogger
Presentación de Tic en educación y sobre bloggerPresentación de Tic en educación y sobre blogger
Presentación de Tic en educación y sobre blogger
 
computacion global 3.pdf pARA TERCER GRADO
computacion global 3.pdf pARA TERCER GRADOcomputacion global 3.pdf pARA TERCER GRADO
computacion global 3.pdf pARA TERCER GRADO
 
Second Life, informe de actividad del maestro Tapia
Second Life, informe de actividad del maestro TapiaSecond Life, informe de actividad del maestro Tapia
Second Life, informe de actividad del maestro Tapia
 
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador ValenciaCatalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
 
mantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptxmantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptx
 
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)
 
Informació Projecte Iniciativa TIC HPE.pdf
Informació Projecte Iniciativa TIC HPE.pdfInformació Projecte Iniciativa TIC HPE.pdf
Informació Projecte Iniciativa TIC HPE.pdf
 
PLAN DE MANTENMIENTO preventivo de un equipo de computo.pdf
PLAN DE MANTENMIENTO preventivo de un equipo de computo.pdfPLAN DE MANTENMIENTO preventivo de un equipo de computo.pdf
PLAN DE MANTENMIENTO preventivo de un equipo de computo.pdf
 
625204013-64-Camino-a-----La-Lectura.pdf
625204013-64-Camino-a-----La-Lectura.pdf625204013-64-Camino-a-----La-Lectura.pdf
625204013-64-Camino-a-----La-Lectura.pdf
 
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
 
Manual Web soporte y mantenimiento de equipo de computo
Manual Web soporte y mantenimiento de equipo de computoManual Web soporte y mantenimiento de equipo de computo
Manual Web soporte y mantenimiento de equipo de computo
 
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
 
Projecte Iniciativa TIC 2024 SOPRA STERIA. inCV.pdf
Projecte Iniciativa TIC 2024 SOPRA STERIA. inCV.pdfProjecte Iniciativa TIC 2024 SOPRA STERIA. inCV.pdf
Projecte Iniciativa TIC 2024 SOPRA STERIA. inCV.pdf
 
Modo test refrigeradores y codigos de errores 2018 V2.pdf
Modo test refrigeradores y codigos de errores 2018 V2.pdfModo test refrigeradores y codigos de errores 2018 V2.pdf
Modo test refrigeradores y codigos de errores 2018 V2.pdf
 
Nuevos tiempos, nuevos espacios.docxdsdsad
Nuevos tiempos, nuevos espacios.docxdsdsadNuevos tiempos, nuevos espacios.docxdsdsad
Nuevos tiempos, nuevos espacios.docxdsdsad
 
Inteligencia Artificial
Inteligencia ArtificialInteligencia Artificial
Inteligencia Artificial
 

Seguridad en access

  • 1. 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 asegurarsus bases de datos, de cómo impedirel 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 seguridadque 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 queninguna 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. MostrarObjetos 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?
  • 2. 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 funcionade 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 observartodos 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 sobreel 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 quetenemos una tabla llamada "Clientes", para aplicarlo: Application.SetHiddenAttribute acTable,"Clientes", True Para quitarlo: Application.SetHiddenAttribute acTable,"Clientes", False -Byron, ¿Como podría hacersi 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 encuentraabierto y nos genera error, _ entonces, en este parámetro le pasamos el nombrede 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...
  • 3. 'para el nombre, pasarpor alto objetos de sistema, temporales y el formulario de ejecución IfstrFormularioEjecucion < > "" 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) IfNot (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 OcultoActivado 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 decirsobre su funcionamiento porqueel nombreó título que tienen nos deja saber de que se trata cada una (Favorde 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 limitaral usuario a realizarciertas cosas, como usar solo las barras de menús ó de herramientas que nosotros hemos creado,
  • 4. podemos poner un formulario que se abra al inicio,en el cual podemos agregarun evento "Al abrir"ó "Al Cargar"donde hagamos todas las validaciones quecreamos convenientes, como la existencia de archivos necesarios, verificarfechas, 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+Qse abre la ventana del código VBA,con lo que cualquier usuario puede verel 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 vertodas 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), inicialmenteen el cuadro de diálogo de Inicio aparece"(Ninguno)", pero esto no quiere decir queeste nombreesté guardado en esta propiedad, aquí realmente lo que pasa es que esta propiedadNO existe en la base de datos. Si cambiamos este nombrepor el de algún formulario existente, lo que hace Access es que crea dicha propiedad y le agrega el nombredel formulario. Si después volvemosa 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 cambiaruna propiedadpor código primero debemos revisar por su existencia;Si encontramos que Sí existe, solo le cambiamos el valor, si encontramos que No existedebemos crearla Con el siguiente procedimiento podemos cambiarel valor de cualquier propiedad, si la propiedad no existe se creará: Sub CambiarPropiedadInicio(ByVal NombrePropiedad As String, _ ByVal TipoValor As Variant, _ ByVal NuevoValorAs 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: IfErr.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
  • 5. 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 yano 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) IfErr.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
  • 6. Set db = CurrentDb strPropiedad = "StartupForm" IfExistePropiedadInicio(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 puedeabrir 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 deseasverla 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 utilizarlapara realizar configuraciones ó validaciones iniciales, similar al formulario de inicio. Esta macro también puede sersaltada 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 observartodo el código insertado. Para evitar esto debescodificar 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, cualquierusuario 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ó descodificarla 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.
  • 7. 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 porcódigo, y de esta manera podemos tener acceso a todos sus objetos, propiedades, métodos, etc. Con la automatización podemos realizaroperaciones 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 AutomatizandoUna Base De Datos Veamos como podemos abrirlas 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 strArchivoMDBAs 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 strArchivoMDBAs 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
  • 8. 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 strArchivoMDBAs 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 strArchivoEXEAs String Dim strArchivoMDBAs 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) IfShell(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
  • 9. 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 protegertu código paraque no pueda ser leído, solo se podrá accedera él introduciendo la contraseñacorrecta 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, vea la página "Protección", allí podrás observarun check "Bloquear proyecto para visualización", actívalo. Justo abajo aparecelos 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 protegertodo tu código VBA, al aplicarlo, Access crea una copia de t u archivo actual .mdby 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 esteterminada,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 datosa .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 hacersepor: DoCmd.RunCommand acCmdMakeMDEFile Pero por código da error y no se puedeutilizar 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 confiabilidadde este tipo de seguridaddepende de que contraseña definamos,el número de caracteres que pongamos y el tipo de caracteres que utilicemos. Para establecer estacontraseñatenemos que tener abierta la base de datos en Modo Exclusivo, si lo hacemos manualmente lo haremosdesde 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
  • 10. 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 datosya 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 dondepueden entenderse mejor: Sub AbrirBD_Contraseña() 'Byron Contreras - byronlcl@gmail.com - 2009 '............................................. On Error GoTo Err_Procedimiento Dim strArchivoMDBAs String Dim strContraseñaBDAs 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 '.............................................
  • 11. On Error GoTo Err_Procedimiento Dim strArchivoMDBAs String Dim strContraseñaBDAs 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 9. Seguridad Por Usuarios 9.1 ¿Que Es? Este tipo de seguridad es la más completa y confiable que nos ofrece Access. Una base de datos cuenta con varios OBJETOS, como tablas, consultas, reportes, formularios, macros y módulos, nosotros podemos crearUSUARIOSy ponerles una contraseña de inicio, luego podemos asignarlespermisos a esos usuarios para utilizartodos los objetos mencionados o solo algunos. En la vida real no siemprenos interesa que un usuario tenga permisos completos sobre un objeto, por citar un ejemplo, a veces necesitamos que un usuario pueda verun reporte y que pueda imprimirlo, pero no queremos quepueda hacercambiosen el diseño. La se guridad por usuarios nos permite eso, definir permisos específicos para cada objeto. Los diferentes objetos tienen varios niveles de permisos, quevarían según sea el objeto. Veamos una tabla, a esta se le pueden definir los siguientes permisos: -Leer datos (Abrirla tabla y leer los datos) -Insertar datos (crearnuevos registros) -Modificar datos -Eliminar datos (eliminar registros) -Leer definiciones (ver la tabla en vista de diseño) -Modificar definiciones (agregar, modificar y eliminar campos, crear índices, etc.en la vista de diseño) -Leer información de permisos -Modificar permisos A un usuario se le puede asignar solo un permiso de estos, varios permisos ó todos los permisos. La seguridad por usuarios te permite tener a tus usuarios definidos exactamentecomo los necesitas,a lo mejor quieres que la secretaria lea los datos de las facturas de compra, pero no necesitas que realice cambios en los datos, ni mucho menos que los elimine. 9.2 ¿Cómo Funciona?
  • 12. Para entenderlo debemos comprendercomo funciona Access, queaunque algunos no sabían, trabaja todo el tiempo con Seguridad por usuarios. Cada vez que la aplicación de Access inicia, lo primero que hace es consultar un archivo exterior de extensión .mdw, en este archivo se encuentran guardados los nombres de usuarios y contraseñas,a este archivo se le llama GRUPO DE TRABAJO. Access solamente inicia con un nombrede usuario y contraseña correctos, los cuales valida en el Grupo de trabajo (archivo exterior .mdw), luego, Access se queda conectado al Grupo de trabajo y cada vez que intentamos realizar cualquieroperación como abrir un objeto, modificardatos, etc. Access consulta si tenemos los permisos necesarios para realizar tal operación,si no tenemos el permiso lógicamente no nos deja realizar la operación y nos informa. -Byron, tu dices que Access trabaja todo el tiempo con Seguridad por usuarios, pero a mi nunca me a pedido un nombre de usuario y contraseña... Te doy detalles del porque: Cuando abres por primera vez Access, se crea un archivo de Grupo de trabajo llamado "System.mdw", este grupo de trabajo es el que usa Access predeterminadamente,cada basede datos que has creado se conecta a él. Este archivo de grupo de trabajo contiene dos usuarios: -Admin (Administrador) -User (Usuario) Estos usuarios contienen permisos totales sobretoda la base de datos, estos usuarios además están definidos sin contraseña, es decir, con una cadena vacía "". Cuando Access inicia,predeterminadamente se conecta al grupo de trabajo "System.mdw"y te ingresa predeterminadamentecon el usuario "Admin"(Administrador), que como no tiene una contraseña definida, ingresalibremente y no se detiene. La verdades que el grupo de trabajo Sí preguntó porUsuario y contraseña, pero Access le ingreso el usuario "Admin"y de contraseña una cadena vacía. Mientras estas usando normalmentetu base de datos tampoco te das cuenta de que se están manejando validaciones de permisos sobrelos objetos, esto es porquecomo dijimos antes,estas ingresado con el usuario Admin,el cual tiene permisos totales y nunca encuentra restricciones. Hagamos unas pruebas para corroborarlo dicho, vamos a la ventana VBA de Access, abramos la ventana de inmediato (Ctrl+G) y escribamos esto (Copia y pega): Debug.Print "Mi archivo de grupo de trabajo actual es:"& Syscmd(acSysCmdGetWorkgroupFile) Y presiona Enter, te saldrá el nombre del archivo de grupo de trabajo que estas utilizando. Ahora escribe esto: Debug.Print "Mi usuario actual es:"& CurrentUser() Y presiona Enter, se mostrará el nombre del usuario actual con el que estas trabajando, con el que Access te ha ingresado a la base de datos. Ahora que ya tienes una idea general sobre la seguridad porusuarios, entremos en conceptos... 9.3 ¿Qué Son Los Usuarios y Los Grupos De Usuarios? Un usuario es una persona individual definida en el grupo de trabajo, al ingresardebe proporcionar su nombre de usuario y una contraseña, esta persona tendrá ciertos permisos para utilizar objetos, estos permisos han sido agregados con anticipación poralgún Administrador de seguridad de la base de datos. La asignación de permisospara un usuario puede ser muy delicada, recordemos que hay que especificarlepermisos para cadaobjeto existente, y para cada objeto existen varios permisos, los cuales varían según sea el tipo de objeto. Para ahorrar este trabajo se crearon los GRUPOS DE USUARIOS (simplementelos llamaremos GRUPOS), tu puedes crearun nuevo Grupo y asignarleun nombre, luego le puedes asignar permisos de la misma manera que lo harías con un usuario,la ventaja es que cuando yatienes un grupo bien definido,al grupo le puedes agregar/ingresar usuarios y estos heredan automáticamentetodos los permisos del grupo, luego puedes agregar, modificar ó eliminar permisos a dicho grupo y los cambios se reflejan también en los usuarios. Para citar un ejemplo, puedes crearun grupo llamado "Ventas"que tenga todos los permisos para darle seguimiento a marketing, cotizaciones, pedidos y facturas. Cuando se contrate a una
  • 13. nueva persona para el área de ventas, solo le creas un usuario en el sistema,lo agregas al grupo "Ventas" y ya estará listo para trabajar, sin tener que estar definiendo cada vez los mismos pasos de asignación de permisos. Luego probablemente te interesecrear otro grupo llamado "V endedores", "Compradores", "Supervisores", etc. Hay que tomar nota que un usuario puede pertenecer a varios Grupos Aunque un usuario pertenezca a uno o a varios grupos, también puedes definirle permisos extras. 9.4 Algo Más... Ahora que ya sabes lo que son los Grupos, te cuento queel grupo de trabajo "System.mdw" (predeterminado) también tiene dos grupos incluidos: -Users -Admins El usuario User está incluido en el grupo Users El usuario Adminsestá incluido en el grupo Admins El grupo Admins tiene permisoscompletos sobre toda la base de datos -íAhora si te he entendido Byron,entonces el usuario Admin es el de mayorjerarquía porque tiene todos los permisos y porque esta incluido en el grupo Admins! Siento decirte queno, el usuario "Admin"no es el que tiene mayor jerarquía. Revisemos como esta funcionando Access, hagamos estas pruebas: Crea una nueva base de datos, ponlecualquier nombre(porquenos servirá solo para pruebas) Esta nueva base de datos no tiene ningún objeto porque no hemos creado nada, pero vamos a las tablas y verás que ya hay tablas creadas,si no puedes verlasve al menu: Herramientas/Opciones/Pestaña Ver/Activarcasilla"Objetos de Sistema" El nombre de todas estas tablas comienza por "Msys..." Ahora, si el usuario "Admin"(con el que estas ingresado) tiene todos los permisos de la base de datos no deberías tener ningún problema en tratar de modificaró eliminar estas tablas.Haz la prueba, intentaeliminar cualquiera de estas tablas (seleccionala tabla y pulsa la tecla Supr)... Exacto, nos da un mensaje que diceque no tenemos permiso para eliminar la tabla, pero, ¿Quién tiene este permiso?, hagamos otra comprobación;Dale un clic secundario a cualquiera de estas tablas, en el menú desplegado escojamos la opción "Propiedades", allí veamos quien es el propietario,a mi me sale que es un usuario llamado "Engine". Veamos otra cosa, entre estas tablas existe una llamada "MSysAccessObjects", repitamos los pasos para ver quién es el propietario, a mi me sale "Admin" ("Administrador") ó sea nosotros en este momento. Si somos los propietarios entonces seguramente podemos hacer lo que queramos con esa tabla,pero no es cierto, si la abrimos para leer los datos no tenemos ningún problema, pero si intentamos eliminarla nos dice que no tenemo s permiso (haz la prueba).Esto quiere decirque un usuario mayornos puso como propietarios de esta tabla, nos dio permiso de lectura y nos quitó el permiso para eliminarla. Sigamos con las pruebas: No te preocupes si no entiendes el código a continuación, adelante lo veremos más a detalle. Ahora, en un Módulo nuevo escribe este procedimiento (copia y pega): Sub ListarUsuarios() Dim usr As DAO.User For Each usr In DBEngine.Workspaces(0).Users Debug.Print usr.Name Next usr End Sub Ve a la Ventana Inmendiato (si no esta abierta presiona Ctrl+G), escribe lo siguiente: ListarUsuarios Y presiona Enter, se escribirán los usuarios quetiene la base de datos,a mí me sale: - Admin - Creator - Engine
  • 14. El usuario Admin somos nosotros,los otros dos usuarios, Creatory Engine le pertenecen a Access y no podemos hacer nada con ellos, ni modificarlos ni eliminarlos. Hay que mencionar también que los usuarios Admin y User no pueden ser eliminados. Si quieres ver los grupos predeterminados,escribe este nuevo procedimiento: Sub ListarGrupos() Dim grp As DAO.Group For Each grp In DBEngine.Workspaces(0).Groups Debug.Print grp.Name Next grp End Sub En la ventana de inmediato escribimos: ListarGrupos Y hacemos Enter, se nos lista los grupos de usuarios existentes, a mí me sale: Admins Users Estos dos grupos son predeterminados y tampoco se pueden eliminar.Del grupo Admins ya hemos hablado. Cuando creas un nuevo usuario manualmente, este automáticamentequeda ingresado en el grupo de Users (Usuarios),si quieres que este usuario esté también en el grupo de Administradores tendrás que ingresarlo en un paso siguiente 9.5 Activar La Seguridad Por Usuarios A Una Base De Datos Como mencionamos antes, Access trabaja siempre con la seguridad por usuarios, quese encuentra en un Grupo de trabajo que es un archivo externo llamado "System.mdw", cada base de datos nueva que creemos se conecta a este archivo. Si nosotros necesitamos agregarle a una base de datos la seguridad por usuarios, en realidad lo que hacemos es crear un nuevo Grupo de trabajo (un archivo .mdw), luego necesitamos decirle a Access que para abrir esta BD lo haga a través de este nuevo grupo de trabajo. Para realizar este proceso, lo más fácil es hacerlo porel asistente, que se encuentra en el menú: Herramientas/Seguridad/Asistente para seguridad por usuarios... Allí seguimos todos los pasos del asistente leyendo detenidamente cada paso hasta finalizar. Cuando se termina este proceso,Access nos da un informe de cómo quedaron las cosas y nos permite guardar la información en otro lugarpara que pueda servirnos más adelante. Todo este proceso lo que hacees: -Crear un nuevo grupo de trabajo, un archivo .mdw -Obliga a crear un nuevo usuario en el grupo de Administradores -Al usuario Admin se le quitan todos los permisos -Al usuario Admin se le coloca una contraseña Con esto se logra que al iniciar Access nos lance la pantalla de ingreso donde pide usuario y contraseña, porque como vimosanteriormente, Access inicialmente intenta ingresar con un el usuario Admin y con una contraseña vacía,la cual encuentra que no coincide(porque ahora hay una contraseña) y nos lanza la pantalla de ingreso -El usuario "Admin"es sacado del grupo de "Admins" Esto es porque el grupo Admins siempremantiene los permisos completos -A los objetos existentes se les cambia de propietario, se les pone el nuevo usuario administrador ingresado en el proceso 9.6 Programando A este punto debes tener entendido todo lo dicho anteriormente sobrecomo funciona la seguridad por usuarios, si tienes dudas por favor vuelve a leer desde el principio y cuando todo esté claro continuas
  • 15. Bueno, aquí viene lo bonito ya que empezaremos a ver todo lo dicho anteriormente pero con código. IMPORTANTE No trabajes los usuarios y grupos de usuarios sobre el grupo de trabajo predeterminado de Access "System.mdw", porque si haces cambios, este se reflejará sobre todas las bases de datos que tienes y las nuevas que crees. Crea una base de datos nueva, agrégale un nuevo grupo de trabajo como se especifica en el punto anterior "AgregarLa Seguridad Por Usuarios A Una Base De Datos", y así solo esa base de datos estará protegida. En este artículo intento dar las explicaciones de cómo se realizan las operaciones manualmente y con código. Si eres nuevo en este tema (seguridad porusuarios), te aconsejo que vallas aprendiendo de cómo se realizan las cosas solo manualmente, porqueel código puede confundirte. Solo cuando ya tengas experiencia manejando las cosas manualmente empieza el aprendizaje del código Programando... Microsoft Access trabaja la totalidad de operaciones de seguridad a través de dos conjuntos: - Grupos de trabajo, Grupos, Usuarios y Contraseñas - Objetos de la base de datos y permisos Estos conjuntos se operan de manera diferente, y los detallamos a continuación 9.7 Grupos de trabajo,Grupos,Usuarios y Contraseñas Para administrar manualmentelos Grupos,Usuarios y contraseñas puedes ir al menú: Herramientas/Seguridad/Cuentas de usuario y de grupo... Pero nuestra intención es automatizarlo, así que este conjunto lo podemos trabajar con el objeto Application.DBEngine. Veamos como podemos establecer referencias a los objetos, para hacer referencia al grupo de trabajo actual tenemos: Dim ws As DAO.Workspace Set ws = DBEngine.Workspaces(0) Para hacer referencia a un usuario: Dim ws As DAO.Workspace Dim usr As DAO.User Set ws = DBEngine.Workspaces(0) Set usr = ws.Users("NombreUsuario") Para hacer referencia a un grupo: Dim ws As DAO.Workspace Dim grp As DAO.Group Set ws = DBEngine.Workspaces(0) Set grp = ws.Groups("NombreGrupo") Para hacer referencia a los usuarios quepertenecen a un grupo: Dim ws As DAO.Workspace Dim usrs As DAO.Users Set ws = DBEngine.Workspaces(0) Set usrs = ws.Groups("NombreGrupo").Users Para hacer referencia a los grupos a los cuales perteneceun usuario: Dim ws As DAO.Workspace Dim grps As DAO.Groups Set ws = DBEngine.Workspaces(0) Set grps = ws.Users("NombreUsuario").Groups
  • 16. Conociendo esta lógica, ahora podemos entenderlos procedimientos siguientes: Listar los usuarios del sistema: Sub ListarUsuarios() 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. Dim usr As DAO.User For Each usr In DBEngine.Workspaces(0).Users Debug.Print usr.Name Next usr End Sub Listar los grupos del sistema: Sub ListarGrupos() 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. Dim grp As DAO.Group For Each grp In DBEngine.Workspaces(0).Groups Debug.Print grp.Name Next grp End Sub Listar los usuarios que pertenecen a un grupo: Sub ListarUsuariosEnGrupo(ByVal strGrupo As String) 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. Dim usr As DAO.User For Each usr In DBEngine.Workspaces(0).Groups(strGrupo).Users Debug.Print usr.Name Next usr End Sub Lista de grupos a los cuales pertenece un usuario: Sub ListarGruposDeUsuario(ByVal strUsuario As String) 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. Dim grp As DAO.Group For Each grp In DBEngine.Workspaces(0).Users(strUsuario).Groups Debug.Print grp.Name Next grp End Sub Crear un usuario: Sub CrearUsuario(ByVal strNombreUsuario As String, _ ByVal strIdUsuario As String, _ Optional ByVal strContraseña As String = "") 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. Dim usr As DAO.User With DBEngine.Workspaces(0) Set usr = .CreateUser(strNombreUsuario, strIdUsuario, strContraseña) .Users.Appendusr .Users.Refresh 'agregarlo al grupo Users With .Groups("Users") Set usr = .CreateUser(strNombreUsuario)
  • 17. .Users.Append usr .Users.Refresh End With End With Set usr = Nothing End Sub Crear un grupo: Sub CrearGrupo(ByVal strNombreGrupo As String, ByVal strIdGrupo As String) 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. Dim grp As DAO.Group With DBEngine.Workspaces(0) Set grp = .CreateGroup(strNombreGrupo, strIdGrupo) .Groups.Append grp .Groups.Refresh End With Set grp = Nothing End Sub Agregar un usuario a un grupo: Sub AgregarUsuario_a_Grupo(ByVal strUsuario As String,ByVal strGrupo As String) 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. Dim usr As DAO.User With DBEngine.Workspaces(0).Groups(strGrupo) Set usr = .CreateUser(strUsuario) .Users.Appendusr .Users.Refresh End With End Sub Eliminar un usuario definitivamente: Sub EliminarUsuario(ByVal strUsuario As String) 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. DBEngine.Workspaces(0).Users.Delete strUsuario End Sub Eliminar un grupo definitivamente: Sub EliminarGrupo(ByVal strGrupo As String) 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. DBEngine.Workspaces(0).Groups.Delete strGrupo End Sub Eliminar a un usuario de un grupo: Sub EliminarUsuario_de_Grupo(ByVal strUsuario As String, ByVal strGrupo As String) 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. DBEngine.Workspaces(0).Groups(strGrupo).Users.Delete strUsuario End Sub Cambiar la contraseña para un usuario: Sub CambiarContraseña(ByVal strUsuario As String, _
  • 18. ByVal strContraseñaAnterior As String, _ ByVal strContraseñaNueva As String) 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. With DBEngine.Workspaces(0) .Users(strUsuario).NewPassword strContraseñaAnterior, strContraseñaNueva End With End Sub Determinar si existe un usuario: Function ExisteUsuario(ByVal strUsuario As String) As Boolean 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. Dim usr As DAO.User On Error Resume Next Set usr = DBEngine.Workspaces(0).Users(strUsuario) IfErr.Number = 0 Then ExisteUsuario = True Else Err.Clear End If Set usr = Nothing End Function Determinar si existe un grupo: Function ExisteGrupo(ByVal strGrupo As String) As Boolean 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. Dim grp As DAO.Group On Error Resume Next Set grp = DBEngine.Workspaces(0).Groups(strGrupo) IfErr.Number = 0 Then ExisteGrupo = True Else Err.Clear End If Set grp = Nothing End Function Determinar si un usuario pertenece a un grupo: Function ExisteUsuarioEnGrupo(ByVal strGrupo As String, ByVal strUsuario As String) As Bool ean 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. Dim usr As DAO.User On Error Resume Next Set usr = DBEngine.Workspaces(0).Groups(strGrupo).Users(strUsuario) IfErr.Number = 0 Then ExisteUsuarioEnGrupo = True Else Err.Clear End If Set usr = Nothing End Function 9.8 Objetos De La Base De Datos Y Permisos Para administrar manualmentelos permisos de los objetos puedes ir al menú:
  • 19. Herramientas/Seguridad/Permisos de usuario y de grupo... Para automatizar los permisos de la base de datos podemos trabajara través de dos métodos; ADOX y DAO. ADOX tiene la desventaja que falla a la hora de trabajar con reportes, formularios, macros y módulos, ADOXesta bien para trabajar otro tipo de bases de datos, las cuales no incluyen estos objetos.Por esta razón dejaremos ADOX por un lado y solo no s enfocaremos en DAO. DAO nos ofrece la siguiente jerarquía de objetos: Container > Document > Permission Que más o menos quieren decir: Container:Colección de objetos por tipo (Tablas, consultas,reportes, macros ó módulos) Ducument:Objeto específico (tabla,consulta, reporte, formulario, macro ó módulo) Permission:Permisos para el objeto específico Podemos accedera estos elementos bajo el objeto "base de datos", que es fácil de describir porque trabajamos con el a menudo: Dim db As DAO.Database Set db = Application.CurrentDb Veamos los objetos más a detalle: Container (Colección de objetos de un tipo específico) Se refiere a la colección completa de un tipo específico. Entre los Containers tenemos: - Tables (Tablas y Consultas) - Forms (Formularios) - Reports (Reportes) - DataAccessPages (Páginas de datos) - Scripts (Macros) - Modules (Módulos) - Databases (Bases de datos del grupo de trabajo) También existen otros Containers que no usamos mucho: - Relationships (Relaciones) - SysRel (Relaciones del sistema) Document (Objeto específico) Se refiere a un objeto como una tabla, consulta, reporte, formulario, etc. Si tomamos por ejemplo la tabla "Clientes", esta es un Document que se encuentra dentro del Container "Tables" Permission (Permiso) Los permisos son un valorde tipo Entero Largo (Long), en el cual podemos leer, asignar, modificar ó eliminar valores de permisos. Veamos algo de código sobre lo que hemos explicado hasta ahora: Imaginemos quetenemos al usuario "Byron Contreras"y queremos obtenerlos permisos que tiene sobre la tabla "Clientes" Dim db As DAO.Database Dim cont As DAO.Container Dim doc As DAO.Document Dim lngPermisos as Long 'Base de datos Set db = CurrentDB 'Container (colección a la que perteneceel objeto que nos interesa) Set cont = db.Containers("Tables") 'Document (Objeto específico) Set doc = cont.Documents("Clientes") 'Usuario sobre el que se hará la consulta doc.UserName= "Byron Contreras" 'Permisos
  • 20. lngPermisos = doc.Permissions En este momento, en la variable "lngPermisos"se encuentra un valorque representa a todos los permisos que se tienen sobreel objeto. 9.9 Permisos Específicos Los permisos que se pueden leer, asignar ó eliminar varían dependiendo del objeto. Entre las constantes de permisos, para los diferentes objetos tenemos: Constante:Valor:Container(Aplica a):Permiso para: dbSecDBCreate 1 Base de datos Crear nuevas bases de datos dbSecDBAdmin 8 Base de datos Replicaro cambiar contraseña dbSecDBOpen 2 Base de datos Abrir dbSecDBExclusive 4 Base de datos Abriren modo exclusivo dbSecReadDef4 Tablas y Consultas Leer definiciones dbSecWriteDef65548 Tablas y Consultas Editar/modificar/actualizary eliminar definiciones dbSecRetrieveData 20 Tablas y ConsultasLeer datos dbSecInsertData 32 Tablas y Consultas Insertardatos dbSecReplaceData 64 Tablas y Consultas Editar/modificar/actualizar datos dbSecDeleteData 128 Tablas y Consultas Eliminar datos acSecFrmRptExecute256 Formularios y Reportes Abrir acSecFrmRptReadDef4 Formularios y Reportes Leerel diseño acSecFrmRptWriteDef65548 Formularios y Reportes Modificarel diseño acSecMacExecute 8 Macros Ejecutar acSecMacReadDef10 Macros Leer el diseño acSecMacWriteDef65542Macros Modificar acSecModReadDef2 Módulos Leer acSecModWriteDef65542Módulos Editar dbSecNoAccess 0 TodosNingún permiso dbSecFullAccess 1048575 Todos Permisos completos(Administrar) dbSecCreate 1 Todos Crear nuevos objetos dbSecDelete 65536 Todos Eliminar dbSecReadSec 131072 Todos Leer información de seguridad (permisos) dbSecWriteSec 262144 Todos Editar/modificar/actualizar información de seguridad (permisos) dbSecWriteOwner 524288 Todos Cambiar el propietario del objeto En realidad los permisos son un valortipo BitMask, en el cual tenemos que realizar comparaciones con los operadores AND, OR, AND NOT para obtener los resultados que deseamos, por ejemplo: En el código anteriorse puede observar como obtenerel valor de permisos que contiene un Document, este valor lo encontramos en: doc.Permissions Para revisar si hay un permiso específico: If (doc.Permissions ANDdbSecRetrieveData) Then Msgbox "Si hay permiso para leer datos" End if Para asignar un permiso: doc.Permissions = doc.Permissions OR dbSecInsertData Para eliminar un permiso: con.Permissions = con.Permissions ANDNOT dbSecDeleteData Veamos esteejemplo completo:
  • 21. Imaginemos quetenemos al usuario "Byron Contreras", y queremos sabersi tiene el permiso de "Insertar datos"en la tabla "Clientes", si no tiene el permiso se lo asignamos. Al final también le quitaremos el permiso de eliminar datos de la misma tabla Dim db As DAO.Database Dim cont As DAO.Container Dim doc As DAO.Document 'Base de datos Set db = CurrentDB 'Container (colección a la que perteneceel objeto que nos interesa) Set cont = db.Containers("Tables") 'Document (Objeto específico) Set doc = cont.Documents("Clientes") 'Usuario sobre el que se hará la consulta doc.UserName= "Byron Contreras" '¿Tiene Permiso? 'verificamos el valorBitMask de permisos con el valorespecífico del permiso If(doc.Permissions ANDdbSecInsertData) then Msgbox "Si hay permiso para leer datos" Else 'aquí entramos porqueno hay permiso, entonces se lo asignamos doc.permissions= doc.permissions OR dbSecInsertData End If 'Quitarle el permiso para eliminar datos doc.permissions = doc.permissions ANDNOT dbSecDeleteData set doc = Nothing set cont = Nothing set db = Nothing 9.10 Casos Especiales De Permisos Objetos Nuevos: Existe un tipo de permiso para poder crear objetos nuevos, aquí no tenemos un nombre de Document. Para verificar estepermiso lo hacemos directamente sobre el Container. Revisemos si el usuario "Byron Contreras"tiene permiso de crearnuevas tablas: Dim db As DAO.Database Dim cont As DAO.Container 'Base de datos Set db = CurrentDB 'Contenedor (colección a la que pertenece el objeto quenos interesa) Set cont = db.Containers("Tables") 'Usuario sobre el que se hará la consulta cont.UserName = "Byron Contreras" '¿Tiene Permiso? 'verificamos el valorBitMask de permisos con el valorespecífico del permiso Ifcont.Permissions ANDdbSecCreate then Msgbox "Si existen permisos para creartablas nuevas" End If set cont = Nothing set db = Nothing Permisos Sobre La Base De Datos: Cuando revisamos permisos para la Base de datos, el nombredel Document siempre se llama "Msysdb". Revisemos si el usuario "Byron Contreras"tiene permiso de abrirla base de datos: Dim db As DAO.Database Dim cont As DAO.Container Dim doc As DAO.Document 'Base de datos
  • 22. Set db = CurrentDB 'Contenedor (colección a la que pertenece el objeto quenos interesa) Set cont = db.Containers("Databases") 'Documento (Objeto específico) Set doc = cont.Documents("Msysdb") 'Usuario sobre el que se hará la consulta doc.UserName= "Byron Contreras" '¿Tiene Permiso? 'verificamos el valorBitMask de permisos con el valorespecífico del permiso Ifdoc.Permissions ANDdbSecDBOpen then MsgBox "Si tienes permiso para abrir la base de datos" End If set doc = Nothing set cont = Nothing set db = Nothing 9.11 Verificar Si Un Usuario T iene Un Permiso (Para verificarun permiso específico favor de ir atrás al inciso 9.9 Permisos Específicos) Nosotros podemos revisar si un usuario tiene algún permiso específico sobre un objeto y obtener que NO existen permisos, pero podría ser queel usuario SI tenga el permiso porque estese podría estar heredando. Un usuario puede tener permiso sobre un objeto porvarias razones: - El usuario tiene permisos dados sobre el objeto - El usuario pertenecea un grupo, este grupo tienepermisos sobre el objeto y el usuario está heredando los permisos del grupo - El usuario es el propietario del objeto (creador) Para conocer si un usuario tiene un permiso, no importando de dondevenga podemos consultar la propiedad "AllPermissions"del Document: Dim db As DAO.Database Dim cont As DAO.Container Dim doc As DAO.Document 'Base de datos Set db = CurrentDb 'Contenedor (colección a la que pertenece el objeto quenos interesa) Set cont = db.Containers("Databases") 'Documento (Objeto específico) Set doc = cont.Documents("Msysdb") 'Usuario sobre el que se hará la consulta doc.UserName= "Byron Contreras" '¿Tiene Permiso? 'verificamos el valorBitMask de permisos con el valorespecífico del permiso Ifdoc.AllPermissions AnddbSecDBOpen Then MsgBox "Si tienes permiso para abrir la base de datos" End If Set doc = Nothing Set cont = Nothing Set db = Nothing Aquí sabemos si realmenteexisteel permisos para el usuario,auque no sabemos si viene por permiso directo al usuario, si vienede algún grupo ó por serel propietario 9.12 Propietario De Los Objetos (Owner) Todos los objetos tienen un propietario, que es el nombredel usuario que los ha creado. El propietario del objeto predeterminadamente tienetodos los permisos sobre el objeto. También es posible cambiarde propietario a los objetos. Veamos un ejemplo de como conocerquién es el propietario (Owner) de un objeto: Queremos conoceral dueño de la tabla "Clientes":
  • 23. Dim db As DAO.Database Dim cont As DAO.Container Dim doc As DAO.Document Dim strDueño As String Set db = CurrentDb Set cont = db.Containers("Tables") Set doc = cont.Documents("Clientes") strDueño = doc.Owner MsgBox "El dueño de la tabla Clientes es:" & strDueño Set doc = Nothing Set cont = Nothing Set db = Nothing 9.13 Funciones útiles íFelicitaciones! En este punto ya sabes como operar los permisos, y como ya te aprendistetodo muy bien, ya podemos empezara simplificar el código y crear nuestros procedimientos: Function ExistePermisoEnObjeto(ByVal strContainer, _ ByVal strDocumentAs String, _ ByVal strUsuarioGrupo As String, _ ByVal lngPermiso As Long) As Boolean 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. Dim db As DAO.Database Set db = CurrentDb With db.Containers(strContainer).Documents(strDocument) .UserName = strUsuarioGrupo If (.Permissions And lngPermiso) Then ExistePermisoEnObjeto = True End With Set db = Nothing End Function Function ExistePermisoCrearObjetos(ByVal strContainer,_ ByVal strUsuarioGrupo As String) As Boolean 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. Dim db As DAO.Database Set db = CurrentDb With db.Containers(strContainer) .UserName = strUsuarioGrupo If (.Permissions And dbSecCreate) Then ExistePermisoCrearObjetos = True End With Set db = Nothing End Function Sub AgregarPermisoEnObjeto(ByVal strContainer, _ ByVal strDocumentAs String, _ ByVal strUsuarioGrupo As String, _ ByVal lngPermiso As PermissionEnum) 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. Dim db As DAO.Database Set db = CurrentDb With db.Containers(strContainer).Documents(strDocument) .UserName = strUsuarioGrupo .Permissions = .Permissions Or lngPermiso End With Set db = Nothing
  • 24. End Sub Sub PermitirCrearObjetosNuevos(ByVal strContainer, _ ByVal strUsuarioGrupo As String, _ ByVal Permitir As Boolean) 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. Dim db As DAO.Database Set db = CurrentDb With db.Containers(strContainer) .UserName = strUsuarioGrupo If Permitir Then .Permissions = .Permissions Or dbSecCreate Else .Permissions = .Permissions And Not dbSecCreate End If End With Set db = Nothing End Sub Sub EliminarPermisoEnObjeto(ByVal strContainer, _ ByVal strDocument As String, _ ByVal strUsuarioGrupo As String, _ ByVal lngPermiso As PermissionEnum) 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. Dim db As DAO.Database Set db = CurrentDb With db.Containers(strContainer).Documents(strDocument) .UserName = strUsuarioGrupo .Permissions = .Permissions AndNot lngPermiso End With Set db = Nothing End Sub Function ObtenerPropietarioObjeto(ByVal strContainer, _ ByVal strDocument As String) As String 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. Dim db As DAO.Database Set db = CurrentDb ObtenerPropietarioObjeto = db.Containers(strContainer).Documents(strDocument).Owner Set db = Nothing End Function Sub CambiarPropietarioObjeto(ByVal strContainer, _ ByVal strDocument As String, _ ByVal strUsuario As String) 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. Dim db As DAO.Database Set db = CurrentDb db.Containers(strContainer).Documents(strDocument).Owner = strUsuario Set db = Nothing End Sub Sub QuitarTodosLosPermisos(ByVal strUsuarioGrupo As String) 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. Dim db As DAO.Database Dim cont As DAO.Container
  • 25. Dim doc As DAO.Document On Error Resume Next Set db = CurrentDb For Each cont In db.Containers 'permisos en los objetos For Each doc In cont.Documents doc.UserName = strUsuarioGrupo doc.Permissions = dbSecNoAccess Next doc 'permisos para objetos nuevos cont.UserName = strUsuarioGrupo cont.Permissions = dbSecNoAccess Next cont Set db = Nothing End Sub Sub AsignarTodosLosPermisos(ByVal strUsuarioGrupo As String) 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. Dim db As DAO.Database Dim cont As DAO.Container Dim doc As DAO.Document On Error Resume Next For Each cont In db.Containers 'permisos para objetos nuevos cont.UserName = strUsuarioGrupo cont.Permissions = dbSecFullAccess 'permisos en los objetos For Each doc In cont.Documents doc.UserName = strUsuarioGrupo doc.Permissions = dbSecFullAccess Next doc Next cont Set db = Nothing End Sub 9.14 ¿Cómo Puedo Abrir Una Base De Datos Definida Con Seguridad Por Usuarios? Eso depende que quieras hacercon la base de datos, puedes tener dos intenciones: - Acceder a los datos (tablas y consultas) - Automatizar la base de datos, es decir, tener acceso también a los objetos como reportes, formularios, macros, módulos, barras de herramientas, etc. Abrir Base De Datos Y AccederA Los Datos (Tablas Y Consultas) Puedes usar el siguiente procedimiento: Sub DAO_AbrirBaseDatosSegura() 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. On Error GoTo Err_Procedimiento Dim strArchivoMDBAs String Dim strContraseñaBDAs String Dim dbe As DAO.DBEngine Dim db As DAO.Database 'Definir datos de apertura... strArchivoMDB = "Archivo de base de datos .mdb" strContraseñaBD= "Contraseña de la base de datos" 'Crear una nueva instancia del objeto DBEngine (Motor de base de datos Microsoft Jet) Set dbe = New DAO.DBEngine
  • 26. dbe.SystemDB= "Ruta completa archivo de grupo de trabajo .mdw" dbe.DefaultUser= "Nombre del usuario" dbe.DefaultPassword = "Contraseña del usuario" 'abrir la base de datos Set db = dbe.OpenDatabase(strArchivoMDB, False, False, "MS Access;PWD=" & strContraseñaBD) MsgBox "Base de datos abierta:"& vbCrLf& db.Name, _ vbInformation, _ "Operación exitosa!" db.Close Salir_Procedimiento: Set db = Nothing Set dbe = Nothing Exit Sub Err_Procedimiento: MsgBox Err.Description,vbCritical, "Error número "& Err.Number Resume Salir_Procedimiento End Sub Abrir Base De Datos Y Automatizarla Puedes usar el siguiente procedimiento: Sub Shell_AbrirBaseDatosSegura() 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. 'Procedimiento que abre una base de datos definida con Seguridad Por Usuarios _ y devuelve el objeto Application parapoder automatizarlo 'El procedimiento no funciona si existe contraseña de base de datos On Error GoTo Err_Procedimiento Dim strArchivoEXEAs String Dim strArchivoMDBAs String Dim strArchivoMDWAs String Dim strUsuario As String Dim strContraseña 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 = "Archivo de base de datos .mdb" strArchivoMDW = "Archivo de grupo de trabajo .mdw" strUsuario = "Nombre de usuario" strContraseña = "Contraseña del usuario" 'Construir la cadena para la función Shell strShell = """" & strArchivoEXE& """" & " " & _ """" & strArchivoMDB& """" & " " & _ "/User " & strUsuario &" " & _ "/Pwd " & strContraseña &" " & _ "/NoStartup " & _ "/Wrkgrp " & """" & strArchivoMDW& """" 'Si la función Shell tiene éxito tomamos el archivo/objeto(aplicación Access) IfShell(strShell, vbHide) Then
  • 27. '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 "Proyecto abierto:"& aplAccess.CurrentProject.Name, _ vbInformation, _ "Operación exitosa!" 'Acceso a datos: 'aplAccess.CurrentDB... 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 9.15 ¿Cómo valida Access los permisos? Cuando creas un usuario nuevo, tienes que asignarleun ID. Este ID queda guardado en ambos archivos, en el Grupo de trabajo y en tu base de datos,este IDes el que realmente cuenta todo el tiempo. Cuando ingresas a la base de datos proporcionas un nombrede usuario y contraseña,con estos datos Access recupera el IDdel usuario internamente, luego va al archivo de grupo de trabajo y revisa si el nombre del usuario y el IDcorresponden, de allí Access determinará si eres un usuario válido ó no. Esto es lógico, porque imagínate que en tu base de datos tienes un usuario llamado "Byron Contreras"con su respectiva contraseña, este usuario tiene permisos completos sobretodo. Alguien podríaintentarcrear un nuevo grupo de trabajo y agregarun usuario llamado también "Byron Contreras"y que no tenga contraseña,luego puede intentarabrir la base de datos mencionadacon estenuevo grupo de trabajo,esperando poder entrarcon el usuario "Byron Contreras"y sin contraseña. Esto no es posible porque al crear el usuario en ambos grupos de trabajo se les asignó un ID diferente, y por lo tanto no hay permiso de ingreso. Si alguien conociera el IDcon el que "Byron Contreras"fue ingresado en el grupo de trabajo original, si le funcionaría el truco, porqueen el nuevo grupo de trabajo crearía al usuario "Byron Contreras"con el mismo ID. Esto es importanteentenderlo porque: ¿Qué pasaría si alguien por error te borra el archivo de grupo de trabajo? Si tienes debidamente guardados los IDy nombres de los usuarios y grupos, solo creas un nuevo grupo de trabajo con esos datos. Si no tienes guardada esa información es casi seguro que pierdes tu base de datos porque no habrá como accesara ella. ¿Has pensado como se manejan los permisos entre bases de datos creadas en diferentes máquinas?, ¿Por qué puedo abrirtus bases de datos y tu las mías? La respuesta es simple, si recuerdas, Access trabaja predeterminadamente con el grupo de trabajo "System.mdw", que es el mismo en tu máquina y en la mía. Este grupo de trabajo tiene dos usuarios predeterminados "Admin"y "User", los cuales contienen cada uno un ID, que es el mismo también en ambas máquinas. Si creas un nuevo grupo de trabajo, se crearán estos mismos usuarios y el IDse mantendrá. Los usuarios Admin y User ya vienen predeterminados y no podemos conocersu IDporque nosotros no los hemos creado, solo la gente de Microsoft sabrá cual es. Con esto podemos deducir que:
  • 28. Si tú tienes una base de datos definida con Seguridad por usuarios, al usuario "Admin"le borras la contraseña de ingreso, y además le concedes todos los permisos, casi le estas eliminando la seguridad por usuarios, porque si recuerdas, Access predeterminadamente te ingresa con el grupo de trabajo "System.mdw"y con el usuario "Admin"y sin contraseña, y como el IDdel usuario "Admin"es el mismo en ambas bases de datos y grupos de trabajo, te dejará entrar libremente. 9.16 ¿Cómo Puedo Quitarle La Seguridad Por Usuarios A Una Base de Datos? Tendrías que seguir los siguientes pasos: - Ingresar a la base de datos con una cuenta de Administrador - Asignarle permisos completos de todos los objetos y de la base de datos a los usuarios Admin y User - Poner como propietario de todo al usuario Admin - Agregar al usuario Admin al grupo de Admins (Administradores) - Por último crear una nueva basede datos y desde allí realizar la importación de todos los objetos Aquí te dejo el código: Sub EliminarSeguridadPorUsuarios() 'Byron Contreras - byronlcl@gmail.com - 2,009 '............................................. 'Para correreste procedimiento debes ser miembro del grupo _ de Administradores On Error Resume Next Dim db As DAO.Database Dim i As Integer Dim strUsuarioGrupo As String Dim cont As DAO.Container Dim doc As DAO.Document Dim usr As DAO.User Set db = CurrentDb 'asignarle todos los permisos al usuario Admin y al grupo Users, 'poner como propietario de todos los objetos al usuario Admin For i = 1 To 2 strUsuarioGrupo = IIf(i = 1, "Admin", "Users") For Each cont In db.Containers 'objetos nuevos cont.UserName= strUsuarioGrupo cont.Permissions= dbSecFullAccess 'objetos existentes For Each doc In cont.Documents doc.UserName= strUsuarioGrupo doc.Permissions = dbSecFullAccess IfstrUsuarioGrupo = "Admin" Then doc.Owner = strUsuarioGrupo Next doc Next cont Next i 'agregar al usuario Admin al grupo Admins With DBEngine.Workspaces(0).Groups("Admins") Set usr = .CreateUser("Admin") .Users.Appendusr .Users.Refresh End With Set db = Nothing End Sub 9.17 Consultas Con Acceso De Propietario (With OwnerAccess Option) Existe una opción para que nadietenga acceso a tus tablas y que a la vez puedan ser actualizadas. Para lograr esto, primero debes quitarlea los usuarios todos los permisos sobre la
  • 29. tabla que deseas proteger, luego debes crear una Consulta de Acción (sobre la tabla) y la defines con With Owner Access Option. Através de esta consulta cualquierusuario puede modificar la tabla, aunque no tenga ningún permiso sobre la misma. Este tipo de consulta no puedeser modificada por nadie, solo por el propietario (creador). Si un usuario intentacualquier cosa directamente sobre la tabla los permisos serán denegados. Manualmente: Crea tu consulta en la vista de diseño, en el área vacía donde se muestran las tablas le das un clic secundario, en el menú desplegable seleccionas "Propiedades", dentro de las propiedades busca por "Permisos de Ejecución", allí escoges "De Propietario" Si estas creando la sentenciaSQL: Crea tu cadena normalmente y al final de la sentencia SQL le agregas WIHT OWNER ACCESS OPTION 9.18 Para Finalizar Utilizando la Seguridad Por Usuarios estamos Administrando a nuestrosusuarios tal y como Access nos Administra a nosotros Algunas personas crean sus propias tablas para manejar sus Usuarios, Objetos y Permisos, pero en lo personal me pareceque es no aprovechar las herramientas que Access ya nos ha dado, además tienen que volver a inventar lo mismo, y lo que me parecemás delicado es que el usuario Admin sigue con los permisos completos, lo cual quiere decir quepor automatización podemos abrir esas bases de datos y hacerles lo que deseemos. Tengo un ejemplo quehace eso, demostrarlo vulnerable que pueden ser esas bases de datos con esas condiciones, por ahí se los pongo también... La seguridad por usuarios funciona completamente en Access 2,003ó inferior, en Access 2,007 también es compatiblepero ya no da la opción de asegurar bases de datos en el formato 2,007,y este es un gran tema de debate... Saludos cordiales, Byron Contreras