Access y VBA
Blog de Access y VBA del Buho


Inicio


Acerca de
Suscríbete al blog

Categorías
General [3] Sindicar categoría
Access con Codigo VBA [15] Sindicar categoría

Archivos
Septiembre 2005 [11]
Agosto 2005 [5]
Junio 2005 [2]

Sindicación (RSS)
Artículos
Comentarios

 


Nivel Seguridad en Access 2003

Por Juan Afan de Ribera (MVP Microsoft Access)

Pregunta : Se cómo deshabilitar las advertencias de seguridad que aparecen al iniciar una base de datos en Access 2003, pero me gustaría saber si ésto se puede hacer utilizando código.
Respuesta : Sí, a través de código se pueden también habilitar/deshabilitar las advertencias de seguridad de Access 2003. Pero para hacerlo, tenemos que utilizar o bien Scripting o bien funciones del API para leer y escribir en el registro de Windows.

En este caso, he preferido implementarlo a través del API de Windows.

Las funciones que he construído son las siguientes:

Funciones Nivel Seguridad:

Leer/escribir nivel seguridad de macros y código

Nombre de función Descripción Valor devuelto
GetSecurityLevel Función que devuelve el nivel de seguridad para macros y código de una base de datos Cualquiera de los valores señalados en el cuadro "Valores nivel de seguridad para macros y código"
SetSecurityLevel Función que establece el nivel de seguridad para macros y código de una base de datos. Su único argumento (Level) puede ser cualquiera de los valores que aparecen en el cuadro "Valores del nivel de seguridad de macros y código" True en caso de tener éxito y False en caso contrario.

Valores nivel de seguridad para macros y código

Constante Valor Descripción
Low 1 Nivel bajo. No ofrece protección contra macros inseguras.
Medium 2 Nivel medio. Se puede elegir entre ejecutar o no ejecutar macros que podrían no ser seguras.
High 3 Nivel alto. Sólo se ejecutarán macros firmadas digitalmente. Las macros sin esta característica se deshabilitan automáticamente
Funciones Bloqueo de expresiones

Leer/escribir nivel de bloqueo de expresiones

Nombre de función Descripción Valor devuelto
GetSandBoxMode Función que devuelve el nivel de bloqueo de expresiones consideradas no seguras. Cualquiera de los valores señalados en el cuadro "Valores nivel de bloqueo en expresiones no seguras"
SetSandBoxMode Función que establece el nivel de bloqueo de expresiones consideradas no seguras. Su único argumento (SandBoxMode) puede ser cualquiera de los valores que aparecen en el cuadro "Valores nivel de bloqueo en expresiones no seguras" True si la función tuvo éxito y False en caso contrario.

Valores nivel de bloqueo en expresiones no seguras

Constante Valor Descripción
Disabled 0 Deshabilitado. No existe ningún tipo de bloqueo en expresiones no seguras.
OnlyAccessApps 1 Sólo habilitado para aplicaciones de bases de datos de Access.
NonAccessApps 2 Habilitado para todo tipo de aplicaciones que no sean de Access
Enabled 3 Habilitado para todo tipo de aplicaciones.
En este enlace podrás encontrar más información sobre este tema, así como una lista de las expresiones de Visual Basic consideradas no seguras.

Ejemplos de uso:
' obtener el nivel de seguridad
NivelSeguridad = GetSecurityLevel
    
' obtener el nivel de bloqueo
NivelBloqueo = GetSandBoxMode
    
' establecer el nivel de seguridad
If SetSecurityLevel(Low) = True Then
    MsgBox "Se ha establecido un nivel de seguridad bajo"
End If
    
' establece el nivel de bloqueo
If SetSandBoxMode(NonAccessApps) = True Then
    MsgBox "Se ha establecido un nivel de bloqueo estándar"
End If
Este código en un módulo estandar
'---------------------------------------------------------
'
' GetSecurityLevel
' SetSecurityLevel
' GetSandBoxMode
' SetSandBoxMode
'
' Código escrito originalmente por Juan M Afán de Ribera.
' Estás autorizado a utilizarlo dentro de una aplicación
' siempre que esta nota de autor permanezca inalterada.
' En el caso de querer publicarlo en una página Web,
' por favor, contactar con el autor en
'
'     accessvbafaq@ya.com
'
' Este código se brinda por cortesía de
' Juan M. Afán de Ribera
'
' -------------------------------------------------------
'
' Enumeración para los valores de seguridad
Public Enum SecurityLevelEnum
    Low = 1&
    Medium
    High
End Enum
' Enumeración para los valores del bloqueo de expresiones
' no seguras
Public Enum SandBoxModeEnum
    Disabled = 0&
    OnlyAccessApps
    NonAccessApps
    Enabled
