在PHP中使用LDAP函数获取Active Directory令牌组属性

在PHP中使用LDAP函数获取Active Directory令牌组属性,php,active-directory,ldap,Php,Active Directory,Ldap,您好 我已经有一个工作连接到广告,可以搜索和检索它的信息。我甚至开发了一种递归方法,通过该方法可以检索给定用户的所有组。但是,如果可能的话,我希望避免递归。一种方法是从用户的AD中获取tokenGroups属性,该属性应该是指定用户具有成员身份的组的SID列表,无论该成员身份是直接的还是间接的 但是,当我搜索用户的广告信息时,tokenGroups属性甚至不在其中。我试图明确地请求该信息,即使用第四个参数指定该信息,但这也不起作用 谢谢, 大卫·基斯 解决了我自己的问题,并认为我应该把答案放在这

您好

我已经有一个工作连接到广告,可以搜索和检索它的信息。我甚至开发了一种递归方法,通过该方法可以检索给定用户的所有组。但是,如果可能的话,我希望避免递归。一种方法是从用户的AD中获取tokenGroups属性,该属性应该是指定用户具有成员身份的组的SID列表,无论该成员身份是直接的还是间接的

但是,当我搜索用户的广告信息时,tokenGroups属性甚至不在其中。我试图明确地请求该信息,即使用第四个参数指定该信息,但这也不起作用

谢谢, 大卫·基斯


解决了我自己的问题,并认为我应该把答案放在这里,以便其他人可以找到它。问题在于使用ldap_搜索功能。答案是使用ldap_read函数而不是ldap_search。区别在于请求的范围。搜索函数使用sub的作用域,即子树,而读取函数使用base。只有在使用base范围时才能找到tokenGroups信息,因此使用正确的PHP函数是关键

正如我前面提到的,我正在使用其他人的perl代码来创建我的解决方案,perl脚本使用了一个名为search的函数来执行LDAP请求,这使我走上了错误的道路

感谢那些偷看了这个问题的人

-

根据注释中的请求,下面是代码中解决方案的基础。我正在从我使用的对象中提取,所以这可能不是100%,但会很接近。此外,未在此截图中声明的变量,例如$server、$user、$password,由您自行确定;反正我也不知道你的广告资历

$ldap = ldap_connect($server);
ldap_bind($ldap, $user, $password);
$tokengroups = ldap_read($ldap, $dn, "CN=*", array("tokengroups")));
$tokengroups = ldap_get_entries($ldap, $tokengroups);
此时,$tokengroups是我们作为数组的结果。它应该有计数索引以及一些其他信息。要提取实际组,您需要执行以下操作:

$groups = array();
if($tokengroups["count"] > 0) {
    $groups = $tokengroups[0]["tokengroups"];
    unset($groups["count"]);

    // if you want the SID's for your groups, you can stop here.
    // if you want to decode the SID's then you can do something like this.
    // the sid_decode() here: http://www.php.net/manual/en/function.unpack.php#72591

    foreach($groups as $i => &$sid) {
        $sid = sid_decode($sid);

        $sid_dn = ldap_read($ldap, "<SID=$sid>", "CN=*", array("dn"));
        if($sid_dn !== false) {
            $group = ldap_get_entries($ldap, $sid_dn);
            $group = $group["count"] == 1 ? $group[0]["dn"] : NULL;
            $groups[$i] = $group;
        }
    }
}

这是最基本的。这里有一个警告:您可能需要和在您的组织中管理广告帐户的一个或多个个人合作。几年前我第一次尝试运行它时,我的记忆有些模糊,因为我获得的帐户没有访问令牌组信息的适当授权。我确信还有其他方法可以做到这一点,但因为我正在为这个特定的解决方案移植其他人的代码,所以我就是这样做的。

这不是解决您问题的方法,但您知道令牌组只包括安全组,而不包括通讯组吗?因此,即使您让tokenGroups返回某些内容,结果也可能与您当前的实现不同。实际上,我没有意识到这一点,但对于这种特定情况,我认为我应该可以。我正在用另一种编程语言从别人的代码中工作,并试图重新创建它。该代码从同一服务器运行,访问同一AD并使用令牌组。由于这些代码可以获取它们并将它们用于我需要的内容,希望我能找到一种通过PHP使其工作的方法。不过,谢谢你的警告!您是否可以提供一个链接或其他内容,指向用于查找给定用户的所有组的解决方案?