ldap_get_values_len

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_get_values_len从结果条目获取所有二进制值

描述

ldap_get_values_len(LDAP\Connection $ldap, LDAP\ResultEntry $entry, string $attribute): array|false

读取结果条目中属性的所有值。

此函数的使用方式与 ldap_get_values() 完全相同,区别在于它处理的是二进制数据,而不是字符串数据。

参数

ldap

ldap_connect() 返回的 LDAP\Connection 实例。

entry

一个 LDAP\ResultEntry 实例。

attribute

返回值

成功时返回属性值的数组,错误时返回 false。各个值可以通过数组中的整数索引访问。第一个索引为 0。值的个数可以通过访问结果数组中的 "count" 索引来获取。

变更日志

版本 描述
8.1.0 ldap 参数现在需要一个 LDAP\Connection 实例;之前需要一个有效的 ldap link 资源
8.1.0 entry 参数现在需要一个 LDAP\ResultEntry 实例;之前需要一个有效的 ldap result entry 资源

参见

添加笔记

用户贡献的笔记 9 笔记

gizmotronic at gmail dot com
9 年前
重新审视将二进制 objectGUID 转换为字符串的问题,有一个更简单的方法,不需要进行大量的字符串操作

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

当然,如果喜欢使用小写十六进制数字,可以在 sprintf 格式字符串中将 "X" 替换为 "x"。
ashwini at majestik dot net
11 年前
只是对下面 "jhgustafsson" 关于 "objectGUID" 字段的笔记的一个小更新...

更进一步,有时将此 GUID 显示为字符串很有用,Microsoft 有一篇支持文章和脚本详细介绍了如何将 objectGUID 从十六进制转换为字符串。该文章位于:http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B325649

下面是一个 PHP 函数,它与 Microsoft 的 VB 脚本做同样的事情,它接受二进制格式的 objectGUID 输入,并将其格式化为字符串(在将其转换为十六进制作为中间步骤之后)。这将返回与 Active Directory 中任何对象的 ADUC 中显示的 "objectGUID" 值完全相同的 "objectGUID" 值。

示例输出:3f79048f-42cd-4c77-8426-835cd9f8a3ad

function GUIDtoStr($binary_guid) {
$hex_guid = unpack("H*hex", $binary_guid);
$hex = $hex_guid["hex"];

$hex1 = substr($hex, -26, 2) . substr($hex, -28, 2) . substr($hex, -30, 2) . substr($hex, -32, 2);
$hex2 = substr($hex, -22, 2) . substr($hex, -24, 2);
$hex3 = substr($hex, -18, 2) . substr($hex, -20, 2);
$hex4 = substr($hex, -16, 4);
$hex5 = substr($hex, -12, 12);

$guid_str = $hex1 . "-" . $hex2 . "-" . $hex3 . "-" . $hex4 . "-" . $hex5;

return $guid_str;
}
Stav
13 年前
我在使用 ldap_get_values_len() 解码时遇到了很多问题,并且在很多论坛上发现了许多没有得到解答的求助信息。

错误消息是 - Warning: ldap_get_values(): Cannot get the value(s) of attribute Decoding error in xxx.php。

似乎这个错误涵盖了许多问题,包括属性名称的简单拼写错误。

在使用 PHP 列出特定记录的属性之后,我注意到属性 userCertificate 不是简单地列为 userCertificate,而是列为 userCertificate;binary。我将这写入了我的代码,问题就解决了。

所以我的代码如下所示。

<?php
if (!$val = @ldap_get_values_len($con, $entry, "$attribute;binary"))
die (
'Error retrieving value (' . ldap_error($con) . ')');
?>

希望这能帮其他人避免我花时间在 Google 上寻找答案的痛苦。
derek dot ethier at gmail dot com
17 年前
为了详细说明 rcrow 的帖子,如果你想将 objectSID 值转换为可用的字符串(来自 Active Directory),以下函数可以做到(这是从手册的另一个部分借来的,只是想在这里添加一下)

// 返回文本 SID
function bin_to_str_sid($binsid) {
$hex_sid = bin2hex($binsid);
$rev = hexdec(substr($hex_sid, 0, 2));
$subcount = hexdec(substr($hex_sid, 2, 2));
$auth = hexdec(substr($hex_sid, 4, 12));
$result = "$rev-$auth";

for ($x=0;$x < $subcount; $x++) {
$subauth[$x] =
hexdec($this->little_endian(substr($hex_sid, 16 + ($x * 8), 8)));
$result .= "-" . $subauth[$x];
}

// 通过添加 S- 来作弊
return 'S-' . $result;
}

