首页 > 解决方案 > 在 LDAP 搜索中转义值

问题描述

我有以下代码,可让我按其搜索组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;
}

如果我想按SamAccountNameof进行搜索__Test (Test Group) - Restricted,它实际上可以工作,而我原本预计括号会破坏搜索语法。

什么我需要逃避,什么我不需要逃避?

标签: c#active-directoryldap

解决方案


它之所以有效,是因为您有左括号和右括号,并且它可以确定整个事物是条件的一部分。但是,如果你只有一个左括号右括号,像这样:

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

它会破裂。

为避免这种情况,您可以在所有情况下转义括号。这篇文章,在“特殊字符”标题下,描述了应该转义哪些字符以及如何转义。在您的情况下,您将替换(\28和:)\29

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

推荐阅读