【发布时间】:2011-05-14 13:45:59
【问题描述】:
我有一个使用我编写的 Windows 服务的客户端,该服务轮询指定的活动目录 LDAP 服务器,以查找该 LDAP 服务器中指定组中的用户。
一旦找到用户,它就会填写用户信息(即用户名、电子邮件等)并尝试在该 LDAP 服务器中检索用户的域。
当我尝试为此特定客户端检索用户的域时,我遇到了 DirectoryServicesCOMException: Logon failure: unkonwn user name or bad password。 当我尝试引用我实例化的 RootDSE DirectoryEntry 对象上的属性时,将引发此异常。
这个客户端有一个有两个根的 Forest,设置如下。
Active Directory 域和信任
ktregression.com
ktregression.root
我认为这是问题所在。 有没有办法解决?有什么方法可以在不遇到此异常的情况下仍然检索特定域对象的 netbiosname?
这里是一些示例代码,指向之前记录的测试 AD 服务器设置:
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());
【问题讨论】:
-
您是否确定
RootDSE.Properties["configurationNamingContext"].Value返回的值实际上不为空,或者遵守LDAP://CN=Partitions,DC=ktregression,DC=com等的LDAP 命名法? -
你看过我为你昨天的其他类似问题提供的代码示例吗?
-
@Will,是的,我看了一下并试了一下。我实际上用另一个问题回答了这个问题。我想我实际上有两个不同的问题,这也是我开始这个问题的原因。我在一个森林中有两个根的实例的问题。
-
至于确保 RootDSE.Properties["configurationNamingContext"].Value 返回一个值并且不为空,我无法进行该检查,因为第二次我尝试检索它是否具有值,抛出异常。
-
@Micheal:我明白你的意思。请你清楚地解释你的目标是什么,忘记代码和其他一切,只是告诉你需要完成什么,以便我下定决心。在过去的几周里,我做了很多工作,但仍然使用 Active Directory。我希望我能进一步帮助你。再想一想,鉴于您有两个不同的根,为什么不简单地创建两个独立的
DirectoryEntry类实例来代表您的每个根,并使用它们?
标签: c# active-directory