使用通配车/正则表达式在 AD 中搜索用户

本文关键字:AD 搜索 用户 正则表达式 | 更新日期: 2023-09-27 18:32:17

我已经想出了如何搜索广告,但是为了获得搜索结果,我的搜索必须准确。我不能只是精确。问题是我必须根据电话号码查找用户,而这些格式可以写成与键入它们的人一样多的格式。我的输入始终是MSISDN,只是数字,中间没有空格或额外的字符,AD中的字段绝不那么简单。

如何在不检索所有用户并在软件中进行扫描的情况下搜索此类号码。

例如,我正在查看字段"移动"和"电话号码"。

例如,AD中的数字可以是"+45 12 34 56 78"或"(555)1234",后者很难成为有效的MSISDN,但想法是一样的,从计算机的角度来看,各种各样的疯狂。如果我查找所有用户,我可以通过删除所有非数字来生成 MSISDN,但我怀疑如果我每次需要查找数字时都开始转储他们的整个 AD,企业会很高兴。

示例代码:

        String domain = "example.com";
        String msisdn = "4512345678";
        // create your domain context
        PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domain);
        DirectorySearcher ds = new DirectorySearcher(ctx.ConnectedServer);
        ds.Filter = String.Format("(mobile={0})", msisdn);
        ds.PropertiesToLoad.Add("cn");
        ds.PropertiesToLoad.Add("sn");
        ds.PropertiesToLoad.Add("name");
        ds.PropertiesToLoad.Add("mail");
        ds.PropertiesToLoad.Add("mobile");
        ds.PropertiesToLoad.Add("telephoneNumber");
        foreach (SearchResult de in ds.FindAll())
        {
            Console.WriteLine("");
            foreach (String key in de.Properties.PropertyNames)
            {
                Console.WriteLine("{0}: {1}", key.PadRight(30, '.'), de.Properties[key].Count);
                int i = 1;
                foreach (String prop in de.Properties[key])
                {
                    Console.WriteLine("{0}: {1}", (String.Format("[{0}]", (i++)).PadLeft(30, ' ')), prop);
                }
            }
            Console.WriteLine("");
        }

使用通配车/正则表达式在 AD 中搜索用户

您可以将通配符放入过滤器中。 我有一个类似的程序,我可以在其中搜索名称以输出电话号码。

我这样过滤:

static SearchResultCollection GetUsers(string target)
    {
        DirectoryEntry domain = new DirectoryEntry(<removed fqdn>);
        DirectorySearcher searcher = new DirectorySearcher(domain);
        searcher.Filter = "(&(objectClass=User)(displayName=*" + target + "*))";
        searcher.Sort = new SortOption("displayName", SortDirection.Ascending);
        return searcher.FindAll();
    }