【问题标题】:Active Directory Lookup via PHP通过 PHP 查找活动目录
【发布时间】:2009-11-12 09:44:58
【问题描述】:

如何通过 PHP 进行 Active Directory 查找?无需重新编译 PHP。 PHP版本是5.3

我想从他们的用户名中找到一个人的显示名。 Web 服务器是 IIS 6,PHP 使用 FastCGI 提供服务。

我得到的用户名是:

$cred = explode('\\',$_SERVER['REMOTE_USER']);
if (count($cred) == 1) array_unshift($cred, "(no domain info - perhaps SSPIOmitDomain is On)");
list($domain, $user) = $cred;
return $user;

那么我怎样才能找到这个名字呢?例如DoeJ = John Doe

编辑:

尝试查找用户,但不确定如何找到“基本 DN”。没有对 Active Directory 服务器的直接访问权限或管理员权限,因此请匿名连接。

<?php

//using ldap bind anonymously

// connect to ldap server
$ldapconn = ldap_connect("example.co.uk")
    or die("Could not connect to LDAP server.");

if ($ldapconn) {

    // binding anonymously
    $ldapbind = ldap_bind($ldapconn);

    if ($ldapbind) {
        echo "LDAP bind anonymous successful...";

        ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION,3);
        ldap_set_option($ldapconn, LDAP_OPT_REFERRALS,0);

        $dn = "CN=Users"; // also tried DC=example,DC=co,DC=uk
        $filter="(SAMAccountName=username)";
        $justthese = array("ou", "sn", "givenname", "mail");

        $sr=ldap_search($ldapconn, $dn, $filter, $justthese);

        $info = ldap_get_entries($ds, $sr);

        echo $info["count"]." entries returned\n";

    } else {
        echo "LDAP bind anonymous failed...";
    }
}
?>

ldap_search 失败:警告:ldap_search() [function.ldap-search]:搜索:操作错误

【问题讨论】:

    标签: php active-directory


    【解决方案1】:

    好的 - 首先,您需要 ext/ldap 通过 LDAP 接口与您的 Active Directory 服务器通信。显然,您的 PHP 安装满足了此要求(否则您会收到有关未定义函数的错误)。

    现在的问题是:您针对什么 Windows 服务器进行编码?从 Windows Server 2003 起,匿名绑定为 disabled by default,这意味着您必须先通过现有的授权用户进行身份验证才能搜索 Active Directory 树。 (要启用匿名绑定,请参阅here - 但由于您没有任何管理员权限,因此您无法更改此设置)

    第二个问题是您的 基本 DN,它实际上是 LDAP 树中执行搜索操作的位置。用户容器的正常基本 DN 应为 CN=Users,DC=yourdomain,DC=yourtopleveldomain,例如 CN=Users,DC=example,DC=local

    您使用的过滤器实际上是正确的:(SAMAccountName=username) 将找到用户 username 的帐户条目。要使用您的用户名变量,您可以这样做:

    $filter = sprintf('(SAMAccountName=%s)', $user);
    

    不过,一般的代码流似乎也是正确的。

    总结一下:您必须首先检查您的 Active Directory 是否允许匿名绑定,然后您必须调整搜索的基本 DN。如果不允许匿名绑定,则必须使用授权绑定到 Active Directory 的用户。

    【讨论】:

    • 如果我使用 'ldapbind = ldap_bind($ldapconn);'它返回 true,因此假设允许匿名绑定。还尝试了 '$filter="(sAMAccountName='username')";'所以不确定它是否在过滤器级别失败,DN或'$justthese'
    • 不要在过滤字符串中引用用户名 ($filter="(sAMAccountName=username)"; NOT $filter="(sAMAccountName='username')";) 也许我没有解释这一点 100% 正确:Active Directory 不允许匿名用户从RootDSE 之外的条目中读取,这是 LDAP 树的绝对根。所以ldap_bind() 可能确实会返回true,但这并不意味着您可以访问LDAP 树。考虑到错误消息,我假设您的 base DN 是第一个要解决的问题。
    【解决方案2】:

    ldap_get_entries函数的第一个参数不正确:

    $info = ldap_get_entries($ldapconn, $sr);
    

    以这种方式测试,您的代码现在可以工作了。

    【讨论】:

    • 这个答案虽然很有帮助,但并不是真正独立的。也许要弄清楚这适合提问者的代码的什么地方,以及它是如何解决问题的。
    【解决方案3】:

    PHP 有一个LDAP library,您可以使用它来查询活动目录。不过不是enabled by default

    如果可以用,可以看ldap_search()

    【讨论】:

    • 查看了搜索,但无法确定执行搜索所需的查询
    【解决方案4】:

    由于您使用的是 IIS,这意味着您在 Windows 上运行 php,这反过来意味着您可以启用 LDAP extension 而无需重新编译 php。这应该可以解决您的大部分问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多