Compartir a través de


Uso de ASP clásica con bases de datos de Microsoft Access en IIS

de Robert McMurray

Nota:

Las bases de datos de Microsoft Access han sido populares durante muchos años con desarrolladores que usan Active Server Pages (ASP) para aplicaciones a pequeña escala, pero las bases de datos de Microsoft Access no están diseñadas para la escalabilidad. Por lo tanto, solo deben usarse donde el rendimiento no es un factor y es mejor no hospedar en ellas aplicaciones controladas por datos a gran escala.

En las versiones IIS 7.0, IIS 7.5 y posteriores, se realizaron varios cambios de seguridad que pueden afectar a cómo funcionarán las aplicaciones ASP clásicas. Por ejemplo, si desea copiar una aplicación ASP clásica que usa una base de datos de Access que se encuentra dentro del área de contenido del sitio web en un servidor que usa la versión IIS 7.0 o posterior, puede recibir el siguiente mensaje de error:

Error del motor de base de datos JET de Microsoft '80004005'

Error no especificado.

/example.asp, línea 100

Se trata de un error genérico desencadenado por el controlador de Access que puede producirse por diversos motivos, pero los permisos incorrectos son una causa común. Más concretamente, la capacidad de trabajar con bases de datos de Microsoft Access se implementa a través del motor de base de datos Microsoft JET, que crea varios archivos temporales y de bloqueo cuando se conecta a una base de datos de Access. En las secciones siguientes se describen algunas de las razones por las que esto puede ocurrir y cómo resolver esas situaciones.

Trabajar con sistemas de 64 bits

Desafortunadamente, no hay controladores ODBC de 64 bits, por lo que en sistemas de 64 bits tendrá que ejecutar las aplicaciones en modo de 32 bits. Para ello, siga estos pasos:

  1. En la barra de tareas, haga clic en Inicio, seleccione Herramientas administrativas y, a continuación, haga clic en Administrador de Internet Information Services (IIS).
  2. En el panel Conexiones, haga clic en Grupos de aplicaciones.
  3. Resalte el grupo de aplicaciones de su aplicación y, a continuación, haga clic en Configuración avanzada... en el panel Acciones.
  4. En el cuadro de diálogo Configuración avanzada, establezca Habilitar aplicaciones de 32 bits en True.
  5. Haga clic en Aceptar para cerrar el cuadro de diálogo Configuración avanzada.

Nota: El applet del panel de control de 64 bits para administrar conexiones ODBC no mostrará controladores ODBC de 32 bits. Para solucionar este problema, debe abrir el applet ODBC de 32 bits. Para ello, siga estos pasos:

  1. Haga clic en Inicio y, a continuación, en Ejecutar o abra un símbolo del sistema.

  2. Escriba el comando siguiente:

    %windir%\syswow64\odbcad32.exe
    
  3. Presione la tecla Entrar.

Trabajar con Control de acceso de usuarios

Debe asegurarse de seguir los pasos descritos en este documento mediante una cuenta que tenga permisos administrativos completos. Use uno de los dos métodos siguientes para llevar a cabo este proceso correctamente:

  • Inicie sesión en el equipo con la cuenta de administrador local.
  • Si ha iniciado sesión con una cuenta con permisos administrativos, pero que no es la cuenta de administrador local, abra todas las aplicaciones y todas las sesiones del símbolo del sistema mediante la opción "Ejecutar como administrador".

Estas condiciones anteriores son necesarias porque el componente de seguridad Control de cuentas de usuario (UAC) de Windows Vista y Windows Server 2008 impedirá el acceso administrativo a las opciones de configuración de IIS. Para obtener más información acerca de UAC, consulte la siguiente documentación:

Investigación inicial de solución de problemas

Si tiene alguna forma de seguimiento o depuración habilitada, la información de seguimiento o depuración puede mostrar el error que se produce cuando se abre la conexión de base de datos. Por ejemplo, las siguientes líneas de código ASP:

strCN = "DRIVER={Microsoft Access Driver (*.mdb)};" & _
        "DBQ=C:\Inetpub\wwwroot\App_Data\example.mdb"
