Windows Server 2003 + IIS 6.0 環境下,ASP.NET 執行身分預設為 NETWORK SERVICE (IIS 6) 或 ASPNET (IIS 5 相容模式)。資源存取權限不足是導致「拒絕存取」、「找不到路徑」、「編譯失敗」的主因。
| 錯誤現象 | 原因分析 | 解決方案:需給予 Users 或 IIS_WPG 群組權限的路徑 |
|---|---|---|
| System.IO.DirectoryNotFoundException: 未找到路徑 "C:\" 的一部分 | ASP.NET 進程需列舉 C:\ 根目錄 | C:\ → 讀取 |
| HTTP 401.3 / 401.1 未經授權 | 匿名使用者帳號密碼錯誤,或網站目錄缺少該帳號權限 | 網站根目錄 → 讀取;檢查 IIS「目錄安全性」匿名帳號設定 |
| 瀏覽網站出現亂碼 | 無法讀取系統編碼相關檔案 | C:\Windows → 讀取 |
| CS0016: 無法寫入輸出檔案 Temporary ASP.NET Files ... 拒絕存取 | 動態編譯暫存目錄無寫入權限 | C:\Windows\Temp → 讀取、寫入、修改 |
| 編譯器錯誤代碼 128 | 編譯器需讀取 System32 下組件 | C:\Windows\System32 → 讀取 |
| 執行階段錯誤,需在 web.config 設定 customErrors=Off 才能看詳情 | 網站目錄缺少 IIS_WPG 讀取權限 | 網站根目錄 → 加入 IIS_WPG 讀取 |
| VS2005 內建伺服器編譯失敗:錯誤代碼 128 / 拒絕存取 | 防毒軟體 (如 McAfee) 阻擋在 Windows 目錄建立可執行檔 | 檢查防毒軟體日誌,排除 C:\Windows\Temp、C:\Windows\Microsoft.NET\Framework 目錄 |
| ASP.login_aspx 找不到適合方法重寫 / 不實作 IHttpHandler.IsReusable | 動態編譯產生的類別與原始碼不一致 (類別名、命名空間、繼承關係) | 檢查 .aspx 頁面的 Inherits、CodeFile、類別名稱、命名空間是否一致 |
路徑 | 必要群組 | 權限
-------------------------------|----------|----------------
C:\ | Users | 讀取
C:\Windows | Users | 讀取
C:\Windows\Temp | Users | 讀取、寫入、修改
C:\Windows\System32 | Users | 讀取
網站根目錄 | IIS_WPG | 讀取
網站根目錄 (匿名存取) | IUSR_* | 讀取 (由 IIS 自動管理)
Users 群組廣泛權限會降低伺服器安全性。ApplicationPoolIdentity),僅授權該特定身分存取必要資料夾。在網站根目錄建立 test.aspx:
<%@ Page Language="C#" %>
<%
Response.Write("AppDomain: " + System.AppDomain.CurrentDomain.FriendlyName + "<br/>");
Response.Write("User: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name + "<br/>");
System.IO.File.WriteAllText(Server.MapPath("~/test_write.txt"), "ok");
Response.Write("Write test: OK");
%>
若能顯示 "Write test: OK" 且檔案建立成功,權限基本通過。