1

我在 AD 中使用以下查询来恢复用户的邮件地址:

// get a DirectorySearcher object
         DirectorySearcher search = new DirectorySearcher();

         // specify the search filter
         search.Filter = "(&(objectClass=user)(anr=" + login + "))";

         // specify which property values to return in the search
         search.PropertiesToLoad.Add("mail");        // smtp mail address

         // perform the search
         SearchResult result = search.FindOne();

         if (result != null)
         {

             return result.Properties["mail"][0].ToString();
         }
         else
         {

             return null;
         }

对于登录为“SRB”的特定用户,查询将带回一个名为“SRB-PC”的计算机对象。

我不明白为什么过滤器说 objectClass 应该是“用户”。

另外 - 为什么将它作为“喜欢”查询带回来 - 我希望它只带回名称与过滤器完全匹配的对象。

4

3 回答 3

2

对象是Active Directory 中对象的子ComputerUser这就是您找到计算机进行原始搜索的原因。

objectCategory元素用于正确区分实体:-

项目类别与项目类别页面所述:

在 Windows Server 2008 之前,objectClass 属性没有被索引。这是因为它具有多个值并且高度不唯一;也就是说,objectClass 属性的每个实例都包含顶级类。这意味着索引将非常大且无效。要定位给定类的对象,请使用 objectCategory 属性,该属性是单值和索引的。有关在搜索过滤器中使用这些属性的更多信息,请参阅确定要查找的内容。

因此,使用 objectCategory 而不是 objectClass 进行搜索效率更高。

于 2013-07-05T10:04:28.113 回答
1

好的 - 将过滤器切换到:

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

真的不明白为什么它修复它,但它确实!

于 2013-07-05T09:15:41.530 回答
1

你会很好地使用类似的东西:

   (&(objectCategory=person)(objectClass=user))
or
    (sAMAccountType=805306368)

请参阅其他一些 MS 查询

于 2013-07-05T20:57:21.060 回答