php - Active Directory、PHP 的 ldap_search 和 objectGUID
问题描述
我已设法解码objectGUID
Active Directory 服务器发送给我的信息,以便创建 UUID 字符串 ( xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx
)。但似乎我无法可靠地将其转换回来以使用ldap_search
.
有时搜索有效,有时会因ldap_search(): Search: Bad search filter
错误而失败。如果它有帮助,这个 uuid 有效 ( 1a5313e5-d8e4-42b4-b3a0-6bd96bd86e75
) 而那些无效 ( 3222a300-0beb-4650-a37d-f75bec68959c
, 833d21dc-8229-47ec-98c0-792b81f92206
)。
这是我现在拥有的:
/**
* This always manages to convert the GUID into a valid UUID
*/
function objectGuidToUuidString(string $objectGuid): string
{
$unpacked = array_map('dechex', unpack('V_a/v2_b/n4_c', $objectGuid));
$unpacked['_a'] = str_pad($unpacked['_a'], 8, '0', STR_PAD_LEFT);
$unpacked['_b1'] = str_pad($unpacked['_b1'], 4, '0', STR_PAD_LEFT);
$unpacked['_b2'] = str_pad($unpacked['_b2'], 4, '0', STR_PAD_LEFT);
$unpacked['_c1'] = str_pad($unpacked['_c1'], 4, '0', STR_PAD_LEFT);
$unpacked['_c2'] = str_pad($unpacked['_c2'], 4, '0', STR_PAD_LEFT);
$unpacked['_c3'] = str_pad($unpacked['_c3'], 4, '0', STR_PAD_LEFT);
$unpacked['_c4'] = str_pad($unpacked['_c4'], 4, '0', STR_PAD_LEFT);
return "{$unpacked['_a']}-{$unpacked['_b1']}-{$unpacked['_b2']}-{$unpacked['_c1']}-{$unpacked['_c2']}{$unpacked['_c3']}{$unpacked['_c4']}";
}
/**
* This don't always work.
*/
function uuidStringToObjectGuid(string $uuidString): string
{
$uuidString = str_replace('-', '', $uuidString);
$pieces = [
ltrim(substr($uuidString, 0, 8), '0'),
ltrim(substr($uuidString, 8, 4), '0'),
ltrim(substr($uuidString, 12, 4), '0'),
ltrim(substr($uuidString, 16, 4), '0'),
ltrim(substr($uuidString, 20, 4), '0'),
ltrim(substr($uuidString, 24, 4), '0'),
ltrim(substr($uuidString, 28, 4), '0'),
];
$pieces = array_map('hexdec', $pieces);
return pack('Vv2n4', ...$pieces);
}
function doSearch(string $uuidString)
{
$guidString = uuidStringToObjectGuid($uuidString);
$searchResult = ldap_search($boundConnection, $baseDn, "(objectguid=$guidString)");
[...]
}
解决方案
推荐阅读
- java - 无法在 Java 中将 int 转换为字符串
- android - 如何将在我的 android 上运行的 localhost 服务器提供给我的 android 热点客户端?
- e2e-testing - 赛普拉斯测试:.contains() 是否等同于 should('contain')?
- python - OperationalError:数据库被锁定在 SQLite3
- .net - 为什么 .NET 框架倾向于使用“int”而不是无符号整数?
- javascript - HTA中的Javascript单选选项多个值
- jquery - 如何更改 JQuery Datatable 中的行颜色
- java - Java方法返回内存地址
- google-apps-script - 使用 Apps 脚本从 CSV 列表创建单元内下拉列表(Google 表格数据验证)
- ios - 防止 UIViewController 在模态旋转时旋转