使用LDAP和PHP检查Active Directory中的组成员身份


Checking for group membership in Active Directory using LDAP and PHP

我对LDAP和Active Directory还很陌生,我认为这应该是一个简单的问题。我使用以下代码连接到AD:

$ad = ldap_connect("domain.com") or die("Could not connect to AD");
//bind to the server
$uname = $uid . "@domain.com";
if (!ldap_bind($ad, "$uname", "$pwd") and $uid != "guest") {
    code...
}

我需要检查用户是否是三个组之一的成员:ECSDocket_Admin、ECSDocket-user或ECSDocket _Viewer。我一直在四处搜索,我找到的大多数答案在查询中都使用CN=、DN=和DC=,但我不知道这些是什么意思。如果有人能解释它是如何工作的,以及我需要做什么来确定小组成员,那就太棒了!

如果有人关心的话,我可以做这样的搜索:

$dn = "CN=$uid,CN=Users,DC=domain,DC=com";
$filter = "(memberOf=CN=ECSDocket_Admin,OU=Groups,DC=domain,DC=com)";
$justthese = array("memberOf");
$sr = ldap_search($ad, $dn, $filter, $justthese);
$info = ldap_get_entries($ad, $sr);
echo $info["count"]." entries returned.'n";

通过检查计数,我能够确定输入的用户名是否是组的一部分——如果有,那么它就是组的一个部分,因为我已经在该用户名下使用ldap_connect来检查它在AD中是否有效。对于过滤器,由于memberOf是一个数组,所以你需要指定整个路径。例如,如果你只需要查询sn(姓氏),你可以有这样的东西:

$filter = "(sn=smith)";

一个帮助我准确了解正确属性的网站是这样的:http://www.selfadsi.org/user-attributes-w2k8.htm

我不熟悉PHP访问LDAP/Active Directory的实现,所以我不能在那里帮你。我能帮你的也许是了解从哪里获得域结构中的信息,以便连贯地组装所有CN、OU和DN。

登录到某个域控制器的控制台,然后打开"Active Directory用户和计算机"管理员工具。

在顶部的左侧窗格中,将显示您的域名,例如:somedomain.com记下你的域名。

现在,您需要在域结构中查找ECSDocket_Admin、ECSDocket _User和ECSDocket-Viewer组对象的位置。

单击域名旁边的+(加号)(如果还没有)。您应该看到一堆文件夹(实际上是OU和Directory,但我会保持简单)。您要查找的组将位于其中一个"文件夹"中,很可能位于名为"用户"的文件夹中,因此请开始查找。

记下找到该组的"路径",从顶部的"somedomain.com"开始,向下遍历文件夹。例如:somedomain.com/users/etc/ECSDocket_Admin

要查询组对象,您需要知道它的可分辨名称(DN)。使用您收集的有关域名和您可以为其组装DN的位置的信息你的每个小组都是这样的:

注意:我使用的是一组的示例路径:somedomain.com/users/etc/ECSDocket_Admin

DN值为:CN=ECSDocket_Admin,OU=etc,OU=users,DC=somedomain,DC=com

--请注意,我们从对象名称"ECSDocket_Admin"开始,并向上遍历树(查看我让您写下的路径时按相反的顺序)!

--请注意,只有组名的前缀是CN=

--请注意,所有"文件夹"名称都以OU=为前缀

--请注意,我们在点分隔符处拆分域名,并在每个部分前面加上DC=

--注意,DN值中的所有内容都用逗号(,)分隔

您可能需要的其他项目的值为:

以somedomain.com域名为例,"搜索基础"或目录中开始搜索的点将是:DC=somedomain,DC=com

搜索范围将是:sub,它只是说可以在起点下的所有"文件夹"中查找

一旦您了解了如何查询组对象,您特别感兴趣的属性值就称为"member"。此属性包含多个值,每个值对应于组成员中的每个用户。这些值将是用户帐户的DN。您感兴趣的部分将是开头的CN=SOMEUSER部分,因为这是用户帐户名。其余部分是域结构中存储此帐户对象的"路径"。

希望能有所帮助。