|
|
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ó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 | Temas relacionados: Advertencias de seguridad en Access 2003 |
|