我正在编写一个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;
}
答案 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中的正斜杠。