如何使用LDAP使用用户名而不是CN查询ActiveDirectory?

Rob*_*ert 5 .net ldap active-directory

如果我将.NET DirectoryEntry.Path设置为:

LDAP://CN=John Smith,OU=Group Name,DC=example,DC=com
Run Code Online (Sandbox Code Playgroud)

一切都很好,我得到了我需要的DirectoryEntry.但是,我不知道用户的真实通用名称(CN).我只知道他们的用户名"John.Smith".

那么,我该如何查询用户名?我没有成功地尝试了以下所有方法:

LDAP://CN=John.Smith,OU=Group Name,DC=example,DC=com
LDAP://sAMAccountName=John.Smith,OU=Group Name,DC=example,DC=com
LDAP://userPrincipalName=John.Smith,OU=Group Name,DC=example,DC=com
LDAP://userPrincipalName=John.Smith@example.com,OU=Group Name,DC=example,DC=com
LDAP://uid=John.Smith,OU=Group Name,DC=example,DC=com
LDAP://o=John.Smith,OU=Group Name,DC=example,DC=com
Run Code Online (Sandbox Code Playgroud)

mar*_*c_s 11

您不能只通过创建LDAP字符串进行查询 - 您需要使用代码.

就像是:

DirectoryEntry deRoot = new DirectoryEntry("LDAP://yourserver/CN=Users,dc=YourCompany,dc=com");

DirectorySearcher dsFindUser = new DirectorySearcher(deRoot);
dsFindUser.SearchScope = SearchScope.SubTree;

dsFindUser.PropertiesToLoad.Add("sn"); // surname = last name
dsFindUser.PropertiesToLoad.Add("givenName"); // first name

dsFindUser.Filter = string.Format("(&(objectCategory=Person)(anr={0}))", yourUserName);

SearchResult rseult = dsFindUser.FindOne();

if(result != null)
{
   if(result.Properties["sn"] != null)
   {  
      string lastName = result.Properties["sn"][0].ToString();
   }

   if(result.Properties["givenName"] != null)
   {  
      string lastName = result.Properties["givenName"][0].ToString();
   }
}
Run Code Online (Sandbox Code Playgroud)

可以在MSDN上找到System.DirectoryServices.DirectorySearcher类上的完整MSDN文档- 它具有许多其他属性和设置.

如果您使用的是.NET 3.5,那么使用强类型的例程库来处理用户和组时,事情变得更加容易了 - 有关详细信息,请参阅此主题的优秀MSDN文章.

希望这可以帮助

  • 那很有效.谢谢你的回答.但是,LDAP不应该是查询目录的标准吗?那么应该有一种方法来查询像用户名这样的属性?如果ActiveDirectory无法将类似用户名的重要属性暴露给LDAP查询,为什么假装支持LDAP?你可以告诉我,我仍然对ActiveDirectory感到愤怒. (2认同)
  • @geoffc:true - 这就是我在LDAP搜索过滤器中使用"anr" - 模糊名称解析 - 参数的原因.它涵盖了一个参数中的所有各种名称:-) (2认同)