2009-11-12 51 views
2

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

我想从他们的用户名找到人显示名称。 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 =李四

编辑:

试图查找用户,但不知道如何找到 “基本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搜索]:搜索:操作错误

回答

6

确定 - 首先,您需要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的用户。

+0

如果我使用'ldapbind = ldap_bind($ ldapconn);'它返回true,所以假定允许匿名绑定。还尝试了'$ filter =“(sAMAccountName ='username')”;'所以不知道它是否在过滤级别失败,DN或'$ justthese' – SamWM

+0

不要在过滤字符串中引用用户名('$ filter =“(sAMAccountName = username)”;'** NOT **' $ Filter =“(sAMAccountName ='username')”;') 也许我没有解释这100%正确:Active Directory不允许匿名用户读取除'RootDSE'之外的其他条目,这是绝对根目录LDAP树。所以'ldap_bind()'确实可以返回'true',但这并不意味着你被允许访问LDAP树。 考虑到错误消息,我假设你的* base DN *是第一个要解决的问题。 –

-2

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

0

ldap_get_entries功能的最前一页参数不正确:

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

测试以这种方式和你的代码工作现在。

+1

这个答案虽然有用,但并不是真的独立。也许要明确这个问题符合提问者的代码,以及它如何解决问题。 –

相关问题