在命令行下可以列出,用PHP-LDAP却列不出,想不出个所以然来..大家努力啊.下例为列出当前域内用户名(非PHP_LDAP方式):
<?php set_time_limit(180);//设域名为netvt.net
$dnpre = "netvt";
$dnend = "net";
exec("ldifde -f ldif.ldif -v -d \"cn=users,DC=$dnpre,DC=$dnend\" -r \"(objectClass=user)\"") ;$meme = file("ldif.log");
echo "当前域内用户:<br>";
for ($i = 0; $i < count($meme); $i++) {
if(ereg("CN=.*CN",$meme[$i],$str)) echo substr(substr($str[0],3),0,-3)."<br>";
};?>下例为PHP-LDAP方式.试验无结果.
<?php 
$ldap['host'] = "jw.netvt.net"; 
$ldap['port'] = 389; 
$ldap['dn']   = "cn=users,DC=netvt,DC=net";
$ldap['base'] = ""; // connecting to ldap
echo "start LDAP <br>";
echo "连接中 ...";
$ds=ldap_connect($ldap['host'],$ldap['port']);
echo "连上 ".$ds."<br>";if ($ds) { 
    echo "绑定中...."; 
    $r = ldap_bind($ds);          
if ($r)  echo "绑定成功<br>" ;
else echo "绑定失败<br>";    echo "搜寻用户 ...";  
    
    $sr=ldap_search($ds,$ldap['dn'], "(objectClass=user)");  //此处有返回值
    echo "返回 ".$sr."<br>";

    echo "该域用户有 ".ldap_count_entries($ds,$sr)." 个<br>";//取得搜寻的结果数目失败????????
    echo "取出域用户资料 ...<br>";
    $info = ldap_get_entries($ds, $sr);
    echo "资料返回 ".$info["count"]." 个:<br>";
    for ($i=0; $i<$info["count"]; $i++) {
        echo "dn 为: ". $info[$i]["dn"] ."<br>";
        echo "cn 为: ". $info[$i]["cn"][0] ."<br>";        
    }
    echo "关闭链接<br>";
    ldap_close($ds);
} else {
    echo "无法连接到 活动目录\r\n";
}?>
大家继续.......

