2009-06-10 43 views
7

我在使用ADSI查詢IIS元數據庫的網頁中運行一段代碼。代碼是這樣簡單:DefaultAppPool是否在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. 

請問默認應用有哪些特權?我沒有看到任何記錄。我需要這個在非默認應用程序池中工作,但沒有給整個工作進程提升權限。我也嘗試使用IIS7運行的機器上的管理員使用DirectoryEntry構造函數的用戶名和密碼參數,但這並沒有改變任何內容。我還會注意到,這在IIS6和W2K3上工作罰款

任何幫助表示讚賞。

+0

您確定這兩個應用程序池都在相同的身份下運行嗎? – kemiller2002 2009-06-10 14:21:25

+0

是的,如果您在進程瀏覽器中查看,它們都作爲NT AUTHORITY \ NETWORK SERVICE運行,並且都具有「系統」的完整性。 如果您查看進程資源管理器下的安全選項卡以查看w3wp.exe的兩個實例的高級屬性,它們屬於完全相同的一組組,並且只有一處不同,DefaultAppPool是IIS APPPOOL \ DefaultAppPool組的一部分,並且自定義應用程序池屬於IIS APPPOOL \ CustomAppPool組。 – 2009-06-10 14:56:50

回答

2

您可能沒有意識到,但運行代碼的實際標識可能與過程資源管理器中爲w3wp.exe列出的實際標識不同。您應該設置一個斷點或在引發COMException /「訪問被拒絕」衝突的代碼行(DirectoryEntry.Parent.Children)附近運行WindowsIdentity.GetCurrent().Name

例如,對於我而言,我的應用程序池進程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)與DirectoryEntry類探索IIS Metabase。然而,IIS7中的新IUSR標識並沒有。爲了運行上面的代碼,你必須直接impersonate an account與現有的ADSI的讀取權限,例如:

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

實現自己的模擬包裝,並確保適當的本地帳戶是一個鍛鍊,我會離開你,因爲你的(安全)需求可能會有所不同。

或者,您應該能夠使用WMI provider for IIS7而不是suggested on this MSDN blog post來查找您所需的信息。

-2

我會檢查以確保NetWorkServices用戶可以訪問它試圖訪問的物理目錄。它出現的錯誤是,您正在訪問不同的網站下工作和一個沒有,是正確的?

正如前面的用戶所說,沒有什麼特別的關於默認應用程序池和你創建的一個(除非你改變了自定義應用程序池的設置,IIS確實使用用戶設置的任何用戶的權限來運行AppPool)

0

這是一個有點硬,從你的描述,告訴什麼可能,但是從該走什麼我知道你有一個這樣的設置:

DefaultWebSite 
    | 
    +-- VirtualDirectory 
     | 
     +-- ShowIISMetaData.aspx 

我認爲問題是,是應該的頁面顯示IIS元數據正在嘗試 查看其父項的子項(在換句話說它的兄弟姐妹)。

foreach (DirectoryEntry de in iisNode.Parent.Children) 

這是否爲默認的網站和虛擬目錄的應用程序池是相同的 物理池纔會工作。

0

此問題缺少一些信息。 這兩個帳戶都在相同的用戶帳戶下運行,因此行爲應該是相同的。 我建議你嘗試在IIS的vanilla安裝下運行代碼,問題是否仍然存在?

正如其他人所暗示的那樣,如果帳戶相同,那是因爲您已對元數據庫進行了一些修改。

0

與應用程序池關聯的憑據將是嘗試查詢AD時使用的憑據。因此,如果兩個應用程序池都在不是您的問題的相同憑據下運行。

您在測試網站中是否有不同的身份驗證設置?例如,如果您已將所選內容整合到一個而不是另一個......這可能會解釋您所遇到的行爲。

相關問題