Set objCN = Server.CreateObject("ADODB.Connection")
objCN.Open strCN ' <-- Note: ASP Error Occurs Here
strSQL = "SELECT * FROM TableName"

Uso del seguimiento de solicitudes con error en la versión IIS 7.0 y posteriores

Si tiene el seguimiento de solicitudes con error de IIS configurado para que capture los registros de seguimiento de errores HTTP 500, verá algo similar a la siguiente ilustración cuando examine un registro de seguimiento del error:

Captura de pantalla de una ventana del explorador que muestra una parte de un registro de seguimiento.

Aunque este error indica que se produjo el error al abrir la base de datos, no proporciona información adicional para ayudarle a restringir el problema a un área específica.

Uso del Monitor de procesos para recopilar más información

La utilidad Monitor de procesos de Microsoft Windows Sysinternals es un excelente recurso para realizar el seguimiento de problemas relacionados con los permisos. Para usar el Monitor de procesos y realizar un seguimiento de los problemas de IIS en la materia, configure Monitor de procesos para filtrar el seguimiento de solo los eventos creados por los procesos de W3wp.exe, como se muestra en la ilustración siguiente:

Captura de pantalla del cuadro de diálogo Filtro del Monitor de procesos.

Una vez que haya configurado los valores de filtro del Monitor de procesos, configure el Monitor de procesos para capturar eventos y, a continuación, reproduzca el error. Una vez que haya reproducido el error, examine el registro de captura del Monitor de procesos para ver si hay errores en la columna Resultado de registros, como se muestra en la ilustración siguiente:

Captura de pantalla que muestra el registro del Monitor de procesos.

Al analizar la información de los registros del Monitor de procesos, puede identificar cualquier problema relacionado con los permisos. Esto se muestra en el ejemplo siguiente.

Permisos en las carpetas temporales

Si usa la utilidad Monitor de procesos en un equipo que tiene una instalación predeterminada de IIS en Windows Server 2008 y Windows Vista SP1, puede recibir un error similar al siguiente cuando ASP se conecta a una base de datos de Access:

Nombre del proceso: w3wp.exe
Operación: CreateFile
Ruta de acceso: C:\Windows\Temp\JET5150.tmp
Resultado: ACCESO DENEGADO
Detalles:

Acceso deseado: Lectura o escritura genéricas, Eliminar
Disposición: Crear
Opciones: Sin alerta de E/S síncrono, archivo que no es de directorio, acceso aleatorio, eliminar al cerrar, abrir sin recuperación
Atributos: NT
ShareMode: None
AllocationSize: 0
Suplantación: NT AUTHORITY\IUSR

Este error muestra que el motor de base de datos JET no puede crear un archivo temporal como la identidad del grupo de aplicaciones suplantado en el directorio temporal predeterminado de Windows. Esto ocurre cuando se usa la configuración predeterminada para la versión de lanzamiento de IIS en Windows Server 2008 y Windows Vista SP1, donde IIS no carga el perfil de usuario para el perfil de la identidad del grupo de aplicaciones de forma predeterminada. Para resolver este problema, puede cambiar los permisos del directorio %SystemDrive%\Windows\Temp y conceder al usuario suplantado permisos de lectura y escritura.

Si usa la versión original de Windows Vista, es posible que vea un error similar al siguiente cuando ASP se conecta a una base de datos de Access:

Nombre del proceso: w3wp.exe
Operación: CreateFile
Ruta de acceso: C:\Windows\ServiceProfiles\NetworkService\AppData\Local\TempResultado: ACCESO DENEGADO
Detalles:

Acceso deseado: Atributos de lectura
Disposición: Abierto
Opciones: Abrir punto de reanálisis
Atributos: N/D
ShareMode: Lectura, Escritura, Eliminación
AllocationSize: N/D
Suplantación: NT AUTHORITY\IUSR

