C# Active Directory:在驻留在具有多个根的林中的域中获取RootDSE?
我有一个客户端正在使用我编写的windows服务,该服务轮询指定的active directory LDAP服务器,查找该LDAP服务器中指定组中的用户 一旦找到用户,它将填写用户信息(即用户名、电子邮件等),并尝试在LDAP服务器中检索用户的域 当我尝试检索此特定客户端的用户域时,我遇到了DirectoryServicesCOMException:登录失败:未知用户名或错误密码。 尝试引用我实例化的RootDSE DirectoryEntry对象上的属性时引发此异常 此客户端有一个具有两个根的林,设置如下 Active Directory域和信任C# Active Directory:在驻留在具有多个根的林中的域中获取RootDSE?,c#,active-directory,C#,Active Directory,我有一个客户端正在使用我编写的windows服务,该服务轮询指定的active directory LDAP服务器,查找该LDAP服务器中指定组中的用户 一旦找到用户,它将填写用户信息(即用户名、电子邮件等),并尝试在LDAP服务器中检索用户的域 当我尝试检索此特定客户端的用户域时,我遇到了DirectoryServicesCOMException:登录失败:未知用户名或错误密码。 尝试引用我实例化的RootDSE DirectoryEntry对象上的属性时引发此异常 此客户端有一个具有两个根的
- KTV.com
- 根
string domainNameLdap = "dc=tempe,dc=ktregression,dc=com";
DirectoryEntry RootDSE = new DirectoryEntry (@"LDAP://10.32.16.6/RootDSE");
DirectoryEntry servers2 = new DirectoryEntry (@"LDAP://cn=Partitions," + RootDSE.Properties["configurationNamingContext"].Value ); //*****THIS IS WHERE THE EXCEPTION IS THROWN********
//Iterate through the cross references collection in the Partitions container
DirectorySearcher clsDS = new DirectorySearcher(servers2);
clsDS.Filter = "(&(objectCategory=crossRef)(ncName=" + domainNameLdap + "))";
clsDS.SearchScope = SearchScope.Subtree;
clsDS.PropertiesToLoad.Add("nETBIOSName");
List<string> bnames = new List<string>();
foreach (SearchResult result in clsDS.FindAll() )
bnames.Add(result.Properties["nETBIOSName"][0].ToString());
string domainNameLdap=“dc=tempe,dc=kt,dc=com”;
DirectoryEntry RootDSE=新的DirectoryEntry(@“LDAP://10.32.16.6/RootDSE”);
DirectoryEntry servers2=new DirectoryEntry(@“LDAP://cn=Partitions,”+RootDSE.Properties[“configurationNamingContext”].Value)//*****这就是引发异常的地方********
//遍历分区容器中的交叉引用集合
DirectorySearcher clsDS=新的DirectorySearcher(服务器2);
clsDS.Filter=“(&(objectCategory=crossRef)(ncName=“+domainNameLdap+”)”;
clsDS.SearchScope=SearchScope.Subtree;
clsDS.PropertiesToLoad.Add(“nETBIOSName”);
List bnames=新列表();
foreach(clsDS.FindAll()中的搜索结果)
bnames.Add(result.Properties[“nETBIOSName”][0].ToString());
我相信DirectoryEntry有属性可指定给可以执行LDAP查询或更新的AD帐户,您也可以从父域向下委托该控制权。Active Directory尝试使用的用户帐户验证“您”不存在,因为您的DirectoryServicesCOMException
报告了它
DirectoryServicesCOMException:登录失败:用户名未知或密码错误。
看看您的代码示例,您似乎没有使用模拟,因此Active Directory的安全协议考虑了当前经过身份验证的用户。自己创建这个用户,然后如果您碰巧没有在两个域根上定义,其中一个不认识您,这会引发这种异常
另一方面,使用模拟可能会解决这里的问题,因为您说您的Windows服务帐户有权查询同一林下的两个根,那么您必须确保经过身份验证的用户是您的Windows服务
显然,这意味着如果没有模拟,您无法保证经过身份验证的用户是您的Windows服务。为了确保这一点,模拟是必须使用的
现在,关于两个根
DirectoryEntry
类的两个实例,每个根对应一个实例
在实例化根之后,您需要搜索要查找的用户,该用户应该是与模拟用户不同的另一个用户名
我们现在必须声明是否可以在两个根上定义用户。如果是这样的话,你需要知道什么时候选择一个比另一个更好。这是另一个问题
注意为了简单起见,我认为这两个根的名称都是您提到的完整/完整的 使用它:
string userDomain = (GetUserDomain(_dotComRoot, "searchedLogin")
?? GetUserDomain(_dotRootRoot, "searchedLogin"))
?? "Unknown user";
您的异常仅在第二次DirectoryEntry
初始化时抛出,这表明您的默认当前用户没有在此根目录上定义帐户
编辑#1
请参阅下面我对其他NetBIOS名称相关问题的回答:在这里,我为您的问题提供了一个新的、可能更简单的解决方案
如果您还有任何问题,请告诉我。=) 您是否确保
RootDSE.Properties[“configurationNamingContext”].Value
返回一个实际不为空的值,或者遵守LDAP://CN=Partitions,DC=kt的LDAP术语,DC=com
或类似的问题?你注意到我昨天为你的另一个类似问题提供的代码示例了吗?@Will,是的,我看了一下并尝试了一下。实际上,我用另一个问题回答了这个问题。我想我实际上有两个不同的问题,这就是为什么我也开始这个问题。我在一个林中有两个根的实例的问题。只要确保RootDSE.Properties[“configurationNamingContext”].Value返回一个值且不为null,我就无法进行该检查,因为在我第二次尝试检索它是否有值时,会引发异常。@Micheal:我明白你的意思。请你清楚地解释一下你的目标是什么,忘记代码和其他一切,告诉我你需要完成什么,这样我才能下定决心做点什么。在过去的几周里,我已经做了很多工作,现在仍然在使用Active Directory。我希望我能进一步帮助你。再想一想,既然您有两个不同的根,为什么不简单地创建两个独立的DirectoryEntry
类实例来表示您的每个根,并使用它们呢?
string userDomain = (GetUserDomain(_dotComRoot, "searchedLogin")
?? GetUserDomain(_dotRootRoot, "searchedLogin"))
?? "Unknown user";