我想在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);
}
}
}
你不能使用
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:更好的性能