簡體   English   中英

DirectorySearcher按正則表達式過濾

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM