C#Active Directory PrincipalContext/UserPrincipal.IsMemberOf错误

C#Active Directory PrincipalContext/UserPrincipal.IsMemberOf错误,c#,active-directory,directoryservices,C#,Active Directory,Directoryservices,所以我有一个问题,我真的不知道该怎么问。基本上,我有一些代码,当我运行本地机器时,这些代码在本地机器上运行得非常好。一旦我将它发布到我们的开发web服务器,它就会失败。我不确定这是IIS安装问题、web.config问题还是编码问题 下面是代码片段 bool isMember = false; PrincipalContext ADDomain = new PrincipalContext(ContextType.Domain); UserPrincipal user

所以我有一个问题,我真的不知道该怎么问。基本上,我有一些代码,当我运行本地机器时,这些代码在本地机器上运行得非常好。一旦我将它发布到我们的开发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;
我传入一个用户名和一个组,它告诉我该用户是否是该组的成员。没问题。在我的机器上效果很好。我去把代码发布到Web服务器上,当它上线时失败了

UserPrincipal user = UserPrincipal.FindByIdentity(ADDomain, userID); 
它抛出以下错误:

[DirectoryServicesCOMException(0x80072020):发生操作错误。]
System.DirectoryServices.DirectoryEntry.Bind(布尔throwIfFail)+788
System.DirectoryServices.DirectoryEntry.Bind()+44
System.DirectoryServices.DirectoryEntry.get\u AdsObject()+42
System.DirectoryServices.PropertyValueCollection.PopulateList()+29
System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry 条目,字符串propertyName)+63
System.DirectoryServices.PropertyCollection.get_项(字符串propertyName)+163 System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer() +521217
System.DirectoryServices.AccountManagement.PrincipalContext.dododomaininit() +51
System.DirectoryServices.AccountManagement.PrincipalContext.Initialize() +141
System.DirectoryServices.AccountManagement.PrincipalContext.get\u QueryCtx() +42
System.DirectoryServices.AccountManagement.Principal.FindByIdentity with TypeHelper(PrincipalContext 上下文,类型principalType,可空`1 identityType,字符串 identityValue,DateTime refDate)+29
System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext 上下文,字符串标识符值)+95
Cosmic.Web.Login.btnSubmit\u单击C:\Cosmic\Cosmic.Web\Login.aspx.cs:79
System.Web.UI.WebControl.Button.RaisePostBackEvent(String eventArgument)+154
System.Web.UI.Page.ProcessRequestMain(布尔includeStagesBeforeAsyncPoint,布尔includeStagesAfterAsyncPoint)+3691


有没有想到这可能会失败?

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

要解决此问题,基本上您需要从以下内容更改构造函数:

PrincipalContext ADDomain = new PrincipalContext(ContextType.Domain);
(使用运行此代码的当前默认凭据建立与AD的连接)

为此:

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

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

如果您有几秒钟的时间等待来自大型广告的数据,请继续使用PrincipalContext,但如果您希望在毫秒内得到响应,请使用DirectoryEntry,DirectorySearcher和.PropertiesToLoad

这里有一个例子


你知道吗,事情就是这样。Web服务器没有访问Active Directory的正确凭据。在那里放一些凭证,它的效果会更好一些。谢谢