首页 > 解决方案 > Active Directory、PHP 的 ldap_search 和 objectGUID

问题描述

我已设法解码objectGUIDActive 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)");
  [...]
}

标签: phpactive-directoryldapuuidguid

解决方案


推荐阅读