在 IIS 上将经典 ASP 与 Microsoft Access 数据库配合使用

作者:Robert McMurray

注意

多年来,Microsoft Access 数据库一直深受使用 Active Server Pages (ASP) 开发小型应用程序的开发人员欢迎,但 Microsoft Access 数据库没有针对可伸缩性进行设计,因此,Access 数据库只应在性能不重要的情况下使用,并且最好不要使用 Microsoft Access 数据库托管数据驱动的大规模应用程序。

在 IIS 7.0、IIS 7.5 及更高版本中,进行了多项安全更改,这些更改可能会影响经典 ASP 应用程序的工作方式。 例如,如果要将在网站的内容区域中使用 Access 数据库的经典 ASP 应用程序复制到使用 IIS 7.0 或更高版本的服务器,可能会收到以下错误消息:

Microsoft JET 数据库引擎错误 "80004005"

未指定的错误。

/example.asp,第 100 行

这是 Access 驱动程序触发的一般错误,原因可能有多种,但权限不正确是一个常见原因。 更具体地说,使用 Microsoft Access 数据库的能力是通过 Microsoft JET 数据库引擎实现的,该引擎在连接到 Access 数据库时会创建各种临时文件和锁定文件。 以下部分将讨论可能出现这种情况的一些原因,以及如何解决这些情况。

使用 64 位系统

遗憾的是,没有 64 位 ODBC 驱动程序,因此在 64 位系统上,必须以 32 位模式运行应用程序。 为此,请按照以下步骤操作:

  1. 在任务栏上,单击“开始”,指向“管理工具”,然后单击“Internet Information Services (IIS)管理器”
  2. 在“连接”窗格中,单击“应用程序池”
  3. 突出显示应用程序的应用程序池,然后单击“操作”窗格中的“高级设置”
  4. 在“高级设置”对话框中,将“启用 32 位应用程序”指定为 True
  5. 单击“确定”,关闭“高级设置”对话框

注意:用于管理 ODBC 连接的 64 位控制面板小程序不会显示 32 位 ODBC 驱动程序。 若要解决此问题,需要打开 32 位 ODBC 小程序。 为此,请按照以下步骤操作:

  1. 依次单击“开始”和“运行”,或打开命令提示符

  2. 输入以下命令:

    %windir%\syswow64\odbcad32.exe
    
  3. 按 Enter 键。

使用用户访问控制

需要确保使用具有完全管理权限的帐户来执行本文档中的步骤。 为此,最好采用以下两种方法之一:

  • 使用本地管理员帐户登录到计算机。
  • 如果使用具有管理权限但并非本地管理员帐户的帐户登录,请使用“以管理员身份运行”选项打开所有应用程序和所有命令提示符会话。

必须满足上述条件,因为 Windows Vista 和 Windows Server 2008 中的用户帐户控制 (UAC) 安全组件阻止对 IIS 配置设置的管理访问。 有关 UAC 的详细信息,请参阅以下文档:

初始故障排除调查

如果启用了某种形式的跟踪或调试,跟踪或调试信息可能会显示打开数据库连接时发生的错误。 例如,以下 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"

在 IIS 7.0 及更高版本中使用失败请求跟踪

如果将 IIS 失败请求跟踪配置为捕获 HTTP 500 错误的跟踪日志,则在检查失败的跟踪日志时,会看到类似于下图的内容:

浏览器窗口的屏幕截图,其中显示了跟踪日志的一部分。

尽管此错误表明打开数据库时发生失败,但它没有提供任何其他信息来帮助将问题范围缩小到特定区域。

使用进程监视器收集更多信息

Microsoft Windows Sysinternals 进程监视器实用工具是跟踪权限相关问题的绝佳资源。 若要使用进程监视器跟踪本主题中的 IIS 问题,请将进程监视器配置为仅筛选由 W3wp.exe 进程创建的事件的跟踪,如下图所示:

“进程监视器筛选器”对话框的屏幕截图。

配置进程监视器筛选器设置后,配置进程监视器以捕获事件,然后重现错误。 重现错误后,请在进程监视器捕获日志中查看日志的“结果”列中的任何错误,如下图所示:

显示进程监视器日志的屏幕截图。

通过分析进程监视器日志中的信息,可以查明任何与权限相关的问题。 以下示例对此进行了说明。

对临时文件夹的权限

如果在默认安装了 IIS 的 Windows Server 2008 和 Windows Vista SP1 计算机上使用进程监视器实用工具,则当 ASP 连接到 Access 数据库时,你可能会收到类似下面的错误:

