Asp.net

DefaultAppPool 是否在 IIS 上以特殊提升的權限執行?

  • April 23, 2010

我正在使用 ADSI 查詢 IIS 元數據庫的網頁中執行一段程式碼。程式碼很簡單:

       DirectoryEntry iisNode = 
       new DirectoryEntry("/LM/W3SVC/1/ROOT/MyAspWebsite-1-128886021498831845");
       foreach (DirectoryEntry de in iisNode.Parent.Children)
       {
           System.Console.WriteLine(de.Name);
       }

當我在 IIS7/W2K8 上的 DefaultAppPool 下執行頁面/站點時,這可以正常工作。但是,當我創建自己的應用程序池並將屬性與預設應用程序池相同時,此程式碼將失敗並出現以下錯誤:

Caught: System.Runtime.InteropServices.COMException
Failed to parse virtual directory: 
     /LM/W3SVC/1/ROOT/MyAspWebsite-1-128889542757187500
System.Runtime.InteropServices.COMException (0x80070005): Access is denied.

DefaultAppPool 有哪些特權?我沒有看到任何記錄。我需要它在非預設應用程序池中工作,但給整個工作程序提升權限。我還嘗試使用 DirectoryEntry 建構子的使用者名和密碼參數,在執行 IIS7 的機器上使用 Admin,但這並沒有改變任何東西。我還會注意到這在 IIS6 和 W2K3 上執行良好。

任何幫助表示讚賞。

您可能沒有意識到,但執行程式碼的實際身份可能與程序資源管理器中為 w3wp.exe 列出的身份不同。您應該設置斷點或WindowsIdentity.GetCurrent().Name在引發 COMException /“訪問被拒絕”衝突的違規程式碼行 (DirectoryEntry.Parent.Children) 附近執行。

例如,對我來說,我的應用程序池程序 w3wp.exe 就像NETWORK SERVICE在任務管理器視窗中一樣執行,正如您在上面描述的那樣。但是,當我檢查實際執行時身份時,發現它是新的 IIS7 內置使用者IUSR,這與我在 IIS6 中獲得的值不同,即NETWORK SERVICE.

using System.Security.Principal;

Console.WriteLine(
   WindowsIdentity.GetCurrent().Name); // IUSR on IIS7, NETWORKSERVICE on IIS6
foreach (var de in DirectoryEntry("/LM/W3SVC/1/ROOT/MySite".Parent.Children))
{
   System.Console.WriteLine(de.Name);
}

似乎在 IIS6 中,NETWORK SERVICE 有權通過 Active Directory 服務介面 ( ADSI ) 與類探索IIS 元數據庫。但是,IIS7 中的新 IUSR 標識沒有。為了執行上述程式碼,您必須直接模擬具有現有 ADSI 讀取權限的帳戶,例如:DirectoryEntry

using (new MyImpersonationWrapper("admin","pass"))
{
   foreach (var de in DirectoryEntry("/LM/W3SVC/1/ROOT/MySite".Parent.Children))
   {
       System.Console.WriteLine(de.Name);
   }
}

實施您自己的模擬包裝器並保護適當的本地帳戶是我將留給您的練習,因為您的(安全)需求可能會有所不同。

或者,您應該能夠使用IIS7的 WMI 提供程序來查找所需的資訊,正如MSDN 部落格文章中所建議的那樣。

引用自:https://stackoverflow.com/questions/975838