【问题标题】:Display all Active Directory groups that a user is a member of recursively以递归方式显示用户所属的所有 Active Directory 组
【发布时间】:2016-07-14 01:18:05
【问题描述】:

我有以下脚本来检查 AD 访问,然后在特定组中检查成员资格。

如何显示用户有权访问的每个组,包括非直接的组 - 例如 - 用户 - userA、组 - groupA 以及 groupB 中的 groupA,我希望它也显示 groupB作为A组

我错过了什么?

<?php
        //ini_set('display_errors', 1);
        session_start();
        //ini_set('display_startup_errors', 1);
        //error_reporting(E_ALL);
//      require_once('assets/config.php');

        $ldap_server = "ldap*************************";


 if(isset($_SESSION['itssd_user'])) {
    $submittedusername = $_SESSION['itssd_user'];
 }
 if(isset($_SESSION['itssd_pw'])) {
    $submittedpassword = $_SESSION['itssd_pw'];
 }


        //$ro_access_group='CN=****,OU=Service Desk,OU=Customer Services,OU=ITS,OU=Groups,DC=registry,DC=otago,DC=ac,DC=nz';
        $ro_access_group='DC=registry,DC=otago,DC=ac,DC=nz';
        // Connect to the LDAP server
        $ldap = ldap_connect($ldap_server);

function inGroup($ldapConnection, $userDN, $groupToFind) {
    $filter = "(memberof:1.2.840.113556.1.4.1941:=".$groupToFind.")";
    $search = ldap_search($ldapConnection, $userDN, $filter, array("dn"), 1);

    $items = ldap_get_entries($ldapConnection, $search);
    echo "<pre>";
        echo var_dump($items)."<br>";
    echo "</pre>";
    if(!isset($items["count"])) {
        return false;
    }
    return (bool)$items["count"];
}
        if ($ldap) {
                // Connect to the database for querying.
//              $dbConn = connectDB();
                //$dn = "cn=" . $submittedusername . ",ou=Users,ou=Otago,dc=registry,dc=otago,dc=ac,dc=nz";

                $dn = "registry\\".$submittedusername;

                $basedn = "dc=registry,dc=otago,dc=ac,dc=nz";
                if (($submittedpassword == "") OR ($submittedpassword == NULL)) {
                        $loginResult = 'INVALIDUSER';
                } else {
                        // Now attempt to bind
                        if (ldap_bind($ldap, $dn, $submittedpassword)) {
                                $search_user=ldap_search($ldap, $basedn, "(sAMAccountName=".$submittedusername.")");
                                if($search_user){
                                echo 'Authenticated';
                                }

                                $user_details=ldap_get_entries($ldap, $search_user);
                                //$ro_name=$user_details[0]["displayname"][0];
                                if(!$user_details){
                                        $loginResult = "INVALIDUSER";
                                        echo 'null user details<br>'.sizeof($user_details);
                                }
                                else{
                                        //echo "<pre>";
                                            //echo var_dump($user_details[0])."<br>";
                                        //echo "</pre>";

                                         if(isset($user_details[0]["memberof"][0])) {
                                        $groupCount = $user_details[0]["memberof"]["count"] - 1;
                                        for ($i = 0; $i <= $groupCount; $i++) {
                                            echo $user_details[0]["memberof"][$i];
                                            echo "<br>";
                                        }
                                    }
                                        $_SESSION['itssd_email_messages_count'] = 0;
                                        $_SESSION['itssd_notifications_count'] = 0;
                                        $_SESSION['itssd_username'] = $submittedusername;
                                        $_SESSION['itssd_date_view'] = date('Y-m-d', time());
                                        $_SESSION['itssd_prod'] = FALSE;
                                        if (inGroup($ldap, $user_details[0]["dn"], $ro_access_group)) {
                                                $loginResult = "Authorised";
                                        } else {
                                                //echo "<br/><br/><br/>".$submittedusername." not in group ".$ro_access_group;
                                                //echo "<br/>".$user_details[0]["memberof"];
                                                //echo var_dump($user_details[0]["memberof"]);
                                                //echo "<br/><br/>";
                                                echo inGroup($ldap, $user_details[0]["dn"], $ro_access_group);
                                                $loginResult = "INVALIDUSER";
                                        }
                                }
                        } else {
                                $loginResult = 'INVALIDUSER';
                        }
                        $submittedpassword = NULL;
                }
                echo $loginResult;

        }
?>

【问题讨论】:

    标签: php active-directory ldap active-directory-group


    【解决方案1】:

    在您的 inGroup 方法中,将其用于您的过滤器:

    $filter = "(&amp;(distinguishedName=$groupToFind)(member:1.2.840.113556.1.4.1941:=$userDN))";

    将首先按 DN 选择组,然后通过其 DN 递归检查它是否包含成员。

    编辑

    如果您希望搜索返回用户所属的所有组,请使用此过滤器:

    $filter = "(&amp;(objectClass=group)(member:1.2.840.113556.1.4.1941:=$userDN))";

    喜欢:

    $filter = "(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=$userDN))";
    $search = ldap_search($ldapConnection, 'DC=registry,DC=otago,DC=ac,DC=nz', $filter, array("cn"));
    
    $allGroups = ldap_get_entries($ldapConnection, $search);
    

    上面的$allGroups 将包含用户直接或间接所属的每个组(例如作为不同组成员的组等)。但是,DC=registry,DC=otago,DC=ac,DC=nz 真的是您域的“基础”级别吗?这应该是ldap_search 的第二个参数。

    【讨论】:

    • 谢谢,所以通过使用更改后的 $filter 变量,我如何显示每一个彼此关联的每个组?
    • 我更新了它以包含一个过滤器,当与ldap_search 一起使用时,该过滤器还可以返回用户所属的所有组。
    • 干杯 - 好的,我更改了代码以显示特定用户 if(isset($user_details[0]["memberof"][0])) { $groupCount = $user_details[0]["memberof"]["count"] - 1; for ($i = 0; $i &lt;= $groupCount; $i++) { echo $user_details[0]["memberof"][$i]; echo "&lt;br&gt;"; } } 的 membersOf 属性我如何使用每个属性,然后递归地检查它们在哪些组中?
    • 我基本上试图通过从用户开始然后向上查找 - 试图找到与用户关联的每个组,例如 - 用户是组 A、B、C,然后找到每个组A 组在其中,依此类推,直到我到达域的顶部
    • 见上文,我添加了一些额外的细节。使用$filter = "(&amp;(objectClass=group)(member:1.2.840.113556.1.4.1941:=$userDN))"; 将返回用户所属的所有递归组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多