高分请教PHP通过ldap连windows的Active Directory?

dream_river 2003-05-20 03:50:00
我用php为公司作了一个图书管理系统,用以管理内部图书和借阅工作。
主要功能有:
1、用户管理:只有被管理员添加到用户表里的用户才能登录系统进行图书借阅
2、库存图书管理:管理员可以对库存图书进行增删改操作。
3、借阅规则管理:管理员可以规定本人最多借阅数量,和每本图书最大节约天数。
4、当用户借阅数量达到最大值或有一本书超过了最大借阅天数,则系统自动屏蔽借书功能。并弹出还书提示框。
以上功能都已实现。并将数据存储至mysql数据库。

公司的域管理员兼作图书管理系统的管理员。他提出一个问题:如果公司新来一位员工能否在我为他添加域用户后,这个新用户就可以有权登陆图书管理系统进行图书借阅。
我的思路是:
不对程序作大的改动,加入一个模块,通过ldap搜索主域控制器中的用户信息,并将系统所需信息同步到Mysql的用户表。每天夜间24点系统自动搜索并同步。
不知这个思路是否可行?望高手指教。
其次:在技术上用php通过ldap连AD是否可行。在网上找不到这方面资料。
...全文
475 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
dream_river 2003-07-23
  • 打赏
  • 举报
回复
我的系统里有一套安全机制,我只是想将ad中的新用户信息同步到我的用户表中,这样就省得我手工添加了。
这个功能我现在已经实现了,我用c#写了一个服务,每晚0点开始搜索活动目录中的用户名和email信息,然后与我数据库用户表中的记录进行比较如果ad中有新用户则添加这个新用户,并分配默认的用户名和密码。
用c#调adsi搜索活动目录非常方便
jinleivinus 2003-07-15
  • 打赏
  • 举报
回复
用VB将ldap练ad的代码做成COM,然后在PHP中调用,这是最常见的做法
hsq972 2003-07-13
  • 打赏
  • 举报
回复
关注!
楼主其实是想用LDAP做用户认证吧?如果是这样的,我有一点不明白,Linux的密码我知道一般是用MD5来加密的,请问WINDOWS密码是用什么什么加密算法的?
WINDOWS的AD是可以用PHP接通的,只是里面的树结构比较复杂。
to:p4nt1um(菜菜鸟)
我没用过UNIX,但我知道linux在安装时是可以选择LDAP做为其认证方式的,可以尝试把linux的LDAP认证服务指向WINDOWS的AD上,因为条件不允许,我也只能是假设,如果可以,请告之。谢谢
我的电邮是:hsq972@21cn.com
sdpong 2003-07-10
  • 打赏
  • 举报
回复
注意windows用unicode码来联接的...
你要转成unicode
DFlyingchen 2003-07-02
  • 打赏
  • 举报
回复
没用过,忘了在哪里找到的了…见笑了…
dream_river 2003-06-30
  • 打赏
  • 举报
回复
你试过用这种方法连AD吗?
其他的ldap服务器可能没有问题,但php中的这套函数连windows的AD。就有问题。(我试过好多次了,搜不出东西来。)
DFlyingchen 2003-06-28
  • 打赏
  • 举报
回复
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”
xuzuning 2003-06-17
  • 打赏
  • 举报
回复
用root身份登录,以命令行方式执行php程序即可
dream_river 2003-06-06
  • 打赏
  • 举报
回复
谢谢大家参与,我想这个问题即使用php解决不了,用其他方法也可以变通。我想把这个帖子结掉,大家又什吗意见?
vitalgg 2003-05-26
  • 打赏
  • 举报
回复
谢谢.共同进步! 在PHP版混个星还真不容易:P

你可以把这个文件创建到WEB服务的根目录之外.
比如:
ldifde -f c:\ldif.ldif -v -d "cn=users,DC=$dnpre,DC=$dnend" -r "(objectClass=user)"

用ADO好象不行吧.不过ADSI是肯定可以的!
dream_river 2003-05-26
  • 打赏
  • 举报
回复
恭喜netvt(网络维他)升级成“红星”。
你的这一行命令确实能把域用户信息搜出来。
然后就可以用php读者个文本了。
但是用php读文本、分析文本有点太麻烦了。
并且不安全,在浏览器里输入路径就全down下来了。
vitalgg 2003-05-23
  • 打赏
  • 举报
回复
分析命令行下.
ldifde -f ldif.ldif -v -d "cn=users,DC=$dnpre,DC=$dnend" -r "(objectClass=user)"
生成的ldif.ldif文件.
应该可以得到你想要的全部域用户信息.
dream_river 2003-05-23
  • 打赏
  • 举报
回复
http://www.phpe.net/faq/58.shtml
dream_river 2003-05-23
  • 打赏
  • 举报
回复
这里有些文章,大概是说利用php_adodb_lib通过COM调用ADO,然后用ADO查询数据表。
当然,如果能够通过ADO查询数据表,肯定能用ADO查询活动目录。实验中……。
小果老 2003-05-23
  • 打赏
  • 举报
回复
严重关注, 查了好多资料都没有找到!
我一直在考虑两个问题:
1.怎样在PHP程序中验证win2k域用户?
2.怎样实现win2k,unix的单一用户认证?

一定会用到LDAP,但我不会:(

楼主这个问题其实就是我的第1个问题,我目前是这样解决的:
开设域用户后通常会同时给用户一个邮箱的吧? 如果没有邮箱, 下面的就不用看了
邮箱是支持ESMTP的吧? 也就是用户必须验证才可发信, 一般现在的邮件服务器都支持ESMTP
好了! 到网上搜一篇php通过socket连接email服务器发信的文章,作者好象是limoduo 记不清了,很抱歉:) 稍微改一下就可以了
思路是这样的,通过socket连接email服务器,在验证用户这一步,判断返回码就可以了,原程序在验证后开始发邮件,后面的不需要,退出即可!

大家可以试试, 不过但愿你不是用的M$ exchange , 会气S你的! 我现在用MDaemon
vitalgg 2003-05-21
  • 打赏
  • 举报
回复
在命令行下可以列出,用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";
}

?>


大家继续.......
dream_river 2003-05-21
  • 打赏
  • 举报
回复
谢谢大家的参与
有一个解决办法,但这是没有办法的办法。
用c#或C++做一个服务程序,或者调用.net的类库、或者使用ADO或者使用ADSI,肯定能把AD里的数据检索出来,然后再更新数据库用户表。我想微软的东西检索AD肯定没问题。
结论是:微软AD中的ldap协议不支持php的ldap函数。
但这样虽然能解决问题,可是根php就没关系了。岂不可悲?
goodname 2003-05-20
  • 打赏
  • 举报
回复
准备提到公告上去
goodname 2003-05-20
  • 打赏
  • 举报
回复
关注改问题
vitalgg 2003-05-20
  • 打赏
  • 举报
回复
应该是可行的.
作个记号,试验成功再回复,

同时关注..

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