通过PHP进行Active Directory查找

时间:2009-11-12 09:44:58

标签: php active-directory

如何通过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]:搜索:操作错误

4 个答案:

答案 0 :(得分:7)

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

现在的问题是:您编写的Windows服务器是什么?从Windows Server 2003开始,匿名绑定为disabled by default,这意味着如果不首先使用现有授权用户进行身份验证,则无法搜索Active Directory树。 (要启用匿名绑定,请参阅here - 但由于您没有任何管理员权限,因此无法更改此内容)

第二个问题是您的基本DN ,它实际上是LDAP树中将执行搜索操作的位置。用户容器的normale base 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的用户。

答案 1 :(得分:0)

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

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

以这种方式进行测试,您的代码现在正常工作。

答案 2 :(得分:-2)

PHP有LDAP library可用于查询活动目录。但它不是enabled by default

如果您可以使用它,可以查看ldap_search()

答案 3 :(得分:-2)

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

相关问题