Pages

2016-06-08

網站w3wp.exe強佔Access denied解法

當我們把一個圖庫目錄上傳至網站,透過匯入程序將圖片歸類要移至正確目錄位置時,通常會出現「Path XXX access denied」錯誤。在IIS6/2003時代,這通常是指該目錄沒有Network Service角色寫入權限,但在IIS7.5/2008後,ASP.NET的執行權限是由AppPool角色來決定,即使使用最高權限「LocalSystem」,一樣會有w3wp.exe強佔匯入目錄的問題。

w3wp.exe Lock

上圖是透過Lock Hunter軟件顯示該目錄被強佔的資訊,須要手動解除鎖定。爬過很多網文及嘗試皆無法有效解除w3 worker process佔住的問題,只要有切入該目錄或顯示File List就會強佔,跟是否using/Dispose()或Web.config/runAllManagedModulesForAllRequests皆無關。一開始我的思路是它既然能透過軟件強制解除強佔,是否只要讀出其Handle ID/Process ID皆可批次解除,但最後發現即使透過外掛程式要Kill掉主機端程序不是那麼容易及即時,因此此方法受堵。

相信大家在Windows系統裏,都曾有刪除某目錄卻因在使用中無法刪除的經驗,但其實刪除其內的檔案卻是允許的!因此我們的解決思路,可以使用二段式。當圖庫目錄讀取歸類後先「複製」至正確位置,然後只刪除其內的圖檔,讓它變成一個空目錄,你也可以寫個「已匯入完成.txt」標記來提醒使用者。另外撰寫另一個網頁程式專門來清除這些特殊空目錄的存在,因此當User執行別的網頁時,發現w3wp.exe就不會再強佔該目錄了。

這是一個迂迴的二段式解法,專門用來處理網頁檔案上傳時的強佔問題。建議作法上是先放在Temp臨時目錄,再使用複製目錄來歸檔,這些殘留下來的目錄,可以等下次執行時清除1天前殘存資料即可,這段間隔時間也夠IIS AppPool行程Recycle回收,保證不會被強佔住的。

No comments: