C#Active Directory PrincipalContext / UserPrincipal.IsMemberOf错误

时间:2012-01-03 17:40:44

标签: c# active-directory directoryservices

所以我有一个问题,老实说我不太确定该怎么问。基本上我运行时有一些代码可以在我的本地机器上运行。一旦我将它发布到我们的开发Web服务器,它就会失败。我不确定它是否是IIS安装问题,web.config问题或编码问题。

这是代码片段

    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;

我传入用户名和组的地方,它告诉我该用户是否是该组中的成员。没问题。在我的机器上工作得很好。我将该代码发布到网络服务器,当它到达行

时失败
UserPrincipal user = UserPrincipal.FindByIdentity(ADDomain, userID); 

它会抛出此错误:

  

[DirectoryServicesCOMException(0x80072020):发生操作错误。]
  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)在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

任何可能失败的想法?

2 个答案:

答案 0 :(得分:17)

我的第一个猜测是:您运行此代码的用户帐户没有查询Active Directory所需的权限。

要解决这个问题,基本上你需要改变你的构造函数:

PrincipalContext ADDomain = new PrincipalContext(ContextType.Domain);

(使用此代码运行的当前默认凭据建立与AD的连接)

到此:

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

并为您知道具有查询Active Directory的足够权限的用户帐户提供用户名和密码。

答案 1 :(得分:0)

如果您有几秒钟的时间等待来自大型 AD 的数据,请继续使用 PrincipalContext,但如果您希望以毫秒为单位做出响应,请使用 DirectoryEntry、DirectorySearcher 和 .PropertiesToLoad。

这是一个例子

https://stackoverflow.com/a/65986796/5248400