所以我有一个问题,老实说我不太确定该怎么问。基本上我运行时有一些代码可以在我的本地机器上运行。一旦我将它发布到我们的开发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
任何可能失败的想法?
答案 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。
这是一个例子