如何在 c# 中转义这些字符以获得可分辨名称

本文关键字:字符 转义 | 更新日期: 2023-09-27 18:34:01

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

处理枚举的 sub 传递错误,我猜是因为字符尚未转义。如何确保 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 字符串,并在其他地方处理。特别感谢非洲自行车。

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;            
    }

如何在 c# 中转义这些字符以获得可分辨名称

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

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;
}

或者对于更通用的字符 a 与序列 b 和字符 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;
}

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

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

编辑:

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

您可以像这样转义+/字符:

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

然后使用转义路径。

还有其他字符需要像这样转义;有关列表,请参阅 http://www.rlmueller.net/CharactersEscaped.htm。