裝有多網站應用程式的 IIS 主機有 CPU 衝高現象,想找出是哪個網站出狀況。IIS 的每個網站應用程式都有建自己的 AppPool,理論上打開工作管理員找到 w3wp.exe 程序,由 User Name 欄位可知 AppPool 名稱,不費吹灰之力便可找到兇手。

不料...

出現兩個 w3wp.exe,其中一個 CPU 25% 吃掉一整個 Core (用 ASP.NET 跑 while 無窮迴圈模擬),另一個則閒到發慌,CPU 使用量躺平,但要命的兩個 w3wp.exe User Name 欄位空白,看不出哪個 AppPool 出問題。這個情境背後有個前題 - 查問題的帳號不具管理者權限,基於安全考量,Windows 將不會提供其他使用者擁有程序(例如: w3wp)的詳細資料。如果你從不愁沒管理者權限可用,請按瀏覽器上方的 X 關閉本頁去做更有意義的事。若你的工作環境管制較嚴,想用管理者權限,難如請出尚方寶劍,那麼我有一些心得可供參考。

不允許存取不屬於使用者的資源是 Windows 的安全機制,前後試了好幾種做法 (PowerShell、WMI、VBScript...) 通通被權限擋掉,冷靜想一下,這方向是錯的 - 我在全力嘗試 Windows 極力禁止的行為,是絕對找不到解法的,就算真的找到那也不叫解法,要叫漏洞。故正確方向應為 - 「如何以非管理者群組的最小授權查出特定 w3wp.exe 執行身分?」

我先想到的是 Performance Monitor Users 群組,加入此群組後可從效能監視器的某些計數器拿到 AppPool 清單,但沒法直接連接到 CPU 使用率,不優。

爬文查到可從使用者權限(User Right)下手,其中偵錯程式(Debug Program)權限的說明是「允許使用者 Attach 或開啟任何程序」,看來很符合我們的需要。

將使用者權限加到群組上,再將特定使用者加入群組是權限授與的標準做法。Power Users 群組在 Windows XP/NT 時代很威,權限僅次於管理者,但從 Windows Vista 之後 已被眨為凡人,權限跟 Users 沒兩樣。但 Power Users 這個群組名字夠威,很適合用來加上系統營運人員需要的權限,再將營運帳號加進群組。遇到權限問題不要花時間找密技鑽漏洞,透過申請程序賦與營運帳號適當權限就對了。

指派使用者權限要用 Local Security Policy (本機安全性原則)管理工具,找到 Local Policies/User Rights Assignment/Debug programs,原本只有 Administrators,要再加上 Power Users:

有個小眉角,Add Users Group 加群組時,預設不認得 Power Users,記得調整 Object Types,加選 Groups:

將營運帳號加入 Power Users 群組,登入主機打開工作管理員,雖然還是看不到 User name,但選取顯示 Command line 欄位,由 w3wp.exe -ap "AppPoolName" 參數,就可判斷它是哪個 AppPool 了:

Tips of how to use non-admin account to find specific IIS AppPool process.


Comments

# by Cloud

用 PID 來找到對應的 AppPool 是否簡單些 https://support.secureauth.com/hc/en-us/articles/360028718811-Finding-the-Worker-Process-and-PID-of-an-Application-Pool-in-IIS

# by Jeffrey

to Cloud,會卡在沒有 Administrators 權限無法開啟 IIS 管理員。

Post a comment