解决方案 »

  1.   

    谢谢大家的参与
    有一个解决办法,但这是没有办法的办法。
    用c#或C++做一个服务程序,或者调用.net的类库、或者使用ADO或者使用ADSI,肯定能把AD里的数据检索出来,然后再更新数据库用户表。我想微软的东西检索AD肯定没问题。
    结论是:微软AD中的ldap协议不支持php的ldap函数。
    但这样虽然能解决问题,可是根php就没关系了。岂不可悲?
      

  2.   

    这里有些文章,大概是说利用php_adodb_lib通过COM调用ADO,然后用ADO查询数据表。
    当然,如果能够通过ADO查询数据表,肯定能用ADO查询活动目录。实验中……。
      

  3.   

    严重关注, 查了好多资料都没有找到! 
    我一直在考虑两个问题:
    1.怎样在PHP程序中验证win2k域用户?
    2.怎样实现win2k,unix的单一用户认证?一定会用到LDAP,但我不会:(楼主这个问题其实就是我的第1个问题,我目前是这样解决的: 
    开设域用户后通常会同时给用户一个邮箱的吧? 如果没有邮箱, 下面的就不用看了
    邮箱是支持ESMTP的吧? 也就是用户必须验证才可发信, 一般现在的邮件服务器都支持ESMTP
    好了! 到网上搜一篇php通过socket连接email服务器发信的文章,作者好象是limoduo 记不清了,很抱歉:)  稍微改一下就可以了
    思路是这样的,通过socket连接email服务器,在验证用户这一步,判断返回码就可以了,原程序在验证后开始发邮件,后面的不需要,退出即可!大家可以试试, 不过但愿你不是用的M$ exchange , 会气S你的! 我现在用MDaemon
      

  4.   

    分析命令行下.
    ldifde -f ldif.ldif -v -d "cn=users,DC=$dnpre,DC=$dnend" -r "(objectClass=user)"
    生成的ldif.ldif文件.
    应该可以得到你想要的全部域用户信息.
      

  5.   

    恭喜netvt(网络维他)升级成“红星”。
    你的这一行命令确实能把域用户信息搜出来。
    然后就可以用php读者个文本了。
    但是用php读文本、分析文本有点太麻烦了。
    并且不安全,在浏览器里输入路径就全down下来了。
      

  6.   

    谢谢.共同进步! 在PHP版混个星还真不容易:P你可以把这个文件创建到WEB服务的根目录之外.
    比如:
    ldifde -f c:\ldif.ldif -v -d "cn=users,DC=$dnpre,DC=$dnend" -r "(objectClass=user)"用ADO好象不行吧.不过ADSI是肯定可以的!
      

  7.   

    谢谢大家参与,我想这个问题即使用php解决不了,用其他方法也可以变通。我想把这个帖子结掉,大家又什吗意见?
      

  8.   

    用root身份登录,以命令行方式执行php程序即可
      

  9.   

    Php如何与LDAP连接和关闭
    $ds=ldap_connect("ServerName")
    ServerName是LDAP的服务器名,例:
    $ds=ldap_connect(“10.31.172.30:1000”)
    返回值是:true 或 false关闭连接
    ldap_close($ds);2.2 在php中如何搜索用户信息
    $ds=ldap_connect("10.31.172.30:1000");
    //首先连接上服务器
    $justthese = array("cn","userpassword",”location”);
    //搜索函数中的一个参数,要求返回哪些信息,
    //以上传回cn,userpassword,location,这些都要求小写
    $sr=ldap_search($ds,"o=jite", "cn=dom*",$justthese); 
    //第一个参数开启LDAP的代号
    //第二个参数最基本的 dn 条件值 , 例:”o=jite,c=cn”
    //第三个参数 filter 为布林条件,它的语法可以在 Netscape 站上找一份 dirsdkpg.pdf 档案.
    // ’o’为组织名,’cn’ 为用户名,用户名可用通配符 ’*’
    echo "domadmin姓氏有".ldap_count_entries($ds,$sr)." 个<p>";
    //ldap_count_entries($ds,$sr)传回记录总数$info = ldap_get_entries($ds, $sr);
    //LDAP的全部传回资料
    echo "资料传回 ".$info["count"]."笔:<p>";
    for ($i=0; $i<$info["count"]; $i++) {
    echo "dn为:". $info[$i]["dn"] ."<br>";
    echo "cn为:". $info[$i]["cn"][0] ."<br>"; //显示用户名
    echo "email为:". $info[$i]["mail"][0] ."<p>"; //显示mail
    echo "email为:". $info[$i][“userpassword"][0] ."<p>"; //显示加密后的密码
    }
    2.3 添加用户
    $ds=ldap_connect("10.31.172.30:1000");
    //首先连接上服务器
    $r=ldap_bind($ds,"cn=domadmin,o=jite","password");
    //系住一个管理员,有写的权限
    // cn=domadmin,o=jite顺序不能变
    $info["cn"]="aaa"; //必填 
    $info["userpassword"]="aaa"; 
    $info["location"]="shanghai";
    $info["objectclass"] = "person"; //必填person为个人,还有server…
    ldap_add($ds, "cn=".$info["cn"].",o=jite", $info);
    ldap_unbind($ds);
    //取消绑定
    ldap_close($ds);
    //关闭连接
    2.4 删除用户
    $ds=ldap_connect("10.31.172.30:1000");
    //首先连接上服务器 
    ldap_bind($ds,"cn=domadmin,o=jite","password");
    //绑定管理员,有删除的权限
    $dn="cn=dingxf,o=jite";
    ldap_delete($ds, $dn);
    //删除用户
    ldap_unbind($ds);
    //取消绑定
    ldap_close($ds);
    //关闭连接
    2.5 修改用户资料
    $ds=ldap_connect("10.31.172.30:1000");
    //首先连接上服务器 
    ldap_bind($ds,"cn=domadmin,o=jite","password");
    //绑定管理员,有修改的权限
    $dn="cn=dingxf,o=jite"; 
    //用户dn
    $info["userpassword"]="aaa"; //要修改的信息,放在数组变量中
    $info["location"]="shanghaisdaf";ldap_modify($ds, $dn , $info);
    //修改函数
    ldap_unbind($ds);
    //取消绑定
    ldap_close($ds);
    //关闭连接
    2.6 用户登录验证
    $ds=ldap_connect("10.31.172.30:1000");
    //首先连接上服务器 
    if (ldap_bind($ds,"cn=dingxf,o=jite","dingxf")){
    echo "验证通过";
    }else{
    echo "验证不通过";
    }
    ldap_unbind($ds);
    //取消绑定
    ldap_close($ds);
    //关闭连接   注:此方法比较简单,实用,它也有不足之处,如果不通过,ldap_bind()提示它自带的提示语:”Warning: LDAP: Unable to bind to server: Inappropriate authentication in /home/htdocs/jldl.net/ldap/test.php3 on line 16”
      

  10.   

    你试过用这种方法连AD吗?
    其他的ldap服务器可能没有问题,但php中的这套函数连windows的AD。就有问题。(我试过好多次了,搜不出东西来。)
      

  11.   

    注意windows用unicode码来联接的...
    你要转成unicode
      

  12.   

    关注!
    楼主其实是想用LDAP做用户认证吧?如果是这样的,我有一点不明白,Linux的密码我知道一般是用MD5来加密的,请问WINDOWS密码是用什么什么加密算法的?
    WINDOWS的AD是可以用PHP接通的,只是里面的树结构比较复杂。
    to:p4nt1um(菜菜鸟) 
    我没用过UNIX,但我知道linux在安装时是可以选择LDAP做为其认证方式的,可以尝试把linux的LDAP认证服务指向WINDOWS的AD上,因为条件不允许,我也只能是假设,如果可以,请告之。谢谢
    我的电邮是:[email protected]
      

  13.   

    用VB将ldap练ad的代码做成COM,然后在PHP中调用,这是最常见的做法
      

  14.   

    我的系统里有一套安全机制,我只是想将ad中的新用户信息同步到我的用户表中,这样就省得我手工添加了。
    这个功能我现在已经实现了,我用c#写了一个服务,每晚0点开始搜索活动目录中的用户名和email信息,然后与我数据库用户表中的记录进行比较如果ad中有新用户则添加这个新用户,并分配默认的用户名和密码。
    用c#调adsi搜索活动目录非常方便