Este error indica que el motor de base de datos JET no puede acceder al directorio temporal para el perfil de usuario del servicio de red que usa la identidad del grupo de aplicaciones suplantada. En este ejemplo concreto, la identidad del grupo de aplicaciones está configurada para usar la cuenta de servicio de red y IIS está configurado para cargar el perfil de usuario para la identidad del grupo de aplicaciones suplantada. El error se produce porque la identidad del grupo de aplicaciones suplantada no puede acceder a la carpeta temporal de la cuenta de servicio de red. Para resolver este problema específico, puede cambiar los permisos en el directorio %SystemDrive%\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp y conceder el permiso de lectura y escritura al usuario suplantado, o puede configurar IIS para que no cargue el perfil de usuario, lo que cambiará la carpeta temporal que usará el motor de base de datos JET.

La configuración que rige si el perfil de usuario se carga para la identidad del grupo de aplicaciones es loadUserProfile, que se establece en false de forma predeterminada. Puede configurar esta opción cambiando el valor del atributo Cargar perfil de usuario en el cuadro de diálogo Configuración avanzada de un grupo de aplicaciones.

Captura de pantalla del cuadro de diálogo Configuración avanzada. Cargar perfil de usuario está resaltado.

También puede configurar esta opción mediante la herramienta de línea de comandos AppCmd.exe con la sintaxis siguiente:

appcmd.exe set config -section:system.applicationHost/applicationPools /[name='DefaultAppPool'].processModel.loadUserProfile:"False" /commit:apphost

Permisos en carpetas de contenido

Al implementar una aplicación ASP clásica que usa una base de datos de Access, es posible que vea este error porque no se puede crear el archivo de bloqueo de la base de datos de Access. Más información sobre este escenario: Las bases de datos de Access se conservan en archivos que usan una extensión de nombre de archivo .MDB. Al intentar agregar datos a la base de datos o actualizarlos, el motor de base de datos Microsoft JET intenta crear un archivo de bloqueo con que usa la extensión de nombre de archivo .LDB. Si la base de datos de Access se almacena en el área de contenido de su sitio web, de forma predeterminada, el motor de base de datos JET no tendrá permisos de acceso suficientes para actualizar la base de datos y verá el siguiente mensaje de error que se muestra en un explorador web:

**Error del motor de base de datos Microsoft JET '80004005'

La operación debe usar una consulta actualizable.

/example.asp, línea 100**

Si estaba usando la utilidad Monitor de procesos al reproducir el error, se registraría la siguiente información para el error:

Nombre del proceso: w3wp.exe
Operación: CreateFile
Ruta de acceso: C:\Inetpub\wwwroot\App\_Data\example.ldbResultado: ACCESO DENEGADO
Detalles:

Acceso deseado: Lectura/escritura genérica
Disposición: OpenIf
Opciones: Sin alerta de E/S síncrono, archivo que no es de directorio, acceso aleatorio, abrir sin recuperación
Atributos: N
ShareMode: Lectura, escritura
AllocationSize: 0
Suplantación: NT AUTHORITY\IUSR

Este error muestra claramente que el archivo de bloqueo es la causa del error. Para resolverlo, puede conceder permiso de lectura y escritura a la identidad suplantada del grupo de aplicaciones en la carpeta en la que se encuentra la base de datos de Access, pero esto supone un riesgo de seguridad para el sitio web. Una solución mejor sería mover la base de datos de Access fuera del área de contenido del sitio web a una carpeta en la que la identidad suplantada del grupo de aplicaciones tenga permiso de lectura y escritura y, a continuación, crear un nombre de origen de datos del sistema (DSN) que apunte a la ubicación de la base de datos. A continuación, el código ASP haría referencia al DSN del sistema en la cadena de conexión en lugar de la ruta de acceso física de la base de datos, lo que también es mejor para la seguridad. Si debe almacenar la base de datos en el área de contenido, siempre debe almacenar la base de datos en una carpeta bloqueada de forma predeterminada por las características de filtrado de solicitudes de IIS, como la carpeta App_Data.

Más información

Para obtener más información sobre loadUserProfile y otros atributos del grupo de aplicaciones, consulte las páginas siguientes en los sitios web de Soporte técnico de Microsoft y IIS.net: