我想在AD中搜索名称不是以前缀开头的所有用户。
我应该怎么做?
这不起作用
using (var context = new PrincipalContext(ContextType.Domain, "my_do_main"))
{
UserPrincipal template = new UserPrincipal(context);
template.UserPrincipalName = "!my_prefix*"; //invertion NOT works
using (var searcher = new PrincipalSearcher(template))
{
foreach (var result in searcher.FindAll())
{
var de = result.GetUnderlyingObject() as DirectoryEntry;
Console.WriteLine(de.Properties["userPrincipalName"].Value);
}
}
}
答案 0 :(得分:1)
您无法使用PrincipalSearcher
来执行此操作,但是可以使用DirectorySearcher
来执行此操作,这正是PrincipalSearcher
在幕后使用的方式。这是一个简单的示例:
var search = new DirectorySearcher(new DirectoryEntry("LDAP://my_do_main")) {
PageSize = 1000,
Filter = "(&(objectClass=user)(!userPrincipalName=my_prefix*))"
};
search.PropertiesToLoad.Add("userPrincipalName");
using (var results = search.FindAll()) {
foreach (SearchResult result in results) {
Console.WriteLine((string) result.Properties["userPrincipalName"][0]);
}
}
您会发现此方法无论如何都会更快。以我的经验,直接使用DirectorySearcher
和DirectoryEntry
总是比使用PrincipalSearcher
(或AccountManagement
名称空间中的任何东西)要快得多。不久前,我写了一篇有关该主题的文章:Active Directory: Better Performance