[英]DirectoryServicesCOMException when working with System.DirectoryServices.AccountManagement
[英]Code using System.DirectoryServices.AccountManagement throws exception when deployed in IIS
我正在使用System.DirectoryServices.AccountManagement
來獲取用戶所屬的所有組,下面是用於獲取用戶的所有組的代碼。
public void GetUserGroups(string userName)
{
UserPrincipal user = null;
using (HostingEnvironment.Impersonate())
{
// establish domain context
PrincipalContext domain = new PrincipalContext(ContextType.Domain);
// find your user
user = UserPrincipal.FindByIdentity(domain, userName);
}
// if found - grab its groups
if (user != null)
{
PrincipalSearchResult<Principal> groups = user.GetAuthorizationGroups();
}
}
這在我的開發服務器中效果很好,但是當代碼部署在DMZ中的IIS,UAT服務器中的IIS上時,此代碼將失敗,並帶有以下堆棧跟蹤:
Message: at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
at System.DirectoryServices.DirectoryEntry.Bind()
at System.DirectoryServices.DirectoryEntry.get_AdsObject()
at System.DirectoryServices.PropertyValueCollection.PopulateList()
at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName)
at System.DirectoryServices.PropertyCollection.get_Item(String propertyName)
at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer()
at System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit()
at System.DirectoryServices.AccountManagement.PrincipalContext.Initialize()
at System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx()
at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext context, Type principalType, Nullable`1 identityType, String identityValue, DateTime refDate)
at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext context, Type principalType, String identityValue)
at System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context, String identityValue)
at LandingPage.GetUserGroups(String userName)
at LandingPage.Page_Load(Object sender, EventArgs e)
我的問題與System.DirectoryServices.AccountManagement非常相似, 無法在服務器上運行並且使用相同的分辨率,但沒有幫助。
請指教。
由於“使用(HostingEnvironment.Impersonate())”使其充當應用程序池的標識,因此問題是:每個應用程序池上的標識是什么? “ NetworkService”? “ ApplicationPoolIdentity”? 自定義帳戶?
若要在IIS 7中進行查看,請首先查看該站點的“基本設置”,以查看其應用程序池的名稱。 然后單擊左側框架中的“應用程序池”,然后查看該應用程序池的“標識”列。
如果UAT服務器上站點的應用程序池具有一個自定義帳戶,並且它是域用戶,則從設置開發服務器的站點開始,以將該域用戶用作其應用程序池的標識。
要在IIS 7中進行更改,請右鍵單擊應用程序池,選擇“高級設置”,查找身份,單擊“自定義帳戶”單選按鈕,再單擊“設置” ...
(副主題:如果您的站點完全使用SQL Server,則使用“ NetworkService”作為應用程序池標識的弊端。盡管您在Windows中嘗試執行的上述操作可能是一致的-為“ NT AUTHORITY”設置Windows權限\\ NETWORK SERVICE”-SQL Server的權限涉及至少兩次登錄的設置,因為遠程SQL Server訪問將在用戶“ DomainName \\ AspNetServer $”下進行。
有關詳細信息,請參見: http : //msdn.microsoft.com/zh-cn/library/ff647402.aspx例如,對於開發服務器“ OURMIGHTYDEV”和UAT服務器“ UATRULES”,它們都在域“ DOMAINION”中(您可以告訴我組成這些名稱很有趣;),可以有效地具有不同的身份,例如登錄“ DOMAINION \\ OURMIGHTDEV $”和登錄“ DOMAINION \\ UATRULES $”,並且您必須設置匹配的權限等, 2次登錄。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.