AD 搜索中的反转筛选器



我想在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]);
    }
}

您会发现无论如何,这将执行得更快。根据我的经验,直接使用 DirectorySearcherDirectoryEntry 总是比使用 PrincipalSearcher(或 AccountManagement 命名空间中的任何内容(快得多。不久前,我写了一篇关于这个主题的文章:Active Directory:更好的性能

最新更新