【问题标题】:Checking for group membership in Active Directory using LDAP and PHP使用 LDAP 和 PHP 检查 Active Directory 中的组成员身份
【发布时间】:2013-07-26 05:18:32
【问题描述】:

我对 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= ,但我不知道这些是什么意思。如果有人可以解释它是如何工作的,以及我需要做些什么来弄清楚组成员身份,那就太棒了!

【问题讨论】:

标签: php active-directory ldap


【解决方案1】:

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

$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

【讨论】:

    【解决方案2】:

    我不熟悉 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,它只是表示也可以查看起点下方的所有“文件夹”

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

    希望对你有帮助。

    【讨论】:

    • 谢谢!我仍然无法让它工作,但这帮助我了解发生了什么。唯一让我有点困惑的是类别的名称到底是什么。例如,对于用户,我检查字段用户、全名还是什么?
    • 在搜索用户时,您将使用 CN 搜索他们以获得他们的 DN。如果您确切知道他们在目录中的位置,那么您可以立即使用 DN。在任何一种情况下,一旦有了 DN,您就可以查询该用户对象以获取所有属性值。用户对象的属性是全名、电话等。对 AD 用户属性进行谷歌搜索,您会发现很多网站都列出了所有可用的属性。提示:属性名称必须完全按照定义拼写,有些看起来有点疯狂。
    • 谢谢!它还不能完美运行,但搜索并没有失败!
    猜你喜欢
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    相关资源
    最近更新 更多