C# Active Directory:此处是否存在无效字符转义以及如何处理
我已经构建了一个通过SSIS中的C#脚本组件从active directory提取数据的过程。此数据需要加载到SQL Server中。我遇到的问题是,DiscrimencedName(DN)和CanonicalName(CN)包含双引号(“)和反斜杠(\)转义字符(请参阅下面的Web链接) 据我所知,所有转义字符都应该有一个前导反斜杠(\)。这是否正确?我之所以这样问,是因为我发现了不正确的实例,因此我无法删除这些转义字符,这导致SSIS导入失败,错误是无法分别找到DN和CN的列分隔符。注意:我已设置双引号(“)作为SSIS连接管理器中的列分隔符。有没有办法在代码中处理这个问题,或者我需要让广告管理员修复它C# Active Directory:此处是否存在无效字符转义以及如何处理,c#,ssis,active-directory,C#,Ssis,Active Directory,我已经构建了一个通过SSIS中的C#脚本组件从active directory提取数据的过程。此数据需要加载到SQL Server中。我遇到的问题是,DiscrimencedName(DN)和CanonicalName(CN)包含双引号(“)和反斜杠(\)转义字符(请参阅下面的Web链接) 据我所知,所有转义字符都应该有一个前导反斜杠(\)。这是否正确?我之所以这样问,是因为我发现了不正确的实例,因此我无法删除这些转义字符,这导致SSIS导入失败,错误是无法分别找到DN和CN的列分隔符。注意:
string strDistinguishedName = objConverter.ConvertToString(searchResult, "distinguishedName").Replace("\"","").Replace("\\"","");
Input1: "CN=SomethingHere “Got Rocks\\\" OtherTextHere,OU=Blah,OU=Bleh,DC=jweezy,DC=com"
Output1: "CN=SomethingHere “Got Rocks OtherTextHere,OU=Blah,OU=Bleh,DC=jweezy,DC=com"
Input2: "CN=SomethingHere2 “Got Gravel" OtherTextHere2,OU=Blah2,OU=Bleh,DC=jweezy,DC=com"
Output2: "CN=SomethingHere2 “Got Gravel" OtherTextHere2,OU=Blah2,OU=Bleh,DC=jweezy,DC=com"
问题似乎是由于缺少转义字符造成的,因此我认为输入应如下所示:
Input1: "CN=SomethingHere \“Got Rocks\" OtherTextHere,OU=Blah,OU=Bleh,DC=jweezy,DC=com"
Input2: "CN=SomethingHere2 \“Got Gravel\" OtherTextHere2,OU=Blah2,OU=Bleh,DC=jweezy,DC=com"
当他们说双引号需要转义时,他们指的是引号字符: 在这种情况下:
Input1: "CN=SomethingHere “Got Rocks\\\" OtherTextHere,OU=Blah,OU=Bleh,DC=jweezy,DC=com"
您看到的未转义字符(“
)不同。它是左双引号:
这对广告没有特殊意义,因此不需要逃避
但是这个:
Input2: "CN=SomethingHere2 “Got Gravel" OtherTextHere2,OU=Blah2,OU=Bleh,DC=jweezy,DC=com"
如果您复制并粘贴的内容与原样完全一致,则我无法发表评论。单词“grade”后的引号应该转义。刚才,我尝试重命名一个帐户并添加一个引号,它会自动转义到DN中。当他们说需要转义双引号时,他们指的是引号字符:
/// <summary>
/// Escapes the LDAP search filter to prevent LDAP injection attacks.
/// </summary>
private static string EscapeLdapSearchFilter(string searchFilter)
{
StringBuilder escape = new StringBuilder();
for (int i = 0; i < searchFilter.Length; ++i)
{
char current = searchFilter[i];
switch (current)
{
case '\\':
escape.Append(@"\5c");
break;
case '/':
escape.Append(@"\2f");
break;
case '(':
escape.Append(@"\28");
break;
case ')':
escape.Append(@"\29");
break;
case '\u0000':
escape.Append(@"\00");
break;
case '*':
escape.Append(@"\2a");
break;
default:
escape.Append(current);
break;
}
}
return escape.ToString();
}
/// <summary>
/// When renaming a DirectoryEntry via "DE.Rename(newCN)"
/// you will need to escape certain character(s) ... ex. "," to "\,"
/// </summary>
private static string EscapeFullNameFilter(string unescapedString)
{
StringBuilder escape = new StringBuilder();
for (int i = 0; i < unescapedString.Length; ++i)
{
char current = unescapedString[i];
switch (current)
{
case '\\':
case ',':
case ';':
case '"':
case '=':
case '+':
case '<':
case '>':
case '#':
escape.Append(@"\"); //We need to show to escape the current char, so we add this before it.
escape.Append(current);
break;
default:
escape.Append(current);
break;
}
}
return escape.ToString();
}
在这种情况下:
Input1: "CN=SomethingHere “Got Rocks\\\" OtherTextHere,OU=Blah,OU=Bleh,DC=jweezy,DC=com"
您看到的未转义字符(“
)不同。它是左双引号:
这对广告没有特殊意义,因此不需要逃避
但是这个:
Input2: "CN=SomethingHere2 “Got Gravel" OtherTextHere2,OU=Blah2,OU=Bleh,DC=jweezy,DC=com"
如果您复制并粘贴的内容与原样完全一致,那么我无法发表评论。单词“grade”后的引号应该转义。刚才,我尝试重命名一个帐户并添加一个引号,它会自动转义到DN中。//
/// <summary>
/// Escapes the LDAP search filter to prevent LDAP injection attacks.
/// </summary>
private static string EscapeLdapSearchFilter(string searchFilter)
{
StringBuilder escape = new StringBuilder();
for (int i = 0; i < searchFilter.Length; ++i)
{
char current = searchFilter[i];
switch (current)
{
case '\\':
escape.Append(@"\5c");
break;
case '/':
escape.Append(@"\2f");
break;
case '(':
escape.Append(@"\28");
break;
case ')':
escape.Append(@"\29");
break;
case '\u0000':
escape.Append(@"\00");
break;
case '*':
escape.Append(@"\2a");
break;
default:
escape.Append(current);
break;
}
}
return escape.ToString();
}
/// <summary>
/// When renaming a DirectoryEntry via "DE.Rename(newCN)"
/// you will need to escape certain character(s) ... ex. "," to "\,"
/// </summary>
private static string EscapeFullNameFilter(string unescapedString)
{
StringBuilder escape = new StringBuilder();
for (int i = 0; i < unescapedString.Length; ++i)
{
char current = unescapedString[i];
switch (current)
{
case '\\':
case ',':
case ';':
case '"':
case '=':
case '+':
case '<':
case '>':
case '#':
escape.Append(@"\"); //We need to show to escape the current char, so we add this before it.
escape.Append(current);
break;
default:
escape.Append(current);
break;
}
}
return escape.ToString();
}
///转义LDAP搜索筛选器以防止LDAP注入攻击。
///
专用静态字符串EscapeLdapSearchFilter(字符串搜索筛选器)
{
StringBuilder escape=新建StringBuilder();
for(int i=0;i
//
///转义LDAP搜索筛选器以防止LDAP注入攻击。
///
专用静态字符串EscapeLdapSearchFilter(字符串搜索筛选器)
{
StringBuilder escape=新建StringBuilder();
for(int i=0;i