Экранирование значений в поиске LDAP - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть следующий код, который позволяет мне искать группу по ее SamAaccountName:

public static DirectoryEntry GetGroup(string groupSamName)
{
    string sFilter = "(&(objectClass=group)" +
        "(objectCategory=Group)" +
        "(SAMAccountName=" + groupSamName + "))";

    // find group
    SearchResult srGroup = SearchOne(sFilter, null);

    if (srGroup == null)
    {
        throw new Exception("AD Group '" + groupSamName + "' not found.");
    }

    DirectoryEntry deGroup = srGroup.GetDirectoryEntry();

    return deGroup;
}

private static SearchResult SearchOne(string sFilter, string[] propertiesToLoad)
{
    DirectoryEntry deDomain = GetADDomain();

    // create directory searcher
    DirectorySearcher dsSearch = new DirectorySearcher(deDomain);
    dsSearch.CacheResults = false;
    dsSearch.Filter = sFilter;

    if (propertiesToLoad != null && propertiesToLoad.Length > 0)
    {
        dsSearch.PropertiesToLoad.AddRange(propertiesToLoad);
    }

    SearchResult sr = dsSearch.FindOne();

    return sr;
}

Если я хочу выполнить поиск по SamAccountName из __Test (Test Group) - Restricted, это на самом деле работает, когда я ожидал, что скобка сломает синтаксис поиска.

Что мне нужно убежать и что мне не нужно бежать?

1 Ответ

0 голосов
/ 01 апреля 2020

Это работает только потому, что у вас есть открывающие и закрывающие скобки, и он может выяснить, что все это является частью условия. Однако, если у вас есть только открывающая или закрывающая скобка, например:

(&(objectClass=group)(objectCategory=group)(sAMAccountName=__Test (Test Group - Restricted))

Она сломается.

Чтобы избежать этого, вы можете избежать скобок во всех случаев. Эта статья под заголовком «Специальные символы» описывает, какие символы следует экранировать и как это сделать. В вашем случае вы бы заменили ( на \28 и ) на \29:

(&(objectClass=group)(objectCategory=group)(sAMAccountName=__Test \28Test Group\29 - Restricted))
...