.Net中的LDAP目录条目 - 不适用于OU =用户

时间:2009-09-10 12:31:37

标签: c# .net ldap

我有以下代码(C#):

(调来自:http://www.eggheadcafe.com/conversation.aspx?messageid=31766061&threadid=31766050

DirectorySearcher dseSearcher = new DirectorySearcher();

string rootDSE = dseSearcher.SearchRoot.Path;
DirectoryEntry rootDE = new DirectoryEntry(rootDSE);

string userDSE = rootDSE.Insert(7, "OU=Users,");
DirectoryEntry userDE = new DirectoryEntry(userDSE);

rootDSE已正确创建,但是,如果我尝试使用它,则用户userDSE无法使用并抛出“服务器上没有此类对象”异常。

LDAP字符串如下:

  

Root:LDAP:// DC =公司,DC =本地

     

用户:LDAP:// OU =用户,DC =公司,DC =本地

我作为管理员在Vista上运行,但也需要在XP(管理员)上运行。

我是LDAP和目录管理的新手,所以我在这里黑暗中磕磕绊绊。有什么想法吗?此外 - 任何链接的文章,可以让我了解它如何工作将不胜感激。

3 个答案:

答案 0 :(得分:12)

我尝试作为测试的第一件事是在创建目录条目时对所需路径进行硬编码:

DirectoryEntry de = new DirectoryEntry("LDAP://OU=Users,DC=company,DC=local");

如果这是Active Directory中的实际路径,这将告诉您很快。我不知道你的AD是什么样的,所以我不能告诉你这是否是一条有效的道路。在您的Active Directory用户和计算机MMC插件下,如果此路径正确,那么您应该拥有根域,以及名为Users的根目录下的OU文件夹。

路径是在AD中向后生成的,因此如果您的“用户”文件夹位于根目录下的另一个OU之下,那么

DirectoryEntry de = new DirectoryEntry("LDAP://OU=Users,OU=<first OU folder>,DC=company,DC=local");

所以你的AD架构看起来像:

 Root 
 |
 --><first OU folder>
     |
     -->Users

关于如何在.NET中管理Active Directory的好文章:

HowTo: Do (Almost) Everything in Active Directory via C#

您可能还想研究.Net 3.5 Framework中提供的System.DirectoryServices,System.DirectoryServices.ActiveDirectory和System.DirectoryServices.AccountManagement命名空间。我相信System.DirectoryServices和ActiveDirctory命名空间可以在.Net 1.1中使用,而AccountManagement是在.Net 3.5中引入的。

Microsoft Documentation - A lot of good links on how to use the namespace

附录:

要在AD中实际查找用户,您需要执行以下操作:

 DirectoryEntry de = new DirectoryEntry();
 de.Path = "LDAP://DC=company,DC=local";
 de.AuthenticationType = AuthenticationTypes.Secure;

 DirectorySearcher deSearch = new DirectorySearcher();

 deSearch.SearchRoot = de;
 deSearch.Filter = "(&(objectClass=user) (cn=" + username + "))";

 SearchResult result = deSearch.FindOne();

 if (result != null)
 {
     DirectoryEntry deUser = new DirectoryEntry(result.Path);
     ... do what ever you need to the deUser
     deUser.Close();
 }

答案 1 :(得分:6)

这看似愚蠢和愚蠢,但Active Directory中的默认树设置不是 OU =用户,dc = domain,dc = com而是 cn =用户,dc = domain,dc = com(注意CN =不是OU =用户。

似乎很愚蠢,因为AD中的容器对象(cn的objectClass)不能是组策略的接收者,但由于我不明白的原因,这是默认的。 (实际上我明白了,这是因为CN的包含更像是NT域而不是OU)

几乎我遇到的每个人,第一次尝试LDAP绑定/ auth到AD。

答案 2 :(得分:2)

正如geoffc正确提到的,在Active Directory中,域下的“用户”是容器对象而不是组织单元对象。 这会导致完全不同的LDAP路径,这就是您收到错误消息的原因。

尝试使用以下代码并发布以解决问题:

// Replace the "company" and "com" with actual domain values...
DirectoryEntry de = new DirectoryEntry("LDAP://CN=Users,DC=company,DC=com");
DirectorySearcher deSearch = new DirectorySearcher();
deSearch.SearchRoot = de;

// Set your other search params here