使用rfc2254中指定的objectGUID编码的活动目录过滤器不起作用

时间:2013-02-18 12:02:01

标签: active-directory ldap jndi spring-ldap active-directory-group

我正在使用java ldap来访问活动目录,更具体地说是spring ldap。 当按照rfc2254中的规定对过滤器进行编码时,objectGUID的组搜索不会产生任何结果。

这是其十六进制表示中的guid:

\49\00\f2\58\1e\93\69\4b\ba\5f\8b\86\54\e9\d8\e9

spring ldap对过滤器进行编码:

(&(objectClass=group)(objectGUID=\5c49\5c00\5cf2\5c58\5c1e\5c93\5c69\5c4b\5cba\5c5f\5c8b\5c86\5c54\5ce9\5cd8\5ce9))

rfc2254和微软technet中提到的那样:

  

必须将字符编码为反斜杠'\'字符(ASCII      0x5c)后跟表示ASCII的两个十六进制数字      编码字符的值。两个十六进制的情况      数字不重要。   块引用

所以反斜杠应该是'\ 5c'

但是我从AD上面的过滤器中得不到任何结果。如果我将该过滤器放在AD管理控制台自定义过滤器中,它也不起作用。 当我从过滤器中删除5c时,它可以从java和AD控制台中运行。

我在这里错过了什么吗?

当然我可以在没有5c的情况下对滤镜进行编码,但我确定它是正确的方式,我更喜欢让spring对滤镜进行编码,因为它知道我应该手动做很多事情。

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:1)

我找到了使用php的解决方案来获取用户的objectGUID etap one当我创建用户时我把他的objectGuid放在bdd中,你在ad ex $ guid_str =“31207E1C-D81C-4401-8356-33FEF9C8A”中看到的objectGuid 在我创建自己的函数以转换此对象idinthexadécimal

之后
function guidToHex($guid_str){

$str_g= explode('-',$guid_str);

$str_g[0] = strrev($str_g[0]);
$str_g[1] = strrev($str_g[1]);
$str_g[2] = strrev($str_g[2]);

$retour = '\\';
$strrev = 0;
foreach($str_g as $str){
    for($i=0;$i < strlen($str)+2; $i++){
        if($strrev < 3)
            $retour .= strrev(substr($str,0,2)).'\\' ;
            else
                $retour .= substr($str,0,2).'\\' ;
                $str = substr($str,2);

    }
    if($strrev < 3)
        $retour .= strrev($str);
        else
            $retour  .= $str ;


            $strrev++;
}
return $retour;

}

此函数返回一个字符串,如\ 1C \ 7E \ 20 \ 31 \ 1C \ D8 \ 01 \ 44 \ 83 \ EF \ 9C \ 8A“\ F9 \ ED \ C2 \ 7F之后我将此字符串放入我的过滤器,我得到了用户

获取objectGuid的格式 我使用这个在互联网上发声的功能

function convertBinToMSSQLGuid($binguid)
{
    $unpacked = unpack('Va/v2b/n2c/Nd', $binguid);
    return sprintf('%08X-%04X-%04X-%04X-%04X%08X', $unpacked['a'], $unpacked['b1'], $unpacked['b2'], $unpacked['c1'], $unpacked['c2'], $unpacked['d']);
}

我的意思是这种格式= 31207E1C-D81C-4401-8356-33FEF9C8A

答案 2 :(得分:0)

传递一个字节数组,搜索应该有效。