End Enum

' función que permite abrir una clave de registro
' con nivel de permisos
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" _
                Alias "RegOpenKeyExA" _
                (ByVal hKey As Long, _
                ByVal lpSubKey As String, _
                ByVal Reserved As Long, _
                ByVal samDesired As Long, _
                phkResult As Long) As Long
               
' función que permite crear una clave de registro
' con nivel de permisos
Private Declare Function RegCreateKeyEx Lib "advapi32.dll" _
                Alias "RegCreateKeyExA" _
                (ByVal hKey As Long, _
                ByVal lpSubKey As String, _
                ByVal Reserved As Long, _
                ByVal lpClass As String, _
                ByVal dwOptions As Long, _
                ByVal samDesired As Long, _
                lpSecurityAttributes As Any, _
                phkResult As Long, _
                lpdwDisposition As Long) As Long
                
' función que permite leer el valor de una clave de registro
Private Declare Function RegQueryValueEx Lib "advapi32.dll" _
                Alias "RegQueryValueExA" _
                (ByVal hKey As Long, _
                ByVal lpValueName As String, _
                ByVal lpReserved As Long, _
                lpType As Long, _
                lpData As Any, _
                lpcbData As Long) As Long

' función para establecer el valor de una clave de registro
Private Declare Function RegSetValueEx Lib "advapi32.dll" _
                Alias "RegSetValueExA" _
                (ByVal hKey As Long, _
                ByVal lpValueName As String, _
                ByVal Reserved As Long, _
                ByVal dwType As Long, _
                lpData As Any, _
                ByVal cbData As Long) As Long
                
' función para cerrar un manipulador de una clave de registro
Private Declare Function RegCloseKey Lib "advapi32.dll" _
                (ByVal hKey As Long) As Long
                
' constantes de claves predefinidas
Private Const HKEY_CURRENT_USER = &H80000001
Private Const HKEY_LOCAL_MACHINE = &H80000002
' constante para que una clave de registro creada
' sea almacenada y no sea borrada entre sesiones
Private Const REG_OPTION_NON_VOLATILE = 0&
' constante de permiso de lectura
Private Const KEY_QUERY_VALUE = &H1
' constante de permiso de escritura
Private Const KEY_SET_VALUE = &H2
' constante que indica éxito al acceder a una clave
Private Const ERROR_SUCCESS = 0&
' constante con el valor "REG_DWORD" (tipo de datos
' utilizados en el registro)
Private Const REG_DWORD = &H4

' Función que obtiene el nivel de seguridad para macros o código
Public Function GetSecurityLevel() As SecurityLevelEnum
    GetSecurityLevel = GetKeyValue("Level")
End Function

' Función que establece el nivel de seguridad para macros o código
Public Function SetSecurityLevel(ByVal Level As SecurityLevelEnum) As Boolean
    ' el parámetro Level no puede ser menor que Low (1)
    ' ni mayor que High (3)
    If Level < Low Or Level > High Then Exit Function
    SetSecurityLevel = SetKeyValue("Level", Level)
End Function

' Función que obtiene el nivel de evaluación de expresiones no seguras
Public Function GetSandBoxMode() As SandBoxModeEnum
    GetSandBoxMode = GetKeyValue("SandBoxMode")
End Function

' Función que establece el nivel de evaluación de expresiones no seguras
Public Function SetSandBoxMode(ByVal Level As SandBoxModeEnum) As Boolean
    ' el parámetro Level no puede ser menor que Disabled (0)
    ' ni mayor que Enabled (3)
    If Level < Disabled Or Level > Enabled Then Exit Function
    SetSandBoxMode = SetKeyValue("SandBoxMode", Level)
End Function

