Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Active Directory:此处是否存在无效字符转义以及如何处理_C#_Ssis_Active Directory - Fatal编程技术网

C# Active Directory:此处是否存在无效字符转义以及如何处理

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的列分隔符。注意:

我已经构建了一个通过SSIS中的C#脚本组件从active directory提取数据的过程。此数据需要加载到SQL Server中。我遇到的问题是,DiscrimencedName(DN)和CanonicalName(CN)包含双引号(“)和反斜杠(\)转义字符(请参阅下面的Web链接)

据我所知,所有转义字符都应该有一个前导反斜杠(\)。这是否正确?我之所以这样问,是因为我发现了不正确的实例,因此我无法删除这些转义字符,这导致SSIS导入失败,错误是无法分别找到DN和CN的列分隔符。注意:我已设置双引号(“)作为SSIS连接管理器中的列分隔符。有没有办法在代码中处理这个问题,或者我需要让广告管理员修复它

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