C# 按正则表达式筛选的DirectorySearcher筛选器

C# 按正则表达式筛选的DirectorySearcher筛选器,c#,regex,active-directory,C#,Regex,Active Directory,我使用以下代码从ActiveDirectory获取所有用户: List<string> userIds = new List<string>(); Regex userRegex = new Regex("^user[0-9]{8}z$", RegexOptions.IgnoreCase); DirectoryEntry rootEntry = new DirectoryEntry("LDAP://mydomain.com"); rootEntry.Authentica

我使用以下代码从ActiveDirectory获取所有用户:

List<string> userIds = new List<string>();
Regex userRegex = new Regex("^user[0-9]{8}z$", RegexOptions.IgnoreCase);

DirectoryEntry rootEntry = new DirectoryEntry("LDAP://mydomain.com");
rootEntry.AuthenticationType = AuthenticationTypes.Secure;
DirectorySearcher searcher = new DirectorySearcher(rootEntry)
{
    PageSize = int.MaxValue,
    Filter = "(&(objectClass=user)(objectCategory=person))"
};

foreach (SearchResult result in searcher.FindAll())
{
    string userId = result.Properties["samaccountname"].Count > 0
        ? result.Properties["samaccountname"][0].ToString()
        : string.Empty;

    if (userRegex.IsMatch(userId))
    {
        userIds.Add(userId);
    }
}
但是我没有得到任何结果


所有用户ID都有语法
user56238941z

LDAP查询不支持正则表达式,因此您无法获得准确的查询,但您可以接近,然后像已经做过的那样应用正则表达式

您可以尝试在查询的中间使用通配符,如奥利弗所建议的(我不知道广告是否允许,所以尝试它-我现在不能)查找用户名从“代码>用户< /代码>开始,并以<代码> z < /代码>结尾的帐户:

(&(objectClass=user)(objectCategory=person)(sAMAccountName=user*z))
如果不起作用,您可以查找用户名以
user
开头的任何帐户,如下所示:

(&(objectClass=user)(objectCategory=person)(sAMAccountName=user*))
(&(objectClass=user)(objectCategory=person)(|(sAMAccountName=user1*)(sAMAccountName=user2*)(sAMAccountName=user3*)(sAMAccountName=user4*)(sAMAccountName=user5*)(sAMAccountName=user5*)(sAMAccountName=user6*)(sAMAccountName=user7*)(sAMAccountName=user8*)(sAMAccountName=user9*)(sAMAccountName=user0*)))
如果仍然返回太多结果并影响性能,则可以将其扩展为仅返回用户名以
user
开头,后跟数字的帐户,如下所示:

(&(objectClass=user)(objectCategory=person)(sAMAccountName=user*))
(&(objectClass=user)(objectCategory=person)(|(sAMAccountName=user1*)(sAMAccountName=user2*)(sAMAccountName=user3*)(sAMAccountName=user4*)(sAMAccountName=user5*)(sAMAccountName=user5*)(sAMAccountName=user6*)(sAMAccountName=user7*)(sAMAccountName=user8*)(sAMAccountName=user9*)(sAMAccountName=user0*)))

我不知道DirectorySearcher,但如果可以进行通配符搜索,可以使用通配符进行预筛选。类似于
user?????z
user*z
。然后,您将使用更精确的正则表达式过滤器优化结果。