// 将小端序十六进制数字转换为可以被 'hexdec' 转换的数字
function little_endian($hex) {
for ($x = strlen($hex) - 2; $x >= 0; $x = $x - 2) {
$result .= substr($hex, $x, 2);
}
return $result;
}

此函数与 ldap_get_values_len 函数无关,但如果你想将 objectGUID 二进制值转换为字符串格式(从 Richard Mueller 提供的一些 vbscript 转换而来),它仍然很有用

// 此函数将把二进制值 guid 转换为有效的字符串。
function bin_to_str_guid($object_guid) {
$hex_guid = bin2hex($object_guid);
$hex_guid_to_guid_str = '';
for($k = 1; $k <= 4; ++$k) {
$hex_guid_to_guid_str .= substr($hex_guid, 8 - 2 * $k, 2);
}
$hex_guid_to_guid_str .= '-';
for($k = 1; $k <= 2; ++$k) {
$hex_guid_to_guid_str .= substr($hex_guid, 12 - 2 * $k, 2);
}
$hex_guid_to_guid_str .= '-';
for($k = 1; $k <= 2; ++$k) {
$hex_guid_to_guid_str .= substr($hex_guid, 16 - 2 * $k, 2);
}
$hex_guid_to_guid_str .= '-' . substr($hex_guid, 16, 4);
$hex_guid_to_guid_str .= '-' . substr($hex_guid, 20);

return strtoupper($hex_guid_to_guid_str);
}

以下是如何使用这两个函数的示例

$filter="samaccountname=".$username;
$fields=array("objectguid","objectsid");

// 首先建立连接并指定 base_dn。手册中有很多关于此的示例

$sr=ldap_search($this->_conn,$this->_base_dn,$filter,$fields);
$entries = ldap_get_entries($this->_conn, $sr);

if (in_array("objectguid", $fields)) {
$entries[0]["objectguid"][0]=
$this->bin_to_str_guid($entries[0]["objectguid"][0]);
}

if (in_array("objectsid", $fields)) {
$entry = ldap_first_entry($this->_conn, $sr);
$objectsid_binary = ldap_get_values_len($this->_conn, $entry, "objectsid");
$entries[0]["objectsid"][0] = $this->bin_to_str_sid($objectsid_binary[0]);
}

希望这对某些人有所帮助!
jhgustafsson at gmail dot com
15 年前
尝试了几种不同的方法来完成此操作,但这似乎效果最好

<?php
$info
= ldap_first_entry($ds,$sr);

// 获取二进制安全的值。
$bin_guid = ldap_get_values_len($ds,$info,"objectguid");

// 转换为十六进制,bin2hex 在这里对我来说失败了。 Unpack() 似乎可以工作。
$hex_guid = unpack("H*hex", $bin_guid[0]);
?>
m1tk0123123 at abv dot bg
7 年前

以下是 WINDOWS objectsid 的解决方案
// LIB .............................
class LDAP_OBJECT_SID {

public function toString($SID_BINARY) {

$split = str_split($SID_BINARY, 8);
$hexArray = array();
foreach ($split as $key => $byte) {
$hexArray[$key] = strToUpper(substr('0'.dechex(bindec($byte)), -2));
}

$BLOCK_COUNT = hexdec($hexArray[1]);
$DEC_GROUP['SUB-ID-BLOCKS'] = array();
for ($i=0; $i<$BLOCK_COUNT; $i++) {
$offset = 8 + (4 * $i);
$DEC_GROUP['SUB-ID-BLOCKS'][$i] = array();
$DEC_GROUP['SUB-ID-BLOCKS'][$i][1] = hexdec($hexArray[$offset+3]);
$DEC_GROUP['SUB-ID-BLOCKS'][$i][2] = hexdec($hexArray[$offset+2]);
$DEC_GROUP['SUB-ID-BLOCKS'][$i][3] = hexdec($hexArray[$offset+1]);
$DEC_GROUP['SUB-ID-BLOCKS'][$i][4] = hexdec($hexArray[$offset]);

}
$SID = 'S-'.hexdec($hexArray[0]).'-'.$this->byte6ToLong(
hexdec($hexArray[2]),
hexdec($hexArray[3]),
hexdec($hexArray[4]),
hexdec($hexArray[5]),
hexdec($hexArray[6]),
hexdec($hexArray[7])
);
foreach ($DEC_GROUP['SUB-ID-BLOCKS'] as $BLOCK) {
$SID .= '-'.$this->byte4ToLong(
$BLOCK[1],
$BLOCK[2],
$BLOCK[3],
$BLOCK[4]
);
}
return $SID;

}

private function byte6ToLong($b1, $b2, $b3, $b4, $b5, $b6) {
$byte6ToLong = $b1;
$byte6ToLong = $byte6ToLong*256 + $b2;
$byte6ToLong = $byte6ToLong*256 + $b3;
$byte6ToLong = $byte6ToLong*256 + $b4;
$byte6ToLong = $byte6ToLong*256 + $b5;
$byte6ToLong = $byte6ToLong*256 + $b6;
return $byte6ToLong;
}

private function byte4ToLong($b1, $b2, $b3, $b4) {
$byte4ToLong = $b1;
$byte4ToLong = $byte4ToLong*256 + $b2;
$byte4ToLong = $byte4ToLong*256 + $b3;
$byte4ToLong = $byte4ToLong*256 + $b4;
return $byte4ToLong;
}

}

