共用方式為


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

羅伯特·麥克默里

注意

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. 在任務欄上,按兩下 [開始],指向 [系統管理工具],然後按兩下 [網際網路資訊服務 [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 的電腦上使用 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拒絕存取
細節:

所需的存取: 讀取屬性
設定: 開盤
選項 開啟重新分析點
屬性: 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 資料庫引擎 錯誤 '80004005'

作業必須使用可更新的查詢。

/example.asp,第 100 行**

如果您在重現錯誤時使用行程監視器公用程式,則會記錄下列失敗資訊:

進程名稱: w3wp.exe
作業: CreateFile
路徑:結果:C:\Inetpub\wwwroot\App\_Data\example.ldb拒絕存取
細節:

所需的存取: 一般讀取/寫入
設定: OpenIf
選項 同步 IO 非警示、非目錄檔案、隨機存取、開啟無召回
屬性:
ShareMode: 讀取、寫入
AllocationSize: 0
冒充: NT AUTHORITY\IUSR

此錯誤清楚地將鎖定檔案列為失敗的原因。 若要解決此問題,您可以將應用程式集區的模擬身分識別讀取/寫入許可權授與 Access 資料庫所在的資料夾,但這會對您的網站造成安全性風險。 更好的解決方案是將 Access 資料庫從網站的內容區域移至應用程式集區模擬身分識別具有讀取/寫入許可權的資料夾,然後建立指向資料庫位置的系統數據來源名稱 (DSN)。 接著,ASP 程式代碼會參考 連接字串 中的系統 DSN,而不是資料庫的實體路徑,這也更適合安全性。 如果您必須將資料庫儲存在內容區域中,您應該一律將資料庫儲存在 IIS 要求篩選功能預設封鎖的資料夾,例如App_Data資料夾。

相關資訊

如需loadUserProfile和其他應用程式集區屬性的詳細資訊,請參閱 Microsoft 支援服務和 IIS.net 網站上的下列頁面: