我有以下代码可以从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);
}
}这很好,但是要从searcher.FindAll()获得所有用户需要大约50秒的时间。
我想知道是否可以将userRegex移到DirectorySearcher的过滤器上。
我试过:
Filter = "(&(objectClass=user)(objectCategory=person)(samaccountname=user[0-9]{8}z))"但我没有得到任何结果。
所有用户ids的语法都是user56238941z。
发布于 2019-08-27 16:51:19
LDAP查询不支持RegEx,所以您无法得到确切的查询,但是您可以接近它,然后像已经在做的那样应用RegEx。
您可以像奥利弗建议的那样,在查询中间使用通配符(我不知道AD是否允许这样做,所以尝试一下--我现在还不能)来查找用户名以user开头,以z结尾的帐户
(&(objectClass=user)(objectCategory=person)(sAMAccountName=user*z))如果这不起作用,您可以查找用户名以user开头的任何帐户,如下所示:
(&(objectClass=user)(objectCategory=person)(sAMAccountName=user*))如果仍然返回太多的结果并影响性能,则可以将其展开为只返回用户名以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*)))https://stackoverflow.com/questions/57677323
复制相似问题