在AD搜索中反转过滤器

时间:2019-04-26 13:27:20

标签: c# active-directory

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

1 个答案:

答案 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]);
    }
}

您会发现此方法无论如何都会更快。以我的经验,直接使用DirectorySearcherDirectoryEntry总是比使用PrincipalSearcher(或AccountManagement名称空间中的任何东西)要快得多。不久前,我写了一篇有关该主题的文章:Active Directory: Better Performance