作者 :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 位模式下运行应用程序。 为此,请按照以下步骤操作:

在任务栏上,单击“ 开始”,指向 管理工具,然后单击“ Internet Information Services”(IIS)管理器。

在“ 连接 ”窗格中,单击 “应用程序池”。

突出显示您的应用程序池,然后在操作窗格中单击高级设置...。

在“高级设置”对话框中,为“启用 32 位应用程序”指定 True。

单击“确定”关闭 “高级设置 ”对话框。

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

单击“ 开始 ”,然后单击 “运行”,或打开命令提示符。

输入以下命令:

%windir%\syswow64\odbcad32.exe

按 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 Failed Request Tracing 配置为捕获 HTTP 500 错误的跟踪日志,当你检查失败的跟踪日志时,你会看到类似于下图的内容:

尽管此错误表明打开数据库时发生故障,但它不会提供任何其他信息来帮助你将问题缩小到特定区域。

使用进程监视器收集详细信息

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

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

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

对临时文件夹的权限

如果在已默认安装 IIS 的 Windows Server 2008 和 Windows Vista SP1 计算机上使用 Process Monitor 工具,当 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结果: 访问被拒绝

详细:

所需访问:

读取属性

配置:

打开

选项:

打开Reparse Point

属性:

n/a

ShareMode:

读取、写入、删除

AllocationSize:

n/a

冒充:

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

选项:

同步输入输出非警报、非目录文件、随机访问、打开时不需召回

属性:

N

ShareMode:

读取和写入

AllocationSize:

0

冒充:

NT AUTHORITY\IUSR

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

详细信息

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

https://www.iis.net/ConfigReference/system.applicationHost/applicationPools/add/processModel

请求连接到 IIS 7.0 中 Access 数据库的 ASP 页时出现错误消息:“Microsoft JET 数据库引擎错误”80004005“”