2012-02-26 51 views
9

当我运行此查询的DirectorySearcher过滤

// 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

UPDATE:
如果我尝试使用过滤器"(distinguishedname=*)" +,我仍然得到六个记录,所以我想我可以在搜索的distinguishedName ...
UPDATE2:
我还试图用代码在Search Active Directory for an OU using a partial path to the OU

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

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

+0

尝试删除'OU = INGEGNERIA *',看看会发生什么 – Shai 2012-02-26 08:39:40

+0

@Shai:我需要的过滤器的那部分......无论如何看看我的更新。 – Marco 2012-02-26 08:46:44

+0

似乎是http://stackoverflow.com/questions/5872838/search-active-directory-for-an-ou-using-a-partial-path-to-the-ou的重复 - 这可能会帮助您搜索由OU。 – 2012-02-26 09:31:32

回答

23

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

// 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

+0

非常感谢你的回答,它确实是完整的。我会尽快看一看。我唯一的疑问是,要搜索的OU是动态的(是运行时用户定义的过滤器的一部分)......但我可能找到一种方法来管理它。谢谢 – Marco 2012-02-26 09:58:21

+0

只是为了完成:是否有一种方法来搜索绑定AD根的OU(或在我的问题中的'distinguishedname'的一部分)? – Marco 2012-02-26 10:04:44

+0

@Marco:我真的不知道,对不起 - 从来没有尝试过我自己..... – 2012-02-26 10:21:17