呀,早知早點上網找答案了,問人問了好久問下,上次好像解決過一次了,居然又給忘了,真是暈ZT..怪不得今天沒什麼進展,好了,資料庫寫入搞定了,明天一個上午就可以OK嘍~
關鍵是NTFS的許可權問題了,如果是要ASP.NET中普通目錄能夠上傳,必須給IUSR_電腦名稱在該目錄有寫入許可權. 前面是找到了這點,不過發現居然還不行,後面總算又找到了,原來是要給ASPNET使用者有寫入許可權,這樣才能操作ACCESS資料庫嘍,這次想必不會再忘了...
轉:通過實驗探索 Access 2000/XP 資料庫的最佳 NTFS 使用權限設定
(http://uh1.bj.163.com/cgi/readelite?i=2292285&guest=1)
我們已經知道,ASP.NET 中使用 ADO.NET 訪問資料庫,通過 OleDb 的串連可以訪問 Access 資料庫——我們非常常用的低端資料庫之一。本文討論了 ASP.NET 中可能看到的若干錯誤提示,從中看到 Access 2000 和 Access XP 建立的資料庫檔案,在訪問出現錯誤時會出現不太相同的錯誤提示。希望對大家有所協助。另一個要點是,希望通過此文,使大家對 ASP.NET 中 Access 資料庫檔案的 NTFS 使用權限設定有所新的認識。
(一)實驗過程
為了敘述方便,舉個具體例子做個實驗:應用程式為 /test ,資料庫存放在 D:/wwwroot/test/data/db1.mdb,我們已經知道在 ASP.NET 中是以一個叫做 ASPNET 虛擬使用者的身份訪問資料庫的,我們需要給這個賬戶以特定的 NTFS 許可權才能使 ASP.NET 程式正常運行。
為了得到最嚴格的 NTFS 使用權限設定,實驗開始時我們給程式最低的 NTFS 許可權:
a) D:/wwwroot/test/data/ 檔案夾的給使用者ASPNET以如下許可權:
|
允許 |
拒絕 |
| 完全控制 |
□ |
□ |
| 修改 |
□ |
□ |
| 讀取及運行 |
√ |
□ |
| 列出檔案夾目錄 |
√ |
□ |
| 讀取 |
√ |
□ |
| 寫入 |
□ |
□ |
b) D:/wwwroot/test/data/db1.mdb 檔案本身給使用者ASPNET以如下許可權:
√ 允許將來自父系的可繼承許可權傳播給該對象
1.1 對於某個只包含有“SELECT”命令的aspx程式,上述使用權限設定運行時無障礙,即:上述許可權已經滿足這類程式的運行了。
1.2 對於包含有“UPDATE”“INSERT”“UPDATE”等命令的aspx程式,
(a) 如果 db1.mdb 是 Access 2000 建立的資料庫,出現如下錯誤:
“/test”應用程式中的伺服器錯誤。
---------------------------------------
Microsoft Jet 資料庫引擎打不開檔案'D:/wwwroot/test/data/'。 它已經被別的使用者以獨佔方式開啟,或沒有查看資料的許可權。
說明: 執行當前 Web 請求期間,出現未處理的異常。請檢查堆疊追蹤資訊,以瞭解有關該錯誤以及代碼中導致錯誤的出處的詳細資料。
異常詳細資料: System.Data.OleDb.OleDbException: Microsoft Jet 資料庫引擎打不開檔案'D:/wwwroot/test/data/'。 它已經被別的使用者以獨佔方式開啟,或沒有查看資料的許可權。
(b) 如果 db1.mdb 是 Access XP 建立的資料庫,出現如下錯誤:
“/test”應用程式中的伺服器錯誤。
----------------------------------------------
操作必須使用一個可更新的查詢。
說明: 執行當前 Web 請求期間,出現未處理的異常。請檢查堆疊追蹤資訊,以瞭解有關該錯誤以及代碼中導致錯誤的出處的詳細資料。
異常詳細資料: System.Data.OleDb.OleDbException: 操作必須使用一個可更新的查詢。
(c) 原因初步分析:因為包含有“UPDATE”“INSERT”“UPDATE”等命令,需要對資料庫檔案本身進行寫入操作,所以上述許可權不能滿足此需求,我們需要進一步放開許可權。
我們放開一些許可權,
a) D:/wwwroot/test/data/ 檔案夾不變:
b) D:/wwwroot/test/data/db1.mdb 檔案本身給使用者ASPNET以如下許可權:
|
允許 |
拒絕 |
| 完全控制 |
□ |
□ |
| 修改 |
□ |
□ |
| 讀取及運行 |
√ |
□ |
| 列出檔案夾目錄 |
√ |
□ |
| 讀取 |
√ |
□ |
| 寫入 |
√ |
□ |
1.3 放開許可權後繼續實驗,
(a) 如果 db1.mdb 是 Access 2000 建立的資料庫,出現如下錯誤:
“/test”應用程式中的伺服器錯誤。
------------------------------------------
不能鎖定檔案。
說明: 執行當前 Web 請求期間,出現未處理的異常。請檢查堆疊追蹤資訊,以瞭解有關該錯誤以及代碼中導致錯誤的出處的詳細資料。
異常詳細資料: System.Data.OleDb.OleDbException: 不能鎖定檔案。
(b) 如果 db1.mdb 是 Access XP 建立的資料庫,沒有出現錯誤。
(c) 原因初步分析:我們發現在開啟 Access 資料庫時,同時會在所在目錄產生一個同名的 *.ldb 檔案,這是一個 Access 的鎖定 Token。鑒於此,我們猜測,使用者 ASPNET 訪問 Access 資料庫時,也需要產生一個鎖定 Token,而該目錄沒有允許其寫入,因此出錯。至於 Access XP 建立的資料庫為什麼沒有這個錯誤,原因還不得而知。
我們進一步放開許可權,
a) D:/wwwroot/test/data/ 檔案夾給使用者ASPNET以如下許可權:
|
允許 |
拒絕 |
| 完全控制 |
□ |
□ |
| 修改 |
□ |
□ |
| 讀取及運行 |
√ |
□ |
| 列出檔案夾目錄 |
√ |
□ |
| 讀取 |
√ |
□ |
| 寫入 |
√ |
□ |
b) D:/wwwroot/test/data/db1.mdb 檔案本身給使用者ASPNET以如下許可權:
√ 允許將來自父系的可繼承許可權傳播給該對象
1.4 繼續實驗,發現錯誤已解決,那麼上面這個許可權就是我們需要放開的“最低許可權”。
(a) 如果 db1.mdb 是 Access 2000 建立的資料庫,我們會發現一個小問題:產生的 *.ldb 檔案不會自己刪除,訪問後該檔案依然存在,但這個問題不會影響 ASP.NET 的正常運行。
(b) 如果 db1.mdb 是 Access XP 建立的資料庫,沒有出現上面類似問題。
(c) 原因初步分析:我們僅僅是給了 ASPNET 以寫入檔案夾的許可權,沒有給它修改的許可權,所以檔案一旦寫入,便無法修改其內容,*.ldb 也就刪除不掉了。
如果非要解決這個問題,進一步放開許可權為:
a) D:/wwwroot/test/data/ 檔案夾給使用者ASPNET以如下許可權:
|
允許 |
拒絕 |
| 完全控制 |
□ |
□ |
| 修改 |
√ |
□ |
| 讀取及運行 |
√ |
□ |
| 列出檔案夾目錄 |
√ |
□ |
| 讀取 |
√ |
□ |
| 寫入 |
√ |
□ |
b) D:/wwwroot/test/data/db1.mdb 檔案本身給使用者ASPNET以如下許可權:
√ 允許將來自父系的可繼承許可權傳播給該對象
1.5 附帶著,實驗另一種情形:我們把 db1.mdb 在 Access 開啟編輯,同時訪問 ASP.NET。
(a) 如果 db1.mdb 是 Access 2000 建立的資料庫,我們發現並沒有出現什麼問題。
(b) 如果 db1.mdb 是 Access XP 建立的資料庫,出現如下錯誤:
“/zhao”應用程式中的伺服器錯誤。
------------------------------------------------
不能使用 '';檔案已在使用中。
說明: 執行當前 Web 請求期間,出現未處理的異常。請檢查堆疊追蹤資訊,以瞭解有關該錯誤以及代碼中導致錯誤的出處的詳細資料。
異常詳細資料: System.Data.OleDb.OleDbException: 不能使用 '';檔案已在使用中。
(c) 原因初步分析:Access 資料庫是單使用者單線程的資料庫,我們在 Access 裡面開啟編輯資料庫檔案時其實是以當前 Windows 使用者(比如Administrator)身份開啟資料庫,而 ASP.NET 預設使用的是 ASPNET 虛擬使用者(隸屬於 Users 組),層級低於 Administrator,無法和 Administrator “搶奪”許可權,所以出現衝突錯誤。至於 Access 2000 忽略這個問題的情形我們也不必做討論了,可能是 Access 2000 沒有考慮那麼多因素吧。
1.6 再附帶一種情形:將 db1.mdb 的屬性改為“唯讀”,無論是 Access 2000 還是 Access XP 都將分別出現與 1.2 中各自的錯誤相同的錯誤提示。
(二)實驗結論
1. 我們首先再次總結一下 Access 資料庫檔案的 NTFS 使用權限設定的緣起:
在 ASP.NET 中預設是以一個叫做 ASPNET 的虛擬使用者的身份來訪問、操作資料庫的,你可以在“控制台”-“管理工具”-“電腦管理”-“本機使用者和組”-“使用者”中看到這個使用者,預設情況下是:
全名:ASP.NET 電腦帳戶
描述為:用於運行 ASP.NET 輔助進程(aspnet_wp.exe)的帳戶。
隸屬於:Users組。
使用這麼一個隸屬於 Users 組的使用者來進行檔案操作、資料庫操作的風險是要比用一個 Administrators 組的使用者的風險要小得多,這也是 ASP.NET 在安全方面的一個考慮吧。
既然是這麼一個使用者需要訪問、操作資料庫檔案本身,那麼我們就需要給它一定的 NTFS 許可權以允許它的訪問。顯然沒有 NTFS 的許可權許可,ASPNET 就無法訪問、操作資料庫,就會出現上面實驗中所看到的那些錯誤了。
2. 經過上面的實驗,我們已經知道如下的 NTFS 使用權限設定是可以滿足一般需求的:
a) D:/wwwroot/test/data/ 檔案夾給使用者ASPNET以如下許可權:
|
允許 |
拒絕 |
| 完全控制 |
□ |
□ |
| 修改 |
□ |
□ |
| 讀取及運行 |
√ |
□ |
| 列出檔案夾目錄 |
√ |
□ |
| 讀取 |
√ |
□ |
| 寫入 |
√ |
□ |
b) D:/wwwroot/test/data/db1.mdb 檔案本身給使用者ASPNET以如下許可權:
√ 允許將來自父系的可繼承許可權傳播給該對象
同時我們也注意到 db1.mdb 是否為“唯讀”檔案對 ASPNET 的訪問也會有一定影響。
3. 上述使用權限設定可以直接設定給 ASPNET 使用者自己,也可以設定給 Users 組,或者直接給 Everyone 組上述許可權都是可以的。因為 ASPNET 隸屬於 Users 組,可以通過 使用者組 給 ASPNET 設定許可權。
4. NTFS 許可權在檔案或檔案夾右擊後得到的“屬性”對話方塊-“安全”選項卡中設定,一般情況下,可以考慮給 Adminitrators 組以“完全控制”的許可權,同時不要輕易在“拒絕”中打勾,有關 NTFS 使用權限設定的技巧,可以諮詢網路系統管理員、網路安全專家的建議。
註:FAT, FAT32 格式的分區中不支援 NTFS 許可權。
5. Windows 2000 系列,Windows Server 2003 系列的“安全”選項卡預設是很容易找到的,但 Windows XP Professional 中的“安全”選項卡預設是關閉的,可以將“控制台”-“檔案夾選項”-“查看”選項卡中的“進階設定”中“使用簡單共用(推薦)”一項的“√”去除,“確定”之後,再次按照上面的方法即可看到“安全”選項卡了。
轉二:ASP不能讀取Access資料庫?
yesue0608
我愛DIY (2002-06-17 20:18:24)
======================================
以下問題(已解決)/文章討論過程摘自 Yesue.com
來源:http://www.yesue.com/question/show.asp?id=453&catalog=Q_Web_ASP
======================================
問題:
裝有一套SERVER版的2000,但是在WEB服務(IIS5)中總是有中不能修改ACCESS資料庫,但是可以讀取,不管是97的還是2000的(還裝有一套OFFICE2000)。直接使用而沒有做ODBC設定,我記得以前在NT4(SP4+IE4.01+OP4)上好用。好像說是沒有給更新權力,但我已經設定了寫入還是不行。也沒有對資料庫檔案加唯讀設定。
解答:
以下說明的基礎都是你的網站檔案目錄位於NTFS分區上;你所說的問題一般是使用權限設定不當引起的.
除此以外還有一種可能就是你有用JET工作群組對ACCESS資料庫進行加密,而你的登入許可權是唯讀;我想這種可能性應該不大.
按照一般的規範,在你的網站裡為一些要執行寫操作的檔案(例如資料庫,或者一些要寫入儲存的檔案)建一個目錄,為這個目錄指定許可權,並讓目錄裡的檔案繼承這個目錄的安全屬性.
先說明一下,IIS在解析用戶端的請求時,首先是把你類比成NT的內建IIS匿名帳號(這個帳號只要安裝IIS就會自動建立,命名為"iusr_你的電腦名稱")進行訪問;如果NTFS磁碟目錄的本地安全性稽核不允許匿名訪問,而你在IIS中沒有設定以Windows驗證方式登入,訪問就會失敗.
你要做的是,就是查看那個可寫目錄的"屬性->安全"中是否有"iusr_你電腦名稱"這個帳號的訪問許可(關鍵要允許"寫入"許可權),沒有的話要加入;
如果你實在不願意建一個目錄,那麼用同樣方法指定單獨的mdb檔案的安全許可權也行