** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Tus Funciones Favoritas & Aportaciones & Artí­culos
  Mensajes nuevos Mensajes nuevos RSS - Centros de Confianza y seguridad
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoCentros de Confianza y seguridad

 Responder Responder
Autor
Mensaje
buho Ver desplegable
Administrador
Administrador
Avatar
Nada en la palabra

Unido: 10/Abril/2004
Localización: Valladolid
Estado: Sin conexión
Puntos: 11330
Enlace directo a este mensaje Tema: Centros de Confianza y seguridad
    Enviado: 26/Agosto/2013 a las 15:38
HAppy, Yamamoto, SUperagente86 y Buho


Hola,

he estado escribiendo un código que se encarga de establecer las advertencias de seguridad para Access 2007.  Este código debe ser ejecutado desde un archivo vbs, ya que, en caso de que Access tenga puesto un nivel de seguridad más alto del "Habilitar todas las macros", cualquier BD con algo de código no funcionará.

El nivel de seguridad (valores entre el 1 y el 4) que se le quiera poner a Access se le debe pasar como argumento en el momento de lanzar este archivo. Este sería un ejemplo de cómo "lanzar" la ejecución del archivo EstablecerSeguridad2007.vbs (en la variable NivelSeguridad pondríamos el nivel de seguridad que queremos establecer para Access):



Dim fso As Object 'FileSystemObject
Dim Archivo As String
Dim NivelSeguridad As Long

NivelSeguridad = 1
' probaremos con una ruta que tenga espacios
Archivo = "C:\carpeta con espacios\SeguridadAccess2007.vbs"
Set fso = CreateObject("Scripting.FileSystemObject")
' obtenemos el nombre de la ruta sin espacios, de manera que no provoque errores
' cuando se intente ejecutar el archivo
Archivo = fso.GetFile(Archivo).ShortPath
' ejecutamos el archivo
Shell "WScript.exe " & Archivo & " " & NivelSeguridad

Set fso = Nothing

Y este es el código que hay que copiar en el archivo EstablecerSeguridad2007.vbs
'---------------------------------------------------------------------------------------
' Código archivo EstablecerSeguridad2007.vbs
'
' Propósito : Cambiar los valores del registro de Windows por los cuales se establece
' la seguridad de macros de Access.
'
' Para la versión 2007 hay que cambiar los valores VBAWarnings en dos claves de registro diferentes.
' La primera es una clave de registro fija:
' HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Access\Security
' pero la segunda clave está compuesta por diversos valores de cadena, junto con el SID
' (Security Identifier, Identificador de Seguridad) del usuario actual, con lo cual variará en cada
' caso. Esto obliga a hacer una función que busque esa clave y forme la cadena del registro donde
' estará ubicado ese segundo valor VBAWarnings
'
' Autor : Juan M. Afán de Ribera
' Fecha : 16/01/2011
' Argumentos : Valores que se le quieren poner a la seguridad de macros. Estos valores
' pueden ser:
'
' 1 = Habilitar todas las macros
' 2 = Deshabilitar todas las macros con notificación
' 3 = Deshabilitar todas las macros excepto las firmadas digitalmente
' 4 = Deshabilitar todas las macros sin notificación
'
'---------------------------------------------------------------------------------------
'

' valores de las claves del registro que se han de modificar
Const Warnings1 = "HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Access\Security\VBAWarnings"
Const Warnings2 = "\Software\Microsoft\Office\12.0\Access\Security\VBAWarnings"

Dim wShell
Dim NivelSeguridad
Dim AntiguoNivelSeguridad

If Wscript.Arguments.length > 0 Then
' obtenemos el nivel de seguridad que se haya pasado como argumento
NivelSeguridad = Wscript.Arguments(0)
' si el valor pasado está entre 1 y 4
If NivelSeguridad > 0 And NivelSeguridad < 5 Then
' creamos un objeto Shell que nos permitirá escribir en el registro
Set wShell = CreateObject("Wscript.Shell")
' guardamos el valor de la seguridad por macros actual
AntiguoNivelSeguridad = wShell.RegRead(Warnings1)
' si podemos establecer el nuevo valor para la primera clave...
If EstablecerVBAWarnings1(wShell, Warnings1, NivelSeguridad) = True Then
' y si podemos estableceer el nuevo valor para la segunda clave ...
If EstablecerVBAWarnings2(wShell, Warnings2, NivelSeguridad) = False Then
'si ha habido algún problema para establecer la segunda clave
'volvemos a poner la primera clave como estaba antes
EstablecerVBAWarnings1 wShell, Warnings1, AntiguoNivelSeguridad
End If
End If
Set wShell = Nothing
End If
End If

Wscript.Quit

Function EstablecerVBAWarnings1(wShell, ClaveRegistro, NivelSeguridad)

On Error Resume Next
' establecemos el valor para la primera clave de registro
wShell.RegWrite ClaveRegistro, NivelSeguridad, "REG_DWORD"
If Err.Number = 0 Then
EstablecerVBAWarnings1 = True
End If

End Function

Function EstablecerVBAWarnings2(wShell, ClaveRegistro, NivelSeguridad)
Dim UserSid

On Error Resume Next
UserSid = USER_SID
If Len(UserSid) > 0 Then
ClaveRegistro = "HKEY_USERS\" & UserSid & ClaveRegistro
' establecemos el valor para la segunda clave de registro
wShell.RegWrite ClaveRegistro, NivelSeguridad, "REG_DWORD"
If Err.Number = 0 Then
EstablecerVBAWarnings2 = True
End If
End If

End Function

' función que devuelve el USERSID del usuario actual
Function USER_SID()
Const HKEY_LOCAL_MACHINE = &H80000002
Dim objReg
Dim Claves
Dim subClave
Dim pathSubclave
Dim Usuario
Dim UsuarioActual
Dim pathUsuario

' vamos a utilizar un objeto para buscar en el registro del WMI
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
pathSubclave = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\"
' recuperamos las claves de todos los usuarios de este PC
objReg.EnumKey HKEY_LOCAL_MACHINE, pathSubclave, Claves
' recuperamos el nombre del usuario actual
UsuarioActual = CreateObject("WScript.Network").UserName

For Each subClave In Claves
' en este bucle vamos a ir probando con todas las claves de usuario
pathSubclave = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\" & subClave
objReg.GetExpandedStringValue HKEY_LOCAL_MACHINE, pathSubclave, "ProfileImagePath", pathUsuario

