【问题标题】:DirectorySearcher Filter目录搜索过滤器
【发布时间】:2012-02-26 08:28:38
【问题描述】:

当我运行这个查询时

// Next row is used to login to AD
DirectoryEntry entry = GetEntry(domain, adminUser, adminPassword);
// Here starts the query
DirectorySearcher search = new DirectorySearcher(entry)
{
    SearchScope = SearchScope.Subtree,
    Filter = "(&" +
        "(objectClass=user)" +
        // "(distinguishedname=*OU=Ingegneria*)" +
        "(givenname=s*)" +
        "(samaccountname=*100)" +
    ")"
};
search.PropertiesToLoad.Add("distinguishedname");
SearchResultCollection result = search.FindAll();

我得到了六个条目,这是正确的。
所有记录,如果我使用record.GetDirectoryEntry()

distinguishedname: CN=xxx,OU=Utenti,OU=Ingegneria,DC=xxx,DC=xxx

无论如何,如果我删除对过滤器的distinguishedname 部分的评论,我将获得零条目!!
我也尝试使用search.PropertiesToLoad.Add("distinguishedname");,但没有运气。
如何在过滤器中搜索distinguishedname

更新:
如果我尝试在 filter 中使用 "(distinguishedname=*)" + ,我仍然会得到六条记录,所以我想我可以搜索专有名称...
UPDATE2:
我也尝试使用Search Active Directory for an OU using a partial path to the OU中的代码:

Filter = "(&(objectClass=user)(ou=Ingegneria))";

但我有零个条目(如果我删除 (objectClass=user) 部分,我有两个)

【问题讨论】:

  • 尝试删除 OU=Ingegneria* 看看会发生什么
  • @Shai:我需要过滤器的那部分...无论如何看看我的更新。
  • 似乎与 stackoverflow.com/questions/5872838/… 重复 - 这可能有助于您按 OU 进行搜索。
  • @AvnerShahar-Kashtan:对不起......它没有帮助:我应该将整个查询更改为首先获取 OU,然后查询它们中的每一个吗?如果是这样,我真的不喜欢这个主意...谢谢

标签: c# active-directory


【解决方案1】:

如果您只想查询,那么您应该在初始连接中绑定到该容器:

// Next row is used to login to AD
string ldapPath = "LDAP://OU=Ingegneria,DC=xxx,DC=xxx";
DirectoryEntry searchRoot = GetEntry(ldapPath, adminUser, adminPassword);

// Here starts the query
DirectorySearcher search = new DirectorySearcher(searchRoot)
{
    SearchScope = SearchScope.Subtree,
    Filter = "(&" +
        "(objectClass=user)" +
        "(givenname=s*)" +
        "(samaccountname=*100)" +
    ")"
};

search.PropertiesToLoad.Add("distinguishedname");
SearchResultCollection result = search.FindAll();

这样,您还可以大大减少广告中需要搜索的空间,从而加快您的搜索速度。

如果您使用的是 .NET 3.5 或更高版本,则可以使用 PrincipalSearcher 和“按示例查询”主体进行搜索:

// create your domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN", "OU=Ingegneria,DC=xxx,DC=xxx");

// define a "query-by-example" principal - here, we search for a UserPrincipal 
UserPrincipal qbeUser = new UserPrincipal(ctx);
qbeUser.GivenName = "s*";
qbeUser.SamAccountName = "*100";

// create your principal searcher passing in the QBE principal    
PrincipalSearcher srch = new PrincipalSearcher(qbeUser);

// find all matches
foreach(var found in srch.FindAll())
{
    // do whatever here - "found" is of type "Principal"
    UserPrincipal userFound = found as UserPrincipal;

    if(userFound != null)
    {
       // do something with your user principal here....
    }
}

如果您还没有 - 一定要阅读 MSDN 文章 Managing Directory Security Principals in the .NET Framework 3.5,它很好地展示了如何充分利用 System.DirectoryServices.AccountManagement 中的新功能

【讨论】:

  • 非常感谢您的回答,真的很完整。我会尽快看看。我唯一的疑问是要搜索的 OU 是动态的(是运行时用户定义的过滤器的一部分)......但我可能可以找到一种管理它的方法。谢谢
  • 只是为了完整:有没有办法搜索绑定 AD 根的 OU(或 distinguishedname 的一部分)?
  • 无论如何,谢谢,您的回答非常有用,并且显示了我可以使用的新对象(对我来说)。你的例子自然而然地奏效了!请注意:Principal 类中的 DistinguishedName 被标记为只读,所以我不能对其使用过滤器...我不知道原因,但它是 Microsoft 设计的,所以可能就是这样应该!! :)
猜你喜欢
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 2011-08-14
  • 2019-03-04
  • 2018-09-24
  • 2018-12-18
  • 2012-03-20
  • 1970-01-01
相关资源
最近更新 更多