我正在使用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))
必须将字符编码为反斜杠'\'字符(ASCII 0x5c)后跟表示ASCII的两个十六进制数字 编码字符的值。两个十六进制的情况 数字不重要。 块引用
所以反斜杠应该是'\ 5c'
但是我从AD上面的过滤器中得不到任何结果。如果我将该过滤器放在AD管理控制台自定义过滤器中,它也不起作用。 当我从过滤器中删除5c时,它可以从java和AD控制台中运行。
我在这里错过了什么吗?
当然我可以在没有5c的情况下对滤镜进行编码,但我确定它是正确的方式,我更喜欢让spring对滤镜进行编码,因为它知道我应该手动做很多事情。
答案 0 :(得分:3)
我认为:http://www.developerscrappad.com/1109/windows/active-directory/java-ldap-jndi-2-ways-of-decoding-and-using-the-objectguid-from-windows-active-directory/上的博客条目提供了您需要的信息。
答案 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)
传递一个字节数组,搜索应该有效。