在命令行下可以列出,用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";
}?>
大家继续.......
<?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";
}?>
大家继续.......
有一个解决办法,但这是没有办法的办法。
用c#或C++做一个服务程序,或者调用.net的类库、或者使用ADO或者使用ADSI,肯定能把AD里的数据检索出来,然后再更新数据库用户表。我想微软的东西检索AD肯定没问题。
结论是:微软AD中的ldap协议不支持php的ldap函数。
但这样虽然能解决问题,可是根php就没关系了。岂不可悲?
当然,如果能够通过ADO查询数据表,肯定能用ADO查询活动目录。实验中……。
我一直在考虑两个问题:
1.怎样在PHP程序中验证win2k域用户?
2.怎样实现win2k,unix的单一用户认证?一定会用到LDAP,但我不会:(楼主这个问题其实就是我的第1个问题,我目前是这样解决的:
开设域用户后通常会同时给用户一个邮箱的吧? 如果没有邮箱, 下面的就不用看了
邮箱是支持ESMTP的吧? 也就是用户必须验证才可发信, 一般现在的邮件服务器都支持ESMTP
好了! 到网上搜一篇php通过socket连接email服务器发信的文章,作者好象是limoduo 记不清了,很抱歉:) 稍微改一下就可以了
思路是这样的,通过socket连接email服务器,在验证用户这一步,判断返回码就可以了,原程序在验证后开始发邮件,后面的不需要,退出即可!大家可以试试, 不过但愿你不是用的M$ exchange , 会气S你的! 我现在用MDaemon
ldifde -f ldif.ldif -v -d "cn=users,DC=$dnpre,DC=$dnend" -r "(objectClass=user)"
生成的ldif.ldif文件.
应该可以得到你想要的全部域用户信息.
你的这一行命令确实能把域用户信息搜出来。
然后就可以用php读者个文本了。
但是用php读文本、分析文本有点太麻烦了。
并且不安全,在浏览器里输入路径就全down下来了。
比如:
ldifde -f c:\ldif.ldif -v -d "cn=users,DC=$dnpre,DC=$dnend" -r "(objectClass=user)"用ADO好象不行吧.不过ADSI是肯定可以的!
$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”
其他的ldap服务器可能没有问题,但php中的这套函数连windows的AD。就有问题。(我试过好多次了,搜不出东西来。)
你要转成unicode
楼主其实是想用LDAP做用户认证吧?如果是这样的,我有一点不明白,Linux的密码我知道一般是用MD5来加密的,请问WINDOWS密码是用什么什么加密算法的?
WINDOWS的AD是可以用PHP接通的,只是里面的树结构比较复杂。
to:p4nt1um(菜菜鸟)
我没用过UNIX,但我知道linux在安装时是可以选择LDAP做为其认证方式的,可以尝试把linux的LDAP认证服务指向WINDOWS的AD上,因为条件不允许,我也只能是假设,如果可以,请告之。谢谢
我的电邮是:[email protected]
这个功能我现在已经实现了,我用c#写了一个服务,每晚0点开始搜索活动目录中的用户名和email信息,然后与我数据库用户表中的记录进行比较如果ad中有新用户则添加这个新用户,并分配默认的用户名和密码。
用c#调adsi搜索活动目录非常方便