2012-01-03 67 views
7

所以我有一個問題,我真的不知道如何問。基本上我有一些代碼在運行時在我的本地機器上運行得非常好。一旦我將它發佈到我們的開發Web服務器,它就會失敗。我不確定它是否是IIS設置問題,web.config問題或編碼問題。C#活動目錄PrincipalContext/UserPrincipal.IsMemberOf錯誤

這裏的代碼

bool isMember = false; 

    PrincipalContext ADDomain = new PrincipalContext(ContextType.Domain); 
    UserPrincipal user = UserPrincipal.FindByIdentity(ADDomain, userID); 

    if (user.IsMemberOf(ADDomain, IdentityType.Name, groupName.Trim())) 
    { 
     isMember = true; 
    } 

    return isMember; 

如果我通過用戶名和一組片段,如果該用戶的該組中的一員,它告訴我。沒問題。在我的機器上很好用。我去的代碼發佈到Web服務器,當它擊中線

UserPrincipal user = UserPrincipal.FindByIdentity(ADDomain, userID); 

它拋出這個錯誤失敗:

[DirectoryServicesCOMException (0x80072020): An operations error occurred.]
System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) +788
System.DirectoryServices.DirectoryEntry.Bind() +44
System.DirectoryServices.DirectoryEntry.get_AdsObject() +42
System.DirectoryServices.PropertyValueCollection.PopulateList() +29
System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName) +63
System.DirectoryServices.PropertyCollection.get_Item(String propertyName) +163 System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer() +521217
System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit() +51
System.DirectoryServices.AccountManagement.PrincipalContext.Initialize() +141
System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx() +42
System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext context, Type principalType, Nullable`1 identityType, String identityValue, DateTime refDate) +29
System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context, String identityValue) +95
Cosmic.Web.Login.btnSubmit_Click(Object sender, EventArgs e) in C:\cosmic\Cosmic.Web\Login.aspx.cs:79
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +154
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3691

任何想法在那裏這可能是失敗的?

回答

17

我的第一個猜測是:您正在運行此代碼的用戶帳戶沒有查詢Active Directory的必要權限。

爲了解決這個問題,基本上你需要你的構造從:

PrincipalContext ADDomain = new PrincipalContext(ContextType.Domain); 

(建立與此代碼下運行的電流,默認憑據AD的連接)

到這:

PrincipalContext ADDomain = 
    new PrincipalContext(ContextType.Domain, "DOMAIN", useraccount, password); 

並提供一個用戶名和密碼爲你知道有足夠的權限的用戶帳戶t o查詢Active Directory。

+1

你知道嗎,就是這樣。網絡服務器沒有正確的憑據來訪問Active Directory。把一些憑據放在那裏,它的工作原理好一點。謝謝! – Seril 2012-01-03 17:58:32