Access & VBA FAQ
| | | |
Indice de temas
Tablas
Consultas
Formularios
Informes
Macros
Módulos
Base de datos
Miscelánea
API
Utilidades
Problemas
Cadenas
Fechas
Todos los temas
Base de datos : Activar/Desactivar advertencias de seguridad a través de código
Autor/es:
Juan M Afán de Ribera
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ónDescripciónValor devuelto
GetSecurityLevelFunción que devuelve el nivel de seguridad para macros y código de una base de datosCualquiera de los valores señalados en el cuadro "Valores nivel de seguridad para macros y código"
SetSecurityLevelFunció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

ConstanteValorDescripción
Low1Nivel bajo. No ofrece protección contra macros inseguras.
Medium2Nivel medio. Se puede elegir entre ejecutar o no ejecutar macros que podrían no ser seguras.
High3Nivel 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ónDescripciónValor devuelto
GetSandBoxModeFunció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"
SetSandBoxModeFunció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

ConstanteValorDescripción
Disabled0Deshabilitado. No existe ningún tipo de bloqueo en expresiones no seguras.
OnlyAccessApps1Sólo habilitado para aplicaciones de bases de datos de Access.
NonAccessApps2Habilitado para todo tipo de aplicaciones que no sean de Access
Enabled3Habilitado 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

 

Temas relacionados:

Advertencias de seguridad en Access 2003

 

Última actualización: 10/4/2005