﻿# IIS應用程式集區自訂身份識別後如何讓 ASP.NET 正常執行

我們都知道 ASP.NET 在 IIS 6.0 中運行的時候，**真正的**執行權限使用者是**應用程式集區**(**Application Pool**)的**身份識別**(**Identity**)頁籤中定義的那位使用者，預設的使用者是「**網路服務**(**NETWORK SERVICE**)」，而且實際在執行的程序名稱(Process Name)為 w3wp.exe，各位可以從**工作管理員**中看到。

我們先設定一種情境，如果一台 IIS 中有兩個 ASP.NET 網站，分別由不同的開發團隊或客戶所管理，而兩個網站都有設定**檔案上傳**的功能，因此兩個網站一定會有特定目錄需要賦予 ASP.NET **可寫入**權限，因為在 IIS 中 ASP.NET 的預設權限使用者就等於應用程式集區中定義的身份識別使用者，也就是所謂的 **NETWORK SERVICE** 系統使用者。

如果當其中**第一個網站**被入侵或值入後門程式時，也代表著這些後門程式正以 **NETWORK SERVICE** 的身份在你的主機中肆虐，攻擊的對象即便僅限於「網站」，但當然也包括**第二個網站**的部分可寫入路徑。

若要增強網站間的安全性與隔離性，我們這時就會需要修改應用程式集區(Application Pool)的身份識別設定，讓兩個 ASP.NET 網站個別使用不同的身份識別來執行所有的程式。

\---

我想應該也有人試過修改 IIS 中應用程式集區(Application Pool)的身份識別：

1.  先在系統中新增一位新的使用者 (假設叫做 User1 )
2.  修改 IIS 中應用程式集的身份識別設定 (如下圖)

![修改 IIS 中應用程式集區(Application Pool)的身份識別設定](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/66a0d494a2d0a44eb983-image_12.png)

但很不幸的， 如果你真的這麼做的話，ASP.NET 網站就會掛給你看，並出現 **Service Unavailable** 的錯誤訊息。

 ![Service Unavailable](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/159c78d0b642ddbb4fd9-image_6.png)

如果你在事件檢視器中查詢錯誤紀錄，你就會查到以下訊息：

![應用程式集區，'DefaultAppPool' 的識別項無效。當處理應用程式集區的第一個要求時，如果它仍然無效，那麼應用程式集區將被停用。資料欄位含有錯誤號碼。](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/63c7ab546aa09c15b92c-image_15.png)

以及

![應用程式集區 'DefaultAppPool' 的識別項無效，因此 World Wide Web Publishing 服務無法建立工作者處理序，以處理應用程式集區。所以已停用應用程式集區。](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/2fc234882a3c339d55e1-image_18.png)

所以光是這樣設定是不行的，以下就是正確設定的標準作業流程(SOP)：

1.  新增使用者
2.  將該使用者加入 **IIS\_WPG** 群組
3.  修改系統暫存目錄 ( **C:\\WINDOWS\\Temp** ) 權限，讓該使用者可讀、可寫
4.  修改**應用程式集區**的**身份識別**設定，並設定為該使用者
5.  [ASP.NET 若需用非預設帳號執行，必須妥善設定相關權限](/post/2009/06/29/Grant-proper-permission-to-user-or-group-by-ASPNET.aspx) ( 請跳過上述 3, 4 兩個步驟，直接參考第5個步驟所示文章操作 )

備註一：**IIS\_WPG** 群組是從 IIS 6.0 才加入的，最主要的目的就在於提供一個最小的執行權限，專門用來啟動工作處理程序(Worker Process)用的，所以如果你新建立的使用者不屬於 IIS\_WPG 群組的話，工作者處理序就會無法啟動，這也是因為 ASP.NET 會回應 Service Unavailable 的主因。

備註二：關於系統暫存目錄 ( **C:\\WINDOWS\\Temp** ) 權限應該是不用設定到可讀、可寫這麼大，因為我查詢我的伺服器上的 **C:\\WINDOWS\\Temp** 目錄對於 **NETWORK SERVICE** 的預設設定，原來只要有「列出資料夾/讀取資料」與「刪除」兩種權限就可以正常運行 ASP.NET 了。

檢視/設定使用者詳細權限(進階安全性設定)的方法如下：

![C:\\WINDOWS\\Temp 內容](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/8e9ebe236fa817710bf4-image_30.png)

![C:\\WINDOWS\\Temp 的進階安全性設定](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/14baa0abaaa2e4de5dce-image_33.png)

 ![C:\\WINDOWS\\Temp 的權限項目](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/0144bddf1d495b7181a5-image_36.png)

備註三：預設 **IIS\_WPG** 群組可對 **Temporary ASP.NET Files** 進行讀寫，所以無須修改此目錄的權限。  
　　　　預設路徑為 C:\\WINDOWS\\Microsoft.NET\\Framework\\v2.0.50727\\Temporary ASP.NET Files

![預設 IIS\_WPG 群組可對 Temporary ASP.NET Files 進行讀寫](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/a8b6c10ce91d322d644f-image_24.png)

\---

今天是 2008 年的最後一天，我今年共發表了 368 篇文章，部落格一整年的瀏覽人次也突破 35 萬人次，感覺還蠻不錯的。我這一整年的收穫，除了自己的技術不斷精進外，也幫助不少人充實技術觀念、開發技巧或實務經驗，當然也認識了一堆未曾蒙面的技術同好，這些對我來說都是無價之寶。

接下來幾天難得的年假我會好好休息(不碰電腦)，所以可能會有幾天沒有文章，期望沈澱之後能夠繼續堅持下去，不斷的透過部落格激勵自己成長茁壯。

在此也預祝各位 2009 新年快樂！ ^\_^

**相關連結**

-   [如何設定 IIS 6 讓網站應用程式運作的更穩定](/post/2008/11/21/How-to-configure-IIS-6-to-improve-web-application-stability)
-   [Application Pool和Service Unavailable](https://web.archive.org/web/20140321230313/http://dotnet.chinaitlab.com/ASPNET/737812.html)
-   IIS and ASP.NET: The Application Pool
-   [To W2K3 : Application Pool Identity setting in IIS 6.0](https://web.archive.org/web/20130630052449/http://weblogs.asp.net/dburke/archive/2004/01/05/47755.aspx)
-   [使用 IIS 6.0 設定應用程式集區身分識別](http://technet.microsoft.com/zh-tw/library/cc757536.aspx)/[Configuring Application Pool Identity with IIS 6.0 (IIS 6.0)](https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc757536\(v=ws.10\))
-   [Configuring Application Pool Identity in IIS 6.0 (IIS 6.0)](https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc739233\(v=ws.10\))
-   [設定應用程式各自獨立執行](http://technet.microsoft.com/zh-tw/library/cc782949.aspx)
-   [IIS 6.0 操作手冊](http://technet.microsoft.com/zh-tw/library/cc785089.aspx) / [IIS 6.0 Operations Guide](https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc785089\(v=ws.10\)) ( 所有應該知道的知識都在這裡了 )
-   [IIS 6.0 Technical Reference](https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc775635\(v=ws.10\))
