在 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);

                }

            }

        }


忽然笑
浏览 154回答 1
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:更好的性能
打开App,查看更多内容
随时随地看视频慕课网APP