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