2010-06-07 129 views
2

问候,使用LDAP函数来获取的Active Directory tokenGroups在PHP属性

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

但是,当我运行搜索用户的AD信息时,tokenGroups属性甚至不在其中。我尝试了特别要求这些信息(即使用第四个参数ldap_search来指定它),但那也没有奏效。

谢谢, 戴维·基斯


+0

不是您的问题的解决方案,但您是否意识到'tokenGroups'将只包含安全组并且没有通讯组?因此,即使您获得'tokenGroups'来返回某些内容,结果可能与您当前的实现相比有所不同。 – Lucero 2010-06-07 21:40:46

+0

其实,我并没有意识到这一点,但对于这个特定的情况,我认为我应该没问题。我正在用别人的代码工作,使用不同的编程语言,并试图重新创建它。该代码从同一台服务器运行并访问相同的AD并使用tokenGroups。由于该代码可以得到它们并将它们用于我所需要的,希望我可以找出一种方法使其通过PHP工作。不过谢谢你的警告! – 2010-06-07 21:50:12

回答

4

解决我自己的问题,我想我会把答案在这里,以便其他人可能会发现它。问题是使用l​​dap_search()函数。答案是使用ldap_read()函数而不是ldap_search()。区别在于请求的范围。搜索功能使用“sub”(即子树)的范围,而读取功能使用“base”。 tokenGroups信息只有在使用“base”范围时才能找到,因此使用正确的PHP函数是关键。

正如我上面提到的,我正在从别人的代码中创建我的解决方案,并且perl脚本使用了一个名为“search”的函数来执行LDAP请求,从而导致我的错误路径。

感谢那些看过这个问题的人!

-

按照注释中的要求,这里的代码解决方案的基础。我从我使用的对象中提取,所以这可能不是100%,但它会很接近。另外,在这个剪切过程中没有声明的变量(例如$ server,$ user,$ password)反正我不会知道你的AD凭证!

$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; 
     } 
    } 
} 

这就是基础知识。有一个警告:您可能需要与在您的组织管理AD帐户的个人或个人合作。我第一次尝试运行(几年前,所以我的记忆有点模糊),我给的帐户没有适当的权限来访问令牌组信息。我相信还有其他方法可以做到这一点,但是因为我正在为其他人的代码移植这个特定的解决方案,所以我就是这么做的。

+0

你可以提供一个链接或某些东西给你找到给定用户的所有组的解决方案吗? – wondergoat77 2014-06-19 23:59:10

+1

@ wondergoat77当然。往上看。 – 2014-06-20 12:11:12

+0

感谢发布 – wondergoat77 2014-06-20 16:02:31

相关问题