TEST

$sr=ldap_search($conn, $base_dn, $filter,$fields);
$entry = ldap_first_entry($conn, $sr);
$objectsid_binary = ldap_get_values_len($conn, $entry, "objectsid");

$Obj = new LDAP_OBJECT_SID();
echo $Obj->toString($objectsid_binary[0]);
alexey_baranov at inbox dot ru
15 年前
不再需要使用 ldap_get_values_len()。ldap_get_attributes() 现在可以正常工作了。

<?php
$attrs
= ldap_get_attributes($this->cid, $this->re);
$hex_Sid= bin2hex($attrs['objectSid'][0]); // 返回 010500000000000515000000c94d7d363d787b17e77b80109d060000
$hex_GUID= bin2hex($attrs['objectGUID'][0]); // 返回 710234bbc2abc148ade8c1f9b4567b24
?>
derek dot ethier at gmail dot com
17 年前
另一个函数可以补充我在下面发布的 bin_to_str_guid 函数

// 此函数会将字符串 GUID 值转换为十六进制值以搜索 AD。
function str_to_hex_guid($str_guid) {
$str_guid = str_replace('-', '', $str_guid);

$octet_str = substr($str_guid, 6, 2);
$octet_str .= substr($str_guid, 4, 2);
$octet_str .= substr($str_guid, 2, 2);
$octet_str .= substr($str_guid, 0, 2);
$octet_str .= substr($str_guid, 10, 2);
$octet_str .= substr($str_guid, 8, 2);
$octet_str .= substr($str_guid, 14, 2);
$octet_str .= substr($str_guid, 12, 2);
$octet_str .= substr($str_guid, 16, strlen($str_guid));

return $octet_str;
}

如果您想将字符串 GUID 转换回十六进制格式(如果要根据 GUID 字符串搜索 AD,请确保在搜索时使用双反斜杠转义十六进制字符串 - 例如 \\AE\\0F\\88...)。
rcrow at NOSPAM dot laptv dot com
20 年前
如果您尝试访问二进制数据(例如 LDAP 中的 ObjectSID),则必须首先获取单个条目,如 ldap_get_values() 函数中所述 - “此调用需要 result_entry_identifier,因此需要在其中一个 ldap 搜索调用和其中一个获取单个条目的调用之前进行。”

以下代码段将获取特定用户的 LDAP objectSID。

<?php
/* 获取二进制 objectsid 条目 */
/* 确保您已在 ldap_search 中包含二进制字段。 */
$criteria = "samaccountname=$ldapUser";
$justthese = array("memberOf", "objectsid");

$ldapSearchResult = ldap_search($ldapConnectionResult, $ldapBase, $criteria, $justthese);

if (
ldap_count_entries($ldapConnectionResult, $ldapSearchResult)){
$ldapResults = ldap_get_entries($ldapConnectionResult, $ldapSearchResult);

$entry = ldap_first_entry($ldapConnectionResult, $ldapSearchResult);
$ldapBinary = ldap_get_values_len ($ldapConnectionResult, $entry, "objectsid");

/* 您的代码在此处 */

}
?>

然后,您可以使用诸如 bin2hex 之类的工具将数据放入更易于使用的形式。
To Top