seguridad sin mdw

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.

c:\pruebas33

 

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

 kk_image001

 kk_image002

- 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

 kk_image003

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

 kk_image004

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

 kk_image005

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)

 kk_image006

- Pulsamos el botón "Nuevo..." - en nombre: SEGURO33

 kk_image007

- en id: SEGURO33

- Aceptamos y salimos de Access

 

6- Vamos a modificar el acceso directo. 

- Añadimos al final de destino /user SEGURO33 kk_image008

- 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

  kk_image009

 

- Seleccionamos grupo Usuarios , quitamos TODOS los permisos, y aplicamos

 kk_image010

 

- Marcamos Usuarios y seleccionamos el usuario Administrador

 kk_image011

- 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

 kk_image012

- 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

kk_image013

 

 

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.

 kk_image014

 

- Si intentamos abrir directamente la tabla , aparecerá el mensaje

 kk_image015

 

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

 

 

 

[Atrás]