7- Sistema seguridad sin adjuntar Grupo de Trabajo (fichero MDW)
Autor: Márius Puig (2005)
Atención: Solo valido para ACCESS 2000 , 2002 (XP) y 2003
En este ejemplo veremos como se puede abrir una tabla de una base de datos con "seguridad por usuarios" sin adjuntar el archivo de seguridad específico. Este sistema nos da un nivel mas alto de seguridad pero obliga a trabajar con recordsets y no se pueden usar consultas guardadas; antes de implantarlo se deberían tener en cuenta estas características y valorar si estamos dispuestos a asumir el trabajo adicional que supone hacerlo de esta forma, pues todo se deberá hacer por código y existen limitaciones en algunos objetos (p.e. los informes en Access 2000 no tienen recordset).
CREACIÓN DEL BACKEND
1- Creamos una carpeta donde pondremos todos los ficheros del ejemplo.
2- Entramos en el "Administrador de grupos de Access".
- Nos indicará a que grupo estamos unidos y en que carpeta se encuentra(p.e.
c:\Archivos de programa\Archivos comunes\System\System.mdw
- Pulsamos en la opción de "Crear"
- Escribimos el Id, Nombre y Organización que queramos y aceptamos
- En la siguiente pantalla indicamos la ubicación el nombre del archivo
c:\pruebas33\seguro33.mdw y aceptamos.
3- Ahora estaremos "unidos" al grupo de trabajo c:\pruebas33\seguro33.mdw, para evitar problemas antes de continuar con el ejemplo, volvemos a entrar al "Administrador de grupos de Access" para unirnos al mdw estándar.
- Pulsamos en el botón " unirse" - y escribimos la ruta y nombre del grupo tal como estaba
inicialmente en el punto 2
4- Para facilitar el proceso para este ejemplo y no tener que estar cambiando de grupo de trabajo, crearemos un acceso directo en el escritorio que nos "una" automáticamente a este grupo.
- En Destino indicamos la ruta completa de Access "C:\Archivos de programa\Microsoft Office\Office\MSACCESS.EXE" - y añadimos el parámetro /wrkgrp seguido del nombre del
grupo de trabajo
"C:\Archivos de programa\Microsoft Office\Office\MSACCESS.EXE" /wrkgrp C:\pruebas33\seguro33.mdw - en la pestaña General indicamos el nombre del acceso directo (SEGURO33 mdw) y aceptamos
5- Entramos en Access a través del acceso directo y pulsamos en el menú.
- Herramientas/Seguridad/Cuentas de usuario y de grupo
- En la pestaña Usuarios añadimos un nuevo usuario (en mayúsculas para evitar errores)
- Pulsamos el botón "Nuevo..." - en nombre: SEGURO33
- en id: SEGURO33
- Aceptamos y salimos de Access
6- Vamos a modificar el acceso directo.
- Añadimos al final de destino /user SEGURO33
- y aceptamos
7- Entramos de nuevo a través del acceso directo, ahora el usuario ya es el SEGURO33, si lo queremos comprobar vamos a Herramientas/Seguridad/Cuentas de usuario y de grupo/Cambiar contraseña.
- Creamos una nueva base de datos y la guardamos en la carpeta "c:\pruebas33\backend33.mdb"
- Vamos al menú Herramientas/Seguridad/Permisos - en tipo de objeto seleccionamos: Base de datos
- Marcamos grupos y seleccionamos grupo Administradores
- Quitamos TODOS los permisos y pulsamos en Aplicar
- Seleccionamos grupo Usuarios , quitamos TODOS los permisos, y aplicamos
- Marcamos Usuarios y seleccionamos el usuario Administrador
- Si no lo están, quitamos TODOS los permisos y aceptamos
8- Creamos una tabla de prueba Tabla1.
- añadimos un par de campos y guardamos (p.e. ID - autonumérico y DATO1 - texto 50)
- abrimos la tabla y agregamos un par de registros
- salimos de Access
9- Vamos a modificar otra vez el acceso directo.
- entre la ruta de Access y el parámetro /wrkgrp añadimos C:\pruebas33\backend33.mdb
- y aceptamos
10- Entramos en Access a trabes del acceso directo.
- comprobamos que SI podemos leer los datos de la Tabla 1 y salimos
11- Entramos en Access por el acceso "normal".
- abrimos la base backend33.mdb y comprobamos que NO tenemos permisos para abrirla
CREACIÓN DEL FRONTEND
1- Entramos en Access por el acceso "normal".
- creamos una nueva mdb ( C:\pruebas33\Front33.mdb ) - en la pestaña Módulos, pulsamos en Nuevo - y copiamos las 2 funciones ( AWunlookMDB y AWgetUserGroup )
Option Compare Database
Option Explicit
Public wsp As DAO.Workspace
Public Function AWunlookMDB() As Boolean
Dim newUSR As User
Dim wspADM As DAO.Workspace
If AWgetUserGroup(CurrentUser, "Admins") = False Then
AWunlookMDB = False
Exit Function
End If
On Error GoTo ERRunlookMDB
If AWgetUserGroup("Seguro33") = False Then
Set wspADM = DBEngine.Workspaces(0)
With wspADM
Set newUSR = .CreateUser("SEGURO33")
newUSR.PID = "SEGURO33"
Users.Append newUSR
newUSR.Groups.Append newUSR.CreateGroup("Users")
End With
End If
Set wsp = DBEngine.CreateWorkspace("WSPMASTER", "SEGURO33", "", dbUseJet)
DBEngine.Workspaces.Append wsp
wspADM.Users.Delete "SEGURO33"
AWunlookMDB = True
ERRunlookMDB:
Set wspADM = Nothing
Set newUSR = Nothing
End Function
Public Function AWgetUserGroup(strUser, Optional
strGroup = Null) As Boolean
Dim tmpWSP As DAO.Workspace
Dim tmpGroups, tmpUsers
Set tmpWSP = DBEngine.Workspaces(0)
With tmpWSP
For Each tmpUsers In .Users
If tmpUsers.Name = strUser Then
If Not IsNull(strGroup) Then
For Each tmpGroups In tmpUsers.Groups
If tmpGroups.Name = strGroup Then
AWgetUserGroup = True
Exit For
End If
Next
Else
AWgetUserGroup = True
Exit For
End If
End If
Next
End With
Set tmpWSP = Nothing
End Function
- En Herramientas / Referencias marcamos:
Microsoft DAO 3.6
- Compilamos y guardamos el modulo
2- Vamos a crear un formulario nuevo.
- Añadimos 2 cuadros de texto con los campos de tabla 1 (ID y DATO1)
- En el evento OPEN ponemos el siguiente código
Option Compare Database
Option Explicit
Dim newMDB As DAO.Database
Private Sub Form_Open(Cancel As Integer)
Dim rst As DAO.Recordset
If AWunlookMDB = False Then
MsgBox "Ha ocurrido un error no controlado"
Exit Sub
End If
On Error GoTo errOpen
Set newMDB = Workspaces("WSPMASTER").OpenDatabase(Application.CurrentProject.FullName)
On Error Resume Next
newMDB.TableDefs.Delete "TABLA1"
On Error GoTo 0
newMDB.TableDefs.Append newMDB.CreateTableDef("TABLA1", 0, "TABLA1", ";DATABASE="
& Application.CurrentProject.Path & "\backend33.MDB")
Set rst = newMDB.OpenRecordset("Select * from TABLA1", dbOpenDynaset)
Set Me.Recordset = rst
Set newMDB = Nothing
Set rst = Nothing
Exit Sub
errOpen:
MsgBox Err.Number & " " & Err.Description
End Sub
- En Herramientas / Referencias marcamos: Microsoft DAO 3.6
- compilamos y guardamos el modulo
2- Vamos a crear un formulario nuevo.
- Añadimos 2 cuadros de texto con los campos de tabla 1 (ID y DATO1)
- en el evento OPEN ponemos el siguiente código
Option Compare
Database
Option Explicit
Dim newMDB As DAO.Database
Private Sub Form_Open(Cancel
As Integer)
Dim rst As DAO.Recordset
If AWunlookMDB = False Then
MsgBox "Ha ocurrido un error no
controlado"
Exit Sub
End If
On Error GoTo errOpen
Set newMDB = Workspaces("WSPMASTER").OpenDatabase(Application.CurrentProject.FullName)
On Error Resume Next
newMDB.TableDefs.Delete "TABLA1"
On Error GoTo 0
newMDB.TableDefs.Append
newMDB.CreateTableDef("TABLA1", 0,
"TABLA1", ";DATABASE=" &
Application.CurrentProject.Path &
"\backend33.MDB")
Set rst = newMDB.OpenRecordset("Select *
from TABLA1", dbOpenDynaset)
Set Me.Recordset = rst
Set newMDB = Nothing
Set rst = Nothing
Exit Sub
errOpen:
MsgBox Err.Number & " " &
Err.Description
End Sub
- Compilamos y Guardamos el Formulario
3- Abrimos el formulario y deberíamos ver los datos de la Tabla 1.
- Si intentamos abrir directamente la tabla , aparecerá el mensaje
COPIAR DATOS DEL BACKEND A UNA TABLA DEL FRONTEND
Usando la base de datos anterior (front33.mdb).
1- Creamos una nueva tabla con la misma estructura de datos que la Tabla 1, guardamos con el nombre Tabla2
2- Creamos un nuevo formulario y añadimos el siguiente código en el evento Open
Option Compare Database
Option Explicit
Dim newMDB As DAO.Database
Private Sub Form_Open(Cancel As Integer)
If AWunlookMDB = False Then
MsgBox "Ha ocurrido un error no controlado"
Exit Sub
End If
On Error GoTo errOpen
Set newMDB = Workspaces("WSPMASTER").OpenDatabase(Application.CurrentProject.FullName)
On Error Resume Next
newMDB.TableDefs.Delete "TABLA1"
On Error GoTo 0
newMDB.TableDefs.Append newMDB.CreateTableDef("TABLA1", 0, "TABLA1", ";DATABASE="
& Application.CurrentProject.Path & "\backend33.MDB")
newMDB.Execute "INSERT INTO Tabla2 (Id, Dato1 ) SELECT Id, Dato1 FROM
tabla1"
MsgBox "Datos copiados"
Set newMDB = Nothing
Exit Sub
errOpen:
MsgBox Err.Number & " " & Err.Description
End Sub
3- Si abrimos la Tabla 2 veremos que se han copiado los datos de Tabla1 a la Tabla2