' Función que obtiene valores del registro sobre seguridad y bloqueo de
' expresiones no seguras. El parámetro ValueName hace referencia al valor
' del registro que queremos leer
Private Function GetKeyValue(ValueName As String)
Dim sKey As String
Dim hKey As Long
Dim RegKey As Long
Dim Level As Long
    
    Select Case ValueName
        ' El valor del registro "Level" hace referencia a la clave
        ' del registro relativo al nivel de seguridad
        Case "Level"
            ' formamos la clave de registro donde se buscará
            sKey = "Software\Microsoft\Office\11.0\Access\Security"
            RegKey = HKEY_CURRENT_USER
        ' El valor del registro "SandBoxMode" hace referencia a
        ' la clave de registro relativo al bloqueo de expresiones
        ' no seguras
        Case "SandBoxMode"
            ' formamos la clave de registro donde se buscará
            sKey = "SOFTWARE\Microsoft\Jet\4.0\Engines"
            RegKey = HKEY_LOCAL_MACHINE
    End Select
    
    ' si se puede abrir la clave de registro con permisos
    ' de lectura (KEY_QUERY_VALUE)
    If RegOpenKeyEx( _
                    RegKey, _
                    sKey, _
                    0&, _
                    KEY_QUERY_VALUE, _
                    hKey) = ERROR_SUCCESS Then
        ' si se puede leer el valor de la clave de registro
        ' "Level" o "SandBoxMode" según corresponda
        If RegQueryValueEx( _
                           hKey, _
                           ValueName, _
                           0&, _
                           REG_DWORD, _
                           Level, _
                           Len(Level)) = ERROR_SUCCESS Then
            ' devolvemos el valor
            GetKeyValue = Level
        End If
        ' cerramos el manipulador de la clave de registro
        ' que hemos abierto
        Call RegCloseKey(hKey)
    End If

End Function

' Función que establece valores del registro sobre seguridad y bloqueo de
' expresiones no seguras. El parámetro ValueName hace referencia al valor
' del registro que queremos leer
Private Function SetKeyValue(ValueName As String, Level As Long) As Boolean
Dim sKey As String
Dim hKey As Long
Dim valRet As Long
Dim RegKey As Long

    Select Case ValueName
        ' El valor del registro "Level" hace referencia a la clave
        ' del registro relativo al nivel de seguridad
        Case "Level"
            ' si Access 2003 no está instalado salimos de la función
            If Not Acc03Installed Then Exit Function
            ' formamos la clave de registro donde se buscará
            sKey = "Software\Microsoft\Office\11.0\Access\Security"
            RegKey = HKEY_CURRENT_USER
        ' El valor del registro "SandBoxMode" hace referencia a
        ' la clave de registro relativo al bloqueo de expresiones
        ' no seguras
        Case "SandBoxMode"
            ' formamos la clave de registro donde se buscará
            sKey = "SOFTWARE\Microsoft\Jet\4.0\Engines"
            RegKey = HKEY_LOCAL_MACHINE
    End Select
    
    ' si NO se puede abrir la clave de registro con permisos
    ' de escritura (KEY_SET_VALUE)
    If RegOpenKeyEx( _
                    RegKey, _
                    sKey, _
                    0&, _
                    KEY_SET_VALUE, _
                    hKey) <> ERROR_SUCCESS Then
        ' querrá decir que la clave no existe, así que la
        ' creamos del tipo "REG_DWORD", para que se almacene
        ' "REG_OPTION_NON_VOLATILE" y con permisos de escritura
        ' KEY_SET_VALUE
        ' si no se puede crear...
        If RegCreateKeyEx( _
                          RegKey, _
                          sKey, _
                          0&, _
                          "REG_DWORD", _
                          REG_OPTION_NON_VOLATILE, _
                          KEY_SET_VALUE, _
                          ByVal 0&, _
                          hKey, _
                          valRet) <> ERROR_SUCCESS Then
            ' ... salimos de la función
            Exit Function
        End If
    End If
    ' se llegamos aquí es que la clave ya existe
    ' si podemos establecer el valor que queremos...
    If RegSetValueEx( _
                     hKey, _
                     ValueName, _
                     0&, _
                     REG_DWORD, _
                     Level, _
                     Len(Level)) = ERROR_SUCCESS Then
        ' ... hemos tenido éxito
        SetKeyValue = True
    End If
    ' cerrramos el manipulador de la clave de registro
    Call RegCloseKey(hKey)
    
End Function

' función que comprueba en el registro si Access 2003
' está instalado en el sistema
Private Function Acc03Installed() As Boolean
Dim hKey As Long

    ' si podemos abrir esta clave del registro
    If RegOpenKeyEx( _
                    HKEY_CURRENT_USER, _
                    "Software\Microsoft\Office\11.0\Access", _
                    0&, _
                    KEY_QUERY_VALUE, _
                    hKey) = ERROR_SUCCESS Then
        ' querrá decir que Access 2003 está instalado
        Acc03Installed = True
        ' cerramos el manipulador de la clave de registro
        Call RegCloseKey(hKey)
    End If
    
End Function
'---------------------------------------------------------

Ejemplos:

MsAccessSecurity.zip

Por ErBuho - 27 de Junio, 2005, 9:17, Categoría: Access con Codigo VBA
Enlace Permanente | Referencias (0)




     Junio 2005  >>
LMMiJVSD
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30    

Enlaces
eGrupos
ZoomBlog

 

Blog alojado en ZoomBlog.com