在 IIS 上搭配 Microsoft Access 資料庫使用傳統 ASP

作者: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 JET 資料庫引擎實作使用 Microsoft Access 資料庫的能力,這會在連線到 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進程所建立之事件的追蹤,如下圖所示:

[進程監視器篩選] 對話方塊的螢幕擷取畫面。

設定進程監視器篩選設定之後,請設定進程監視器以擷取事件,然後重現錯誤。 重現錯誤之後,請查看進程監視器擷取記錄檔中記錄檔中是否有任何錯誤,如下圖所示

顯示進程監視器記錄檔的螢幕擷取畫面。

藉由分析進程監視器記錄中的資訊,您可以找出任何與許可權相關的問題。 這將會在下列範例中說明。

暫存資料夾的許可權

如果您在 Windows Server 2008 和 Windows Vista SP1 上預設安裝 IIS 的電腦上使用進程監視器公用程式,您可能會在 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結果:拒絕存取
詳細:

所需的存取: 讀取屬性
配置: Open
選項︰ 開啟重新分析點
屬性: 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 資料庫引擎預設不會有足夠的存取權限來更新資料庫,而且您會看到下列錯誤訊息顯示在網頁瀏覽器中:

**Microsoft JET Database Engine 錯誤 '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網站上的下列頁面: