[英]DirectorySearcher Filter by Regex
我有以下代碼從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);
}
}
這樣做正常,但要花費約50秒才能從searcher.FindAll()
獲得所有用戶。
我想知道是否可以將userRegex移到DirectorySearcher
的Filter?
我試過了:
Filter = "(&(objectClass=user)(objectCategory=person)(samaccountname=user[0-9]{8}z))"
但是后來我沒有結果。
所有用戶標識的語法為user56238941z
LDAP查詢不支持RegEx,因此您無法獲得確切的查詢,但是您可以關閉它,然后像已經做的那樣仍然應用RegEx。
您可以嘗試在查詢中間使用通配符,如Oliver建議的那樣(我不知道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*)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.