如何在c#中为DistinguishedName转义这些字符

时间:2014-12-12 09:25:48

标签: c# escaping

我正在编写一个c#应用程序来枚举Active Directory(AD)组织单位(OU)列表。作为输入,我传入DistinguishedName(DN)。对于那些不熟悉的人来说,DN就像是FQDN,但对于AD中的特定对象。一切都按预期工作,除非DN包含字符+和/。

处理枚举的子传递错误,我猜是因为字符没有被转义。如何确保 OUPath 路径变量转义此链接中提到的所有字符:http://www.rlmueller.net/CharactersEscaped.htm加“/”? - 谢谢

    String OUPath = textBox1.text;
    DirectoryEntry root = new DirectoryEntry("LDAP://" + OUPath);
    DirectorySearcher searcher = new DirectorySearcher(root);

    searcher.SearchScope = SearchScope.OneLevel;

    var result = searcher.FindAll();

编辑。终于解决了。我是以错误的方式去做的。要转义的字符不是DN中的单词,而是在各个OU名称中,这意味着我必须将它们分开并在再次加入字符串之前单独处理它们。以下功能完全符合我的需要。前导和尾随空格要求作为一个整体应用于DN字符串,并在其他地方处理。特别感谢afrogonabike。

private string escapeOUNameCharacters(string DN) //in ou names
    {
        DN = DN.Replace(txtLDAPPath.Text, "");
        DN = DN.TrimEnd(',');

        string[] OUNames = DN.Split(',');

        string escapedOUNamesInDNPath = "";
        string escapedOUName = "";            

        foreach (string s in OUNames)
        {
            escapedOUName = s.Replace("OU=", "");

            const string escapeChars = @"\";
            const string chars = @",\#+<>;""=";

            //escape the chars that need to be escaped
            foreach (char ch in chars)
            {
                escapedOUName = escapedOUName.Replace(ch.ToString(), escapeChars + ch);
            }

            //custom escape dictionary example:
            var replacements = new Dictionary<string, string>() { {@"/", @"\2F"}};
                                                                //,{@"\", @"\5C"}}; 
            foreach (var pair in replacements)
            {
                escapedOUName = escapedOUName.Replace(pair.Key, pair.Value);
            }

            escapedOUNamesInDNPath = escapedOUNamesInDNPath + "OU=" + escapedOUName + ",";            
        }
        escapedOUNamesInDNPath = escapedOUNamesInDNPath + txtLDAPPath.Text;          

        return escapedOUNamesInDNPath;            
    }

4 个答案:

答案 0 :(得分:1)

尝试在任何字符串之前使用@字符来忽略它可能包含的任何转义字符:

DirectoryEntry root = new DirectoryEntry(@"LDAP://" + OUPath);

编辑:

你也可以在OUPath面前使用@,如下所示:@OUPath

答案 1 :(得分:0)

查看您提供的链接,指出您还必须转义前导和尾随空格(但不是嵌入的空格)。这是一个简单的功能,可以满足您的需求。根据需要调整:

private static string Escape( string s )
{
    const string escapeChars = "\\";
    const string chars = @"/,#+<>;""=";
    string ret = s;

    ret = ret.Replace(escapeChars, escapeChars + escapeChars);

    //escape the chars that need to be escaped
    foreach (char ch in chars)
    {
        ret = ret.Replace(ch.ToString(), escapeChars + ch);
    }

    //escape leading white space
    int whiteSpaceCount = 0;
    while (whiteSpaceCount < ret.Count() && Char.IsWhiteSpace(ret[whiteSpaceCount]))
    {
        ret = String.Format("{0}{1}{2}", ret.Substring(0, whiteSpaceCount), escapeChars,
            ret.Substring(whiteSpaceCount));
        whiteSpaceCount += 1 + escapeChars.Length;
    }

    //escape trailing whitespace
    if (whiteSpaceCount < ret.Count())
    {
        whiteSpaceCount = ret.Count() -1;
        while (whiteSpaceCount >= 0 && Char.IsWhiteSpace(ret[whiteSpaceCount]))
        {
            ret = String.Format("{0}{1}{2}", ret.Substring(0, whiteSpaceCount), escapeChars,
                ret.Substring(whiteSpaceCount));
            whiteSpaceCount--;
        }
    }

    return ret;
}

对于更通用的替换char a,序列b和char c,序列d函数:

private static string Escape( string s )
{
    var replacements = new Dictionary<string, string>() { {@"\", @"\5C"},
                                                          {@"*", @"\2A"},
                                                          {@"(", @"\2B"},
                                                          {@")", @"\29"},
                                                          {@"/", @"\3C"}};
    string ret = s;

    //escape the chars that need to be escaped
    foreach (var pair in replacements)
    {
        ret = ret.Replace(pair.Key, pair.Value);
    }

    var whiteSpaceEscapeChars = @"\";
    //escape leading white space
    int whiteSpaceCount = 0;
    while (whiteSpaceCount < ret.Count() && Char.IsWhiteSpace(ret[whiteSpaceCount]))
    {
        ret = String.Format("{0}{1}{2}", ret.Substring(0, whiteSpaceCount), whiteSpaceEscapeChars,
            ret.Substring(whiteSpaceCount));
        whiteSpaceCount += 1 + whiteSpaceEscapeChars.Length;
    }

    //escape trailing whitespace
    if (whiteSpaceCount < ret.Count())
    {
        whiteSpaceCount = ret.Count() -1;
        while (whiteSpaceCount >= 0 && Char.IsWhiteSpace(ret[whiteSpaceCount]))
        {
            ret = String.Format("{0}{1}{2}", ret.Substring(0, whiteSpaceCount), whiteSpaceEscapeChars,
                ret.Substring(whiteSpaceCount));
            whiteSpaceCount--;
        }
    }

    return ret;
}

答案 2 :(得分:0)

您可以转义+/字符,如下所示:

path = path.Replace("+", "\\+");
path = path.Replace("/", "\\/");

然后使用转义路径。

你需要像其他人一样逃脱其他角色;请参阅http://www.rlmueller.net/CharactersEscaped.htm以获取列表。

答案 3 :(得分:0)

似乎这是该领域的一个非常大的问题。许多商业产品也在努力处理DN中的正斜杠。

https://www.google.com/search?q=AD+OU+forward+slash&biw=1280&bih=871&psj=1&ei=QNCKVNbJKsv7ywOgtYKwCQ&start=10&sa=N&cad=cbv&sei=OtWKVJPvGMuBywOp8YGQBQ