进程名:w3wp.exe
操作:CreateFile
路径:C:\Windows\Temp\JET5150.tmp
结果:拒绝访问
详细信息

所需访问权限: 泛型读/写、删除
处置: 创建
选项 同步 IO 非警报、非目录文件、随机访问、关闭时删除、打开时不召回
属性 NT
ShareMode
AllocationSize 0
模拟 NT AUTHORITY\IUSR

此错误表明 JET 数据库引擎无法在默认 Windows 临时目录中创建临时文件作为模拟应用程序池标识。 在 Windows Server 2008 和 Windows Vista SP1 上使用 IIS 发行版的默认设置时,会出现这种情况,在此情况下 IIS 默认不会加载应用程序池标识配置文件的用户配置文件。 若要解决此问题,可以更改 %SystemDrive%\Windows\Temp 目录的权限,以允许模拟用户的读/写权限

如果使用 Windows Vista 的原始发行版本,则在 ASP 连接到 Access 数据库时,可能会出现类似下面的错误:

进程名:w3wp.exe
操作:CreateFile
路径:C:\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp结果:访问被拒绝
详细信息

所需访问权限: 读取属性
处置: 打开
选项 打开重新分析点
属性 不适用
ShareMode 读取、写入、删除
AllocationSize 不适用
模拟 NT AUTHORITY\IUSR

此错误表示 JET 数据库引擎无法访问使用模拟应用程序池标识的网络服务用户配置文件的临时目录。 在此特定示例中,应用程序池标识配置为使用网络服务帐户,IIS 配置为加载模拟应用程序池标识的用户配置文件。 发生此错误的原因是模拟应用程序池标识无法访问网络服务帐户的临时文件夹。 若要解决此问题,可以更改 %SystemDrive%\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp 目录的权限以允许模拟用户的读/写权限,或者可以将 IIS 配置为不加载用户配置文件,这会更改 JET 数据库引擎将使用的临时文件夹

控制是否为应用程序池标识加载用户配置文件的配置设置是“loadUserProfile”,它默认设置为“false”。 可以通过更改应用程序池“高级设置”对话框中“加载用户配置文件”属性的值来配置此设置

“高级设置”对话框的屏幕截图。突出显示了“加载用户配置文件”。

还可以使用命令行工具 AppCmd.exe 通过以下语法来配置此设置:

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

内容文件夹的权限

部署使用 Access 数据库的经典 ASP 应用程序时,可能会出现此错误,原因是无法创建 Access 数据库的锁定文件。 为了进一步解释这种情况:Access 数据库保存在使用 .MDB 文件扩展名的文件中。 尝试添加到数据库或更新数据时,Microsoft JET 数据库引擎会尝试创建一个使用 .LDB 文件扩展名的锁定文件。 如果 Access 数据库存储在网站的内容区域中,则默认情况下,JET 数据库引擎没有足够的访问权限来更新数据库,Web 浏览器中会出现以下错误消息:

**Microsoft JET 数据库引擎错误 "80004005"

操作必须使用可更新的查询。

/example.asp,第 100 行**

如果在重现错误时使用了进程监视器实用工具,则会记录以下失败信息:

进程名:w3wp.exe
操作:CreateFile
路径:C:\Inetpub\wwwroot\App\_Data\example.ldb结果:访问被拒绝
详细信息

所需访问权限: 一般读取/写入
处置: OpenIf
选项 同步 IO 非警报、非目录文件、随机访问、打开时不召回
属性 N
ShareMode 读取和写入
AllocationSize 0
模拟 NT AUTHORITY\IUSR

此错误清楚地将锁定文件列为失败原因。 若要解决此问题,可以向应用程序池的模拟标识授予对 Access 数据库所在文件夹的读/写权限,但这会给网站带来安全风险。 更好的解决方案是将 Access 数据库从网站的内容区域移动到应用程序池的模拟标识具有读/写权限的文件夹,然后创建指向数据库位置的系统数据源名称 (DSN)。 然后,ASP 代码会在连接字符串中引用系统 DSN,而不是数据库的物理路径,这也更有利于安全性。 如果必须将数据库存储在内容区域中,应始终将数据库存储在 IIS 请求筛选功能默认阻止的文件夹中,例如 App_Data 文件夹。

更多信息

有关 loadUserProfile 和其他应用程序池属性的其他信息,请参阅 Microsoft 支持和 IIS.net 网站上的以下页面: