我正在使用 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 的两个十六进制数字 编码字符的值。两个十六进制的情况 数字并不重要。 块引用
所以反斜杠应该是 ' c'
但我从 AD 的上述过滤器没有得到任何结果。另外,如果我将该过滤器放入 AD 管理控制台自定义过滤器中,它也不起作用。 当我从过滤器中删除 5c 时,它可以在 java 和 AD 控制台中运行。
我在这里遗漏了什么吗?
当然,我可以在没有 5c 的情况下对过滤器进行编码,但我不确定它的方式是否正确,我更喜欢让 spring 对过滤器进行编码,因为它知道很多我应该手动执行的事情。
我找到了 php 的解决方案来获取具有 objectGUID 的用户 etap 1 当我创建用户时,我将他的 objectGuid 放入 bdd 中,即您在广告中看到的 objectGuid ex $guid_str = "31207E1C-D81C-4401-8356-33FEF9C8A" 在我创建自己的函数来转换这个对象 id int hexadé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;
}
这个函数返回一个像 C E C\D8 $\83\EF\9C\8A"\F9\ED\C2 F 这样的字符串,之后我把这个字符串放入我的过滤器中,然后得到用户
#获取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
传递一个字节数组并且搜索应该可以工作。
ZeroCool 答案的 C# 版本.. 很有魅力。
public static void Main()
{
string guid = "aabbccdd-1122-3344-5566-77889900aabb";
string result = GuidToHex(guid);
Console.WriteLine(result);
}
public static string GuidToHex(string guidStr)
{
string[] strG = guidStr.Split('-');
// Reverse the first three segments
strG[0] = ReverseString(strG[0]);
strG[1] = ReverseString(strG[1]);
strG[2] = ReverseString(strG[2]);
StringBuilder retour = new StringBuilder("\\");
int strRev = 0;
foreach (var str in strG)
{
string tempStr = str;
for (int i = 0; i < tempStr.Length + 2; i++)
{
if (strRev < 3)
retour.Append(ReverseString(tempStr.Substring(0, 2))).Append('\\');
else
retour.Append(tempStr.Substring(0, 2)).Append('\\');
tempStr = tempStr.Length > 2 ? tempStr.Substring(2) : string.Empty;
}
if (strRev < 3)
retour.Append(ReverseString(tempStr));
else
retour.Append(tempStr);
strRev++;
}
return retour.ToString();
}
private static string ReverseString(string s)
{
char[] arr = s.ToCharArray();
Array.Reverse(arr);
return new string(arr);
}