If Len(pathUsuario) > 0 Then
' recuperamos el nombre de usuario de la clave
Usuario = Mid(pathUsuario, InStrRev(pathUsuario, "\") + 1)
' si ese nombre de usuario es igual al usuario actual
If Usuario = UsuarioActual Then
' recuperamos el USERSID de esta clave
USER_SID = subClave
Exit For
End If
End If
Next

Set objReg = Nothing

End Function


Espero que os sea de utilidad.
El búho es un pajarraco
Arriba
buho Ver desplegable
Administrador
Administrador
Avatar
Nada en la palabra

Unido: 10/Abril/2004
Localización: Valladolid
Estado: Sin conexión
Puntos: 11330
Enlace directo a este mensaje Enviado: 26/Agosto/2013 a las 15:38
Hola:
Después de pedir el consiguiente permiso a Juan M. Afán (Happy) me propuse realizar lo mismo, pero en vez de hacerlo en VBS, hacerlo en un EXE realizado en Visual Basic clásico.
Con una mínimas variaciones del código de Juan,  le amplié para que funcionara también en Access 2010. Para no mezclar las cosas, ensamblé dos ejecutables. Uno para Access 2007 y otro para Access 2010.
BAJAR:
 
 
Estos "exes" hacen lo mismo que lo ya explicado por Happy en este hilo así que no me extenderé en más detalles.
Hay dos formas de llamarles o ejecutarles. Si se ejecutan "tal cual", se muestra un formulario donde el usuario puede subir/bajar los niveles de seguridad, de tal manera que en el nivel más bajo (1) todo el PC se comportaría como un "centro de confianza".

Pero tambien admiten dos parametros en la linea de comando para poder ser invocados desde instaladores tipo Inno Setup, por ejemplo...o desde codigo VBA.
El primer parámetro sería el nivel de seguridad y se le pueden pasar estos valores: 1,2,3 y 4  (Tal cual lo explica Juan arriba, en su mensaje).
El segundo parametro es un S ó N  y esto es para que, cuando se cambie el nivel de seguridad en el modo "linea de comandos" al final se muestre un msgbox o no, diciendo que la operación ha sido exitosa o no.
Por ejemplo:

Shell "C:\SeguridadAccess2007.exe 4 s", vbNormalFocus
haría que se cambiara el nivel de seguridad al "4", no se mostrara ningún formulario y  final salga un msgbox como que la operación ha ido OK.

Shell "C:\SeguridadAccess2007.exe 1", vbNormalFocus
haría que se cambiara el nivel de seguridad a "1" y no se viera ni el formulario ni el msgbox al final. Vamos, lo que se llamaría en método silencioso total.

Y por supuesto...si se ejecuta el EXE sin más, pues ya lo vereís, sale un formulario normal y corriente para poder interactuar con él.

No se descartan bug´s ya que no se han probado lo suficientemente en diversos entornos. En caso de que algo fallara y tal, pues ya lo ireis diciendo en el foro...

Nada, solo agradecer a Juan la idea, el codigo brindado y el permiso que me dió para hecer estos dos ejecutables.-
El búho es un pajarraco
Arriba
buho Ver desplegable
Administrador
Administrador
Avatar
Nada en la palabra

Unido: 10/Abril/2004
Localización: Valladolid
Estado: Sin conexión
Puntos: 11330
Enlace directo a este mensaje Enviado: 26/Agosto/2013 a las 15:38
Hemos aumentado un poco las prestaciones del programa...en el sentido de que además de lo que ya hacía, ahora tambien puede crear CC (Centros de Confianza), puede visualizar los CC en un determinado PC y puede eliminar los CC que de deseen.

Así mismo se ha implementado la posibilidad de compatibilidad con carpetas de RED:
En este sentido hay que tener presente una cosa importante:
Ayer Happy puso las dos claves "magicas" para este tema de ejecutar BD´s en carpetas de RED:
HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Access\Security\Trusted Locations\AllowNetworkLocations

HKEY_USERS\(aquí el USER_SID del usuario actual)\Software\Microsoft\Office\12.0\Access\Security\Trusted Locations\AllowNetworkLocations

Supongamos un PC1 que desea correr una BD situada en una carpeta XXX de otro ordenador PC2 de la red

Entonces, independientemente de como tenga el nivel de seguridad (1-4) a nivel de Macros esa BD situada en PC2 correra sin problemas en PC1 siempre que:

Si la Carpeta no es CC, por mucho que ponga esas dos claves no funciona. Si la carpeta es CC, si no pongo esas dos claves, tampoco funiona. Se tienen que dar las dos cosas a la vez.
Esa es la diferencia de un CC local y un CC en Red, que este ultimo, ademas hay que habilitar esas dos claves en el ordenador que intenta ejecutar una BD en RED.
Obviamente, si pongo el nivel de seguiridad a 1, se va a ejecutar todo desde cualquier sitio.

Los enlaces del anterior mensaje siguen siendo validos.
Saludos.
P.D
El programa está en fase "beta"...en caso de encontrar algun Bug (Que seguro saldrán) avisad en el foro.
El búho es un pajarraco
Arriba
buho Ver desplegable
Administrador
Administrador
Avatar
Nada en la palabra

Unido: 10/Abril/2004
Localización: Valladolid
Estado: Sin conexión
Puntos: 11330
Enlace directo a este mensaje Enviado: 26/Agosto/2013 a las 15:39
La tercera vía. (NO válida para PC´s que tengan solo el Runtime)
Pego de un hilo del Foro:


Al hilo de los ultimos mensajes. Un pequeño ejecutable VB que lee los parametros de un fichero de texto y segun lo escrito en ese fichero...sirve de lanzador de programas hechos en access y evita los mensajes de seguridad.
Es solo un mero ejemplo de lo que comentabamos Juan y yo ...que se puede lanzar una BD de access sin necesidad de rebajar de forma permanente el nivel de seguridad en el Pc de un cliente (Para mi una opción ilegal o ilicita) y sin crear un centro de confianza (Opcion que es la que yo recomiendo, por cierto)
Esta es una tercera vía a las dos anteriores: En este caso habilitamos puntual e instantaneamente una BD para que se ejecute sin recibir los avisos de seguridad tal y como deciamos ayer y tal y como recomendaba Microsoft tiempo atras, según un enlace que proporcionó ayer Happy:
http://support.microsoft.com/kb/317405/es

Bueno...aquí el lanzador de aplicaciones Access...no espereis esteticas preciosistas...se trata de que sirva como punto de partida...
http://www.mvp-access.com/buho/ficheros/ejecuta.zip

Si alguien quiere los fuentes....esta tarde les cuelgo tambien...(Visual Basic 6)
 
P.D
Este ejecutable o este metodo de lanzar BD´s de Access solo sirve si está access instalado en el ordenador, ya que se crea mediante automatización una instancia del propio Access. Si se utilizara el Runtime, obviamente esto no serviría de nada....siendo el Centro de Confianza la mejor opcion de todas, como ya decía anteriormente.-
El búho es un pajarraco
Arriba
buho Ver desplegable
Administrador
Administrador
Avatar
Nada en la palabra

Unido: 10/Abril/2004
Localización: Valladolid
Estado: Sin conexión
Puntos: 11330
Enlace directo a este mensaje Enviado: 26/Agosto/2013 a las 15:39
Gracias por dejarme participar tambien en este hilo. Yo quiero aportar una solución como la de Yamamoto, pero en un exe que solo actúa en línea de comandos con lo cual es mucho más reducido. Además...sigue la misma sintaxis que el exe de Yamamoto para unificar criterios:
1)cc2010.exe /cs C:\carpeta
Crearía un centro de confianza en la carpeta C:\carpeta avisando al usuario de dicha creación.

2)cc2010.exe /cn C:\carpeta
Crearía un centro de confianza en la carpeta C:\carpeta SIN avisar al usuario de dicha creación.

3)cc2010.exe /cs
Crearía un centro de confianza en la carpeta donde corra el exe (path actual) avisando al usuario de dicha creación.

4)cc2010.exe /cn
Crearía un centro de confianza en la carpeta donde corra el exe (path actual) *NO* avisando al usuario de dicha creación.

BAJAR EXE

P.D
Sirve tanto para Access 2007 como para Access 2010
El búho es un pajarraco
Arriba
buho Ver desplegable
Administrador
Administrador
Avatar
Nada en la palabra

Unido: 10/Abril/2004
Localización: Valladolid
Estado: Sin conexión
Puntos: 11330
Enlace directo a este mensaje Enviado: 26/Agosto/2013 a las 15:40
Me han reabierto el hilo, para hacer unas minimas variaciones a estos dos ejecutables.
He ampliado la funcionalidad para poder quitar los avisos de hipervinculos en Access 2003/2007/2010
Son los mismos ejecutables de Enero de 2011 que comentaba en mi primer mensaje de este hilo.-
Si observais algun error, me lo podeis comentar por privado.
Estos ejecutables manipulan en el registro de Windows, lo que implica que para que funcionen bien, la maquina debe tener esos permisos concedidos de lectura/escritura en el REG

BAJAR:
 
 
 
P.D
Una aclaración...
El denominado recinto de Seguridad o Sandbox existe desde A2003. Este recinto de seguridad depende, si no he leído mal, del motor JET, vamos depende no es la palabra…está ligada a él. De tal manera que en 2003 los desarrolladores de Access crearon los niveles de seguridad en Macros para que vigilara el código de VBA y el recinto de seguridad o SandBox, para que vigilara las expresiones en los orígenes de los controles y en las sentencias SQL entre otras cosas.


En defenitiva, estos ejecutables inspeccionan y pueden cambiar esos niveles de seguirdad. A saber, en modo de resumen:

1) Seguridad en Macros: Controla las expresiones escritas en macros y en codigo VBA.
2) Recinto de Seguridad o SandBox: Controla las expresiones escritas en el origen de los controles o embedidas en sentencias SQL.
3) Para A2007 y 2010 se ha creado los llamados centros de confianza.
4) Mensajes de Hiperviculos.

Espero que os sirvan
Salud y gracias.-
El búho es un pajarraco
Arriba
buho Ver desplegable
Administrador
Administrador
Avatar
Nada en la palabra

Unido: 10/Abril/2004
Localización: Valladolid
Estado: Sin conexión
Puntos: 11330
Enlace directo a este mensaje Enviado: 26/Agosto/2013 a las 17:11
Se ha modificado el antiguo cc2010 para que puede crear centros de confianza en A2007/2010/2013:
Direccion de bajada:

BAJAR NUEVA VERSION
 
 
También se ha creado el ejecutable cc2013 que hace lo mismo que el anterior, pero no recibe parámetros en la línea de comandos, es decir, crea centros de confianza para access 2007-2010-2013 en la carpeta donde se ejecuta

BAJAR CC2013
 
 
Se ha compatibilizado tambien el programa completo, para access 2013.
BAJAR SGURIDAD ACCESS 2013

En resumidas cuentas y para no liar mucho al personal:

1) Simplemente crear centros de confianza, pero con posibilidad de meter comandos en el EXE:

BAJAR

2) Crear centros de confianza en la carpeta donde se ejecute el EXE de manera silenciosa:

BAJAR

3) Programa completo de las seguridades en Access 2003/2007/2010/2013 donde engloba todo, es decir:

1) Seguridad en Macros: Controla las expresiones escritas en macros y en codigo VBA.
2) Recinto de Seguridad o SandBox: Controla las expresiones escritas en el origen de los controles o embedidas en sentencias SQL.
3) Para A2007  2010 2013 se ha creado los llamados centros de confianza.
4) Mensajes de Hiperviculos.

BAJAR
El búho es un pajarraco
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable