我这里有一台Windows Server 2008r2,安装了Active Directory、DNS、DHCP和DC,用于测试目的,我对LDAP还很陌生。
我想为自己更改密码,即使我不是管理员。
所以,这是我现在正在编写的脚本:
// LDAP Variables
$serverip = "192.168.2.1";
$serverport = 636;
$username = "user";
$userpassword = "password1";
$newpass = "password2";
$userDn = "CN=$username,CN=Users,DC=dc-name";
$ldapconn = ldap_connect($serverip, $serverport) or die("LDAP Connection Failed!\n");
ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
if ($ldapconn) {
echo "Connection succeded\n";
// LDAP Bind
$bindresult = ldap_bind($ldapconn, $username, $userpassword);
if ($bindresult) {
echo "Bind: Succeded\n";
$userData['unicodePwd'] = toPwEntry($newpass);
$modresult = ldap_mod_replace($ldapconn, $userDn , $userData);
if (!$modresult) echo "PW Change Failed - Error No. ". ldap_errno($ldapconn).": " .ldap_error($ldapconn) . "\n";
}
else echo "Bind Failed - Error No. ". ldap_errno($ldapconn).": " .ldap_error($ldapconn) . "\n";
}
else echo "Connection failed - Error No. ". ldap_errno($ldapconn).": " .ldap_error($ldapconn) . "\n";
function toPwEntry($pw) {
return("\"". iconv('UTF-8','UTF-16LE',$pw) ."\"");
}
ldap_close($ldapconn);
当我启动脚本时,我得到了这个错误:
soenke@work:~/Desktop/$ php ldap.php
Connection succeded
Bind Failed - Error No. -1: Can't contact LDAP server
我也尝试通过在ip前面使用"ldaps://“进行连接,但不起作用。如果有任何帮助,我将不胜感激!
发布于 2013-11-29 14:21:41
以下是一些建议:
ldap_bind()
想要$userDN
而不是$username
。不过,这会导致不同的错误消息。
在调用ldap_bind()
之前,您的web服务器和ldap服务器之间没有实际的网络流量,因此请确保没有任何防火墙/网络问题,等等。错误消息显示“无法联系服务器”;这可能正是正在发生的情况。(在更高版本的ldap_connect()
库中,ldap函数只是初始化本地结构。您可以更像"ldap_init()“--这里的”连接成功“消息并不意味着网络连接成功。)
您可以在389而不是636上设置LDAP服务器来处理安全和不安全连接。确保您连接到服务器希望您连接的位置。
如果您的TLS连接端无法验证服务器证书,也可能会出现这些症状。您必须提供要信任的根证书,或者将客户端配置为不验证证书(例如,如果服务器具有自签名证书)。其中任何一个都可以通过在ldap.conf文件中设置变量来实现。放置ldap.conf的位置取决于您的web服务器设置。
这个:http://www.novell.com/coolsolutions/tip/5838.html和这个:http://www.whatsnoodle.com/php-ldap_bind-gives-the-error-cant-contact-ldap-server/可能会为您提供更多详细信息。
发布于 2013-12-02 22:09:49
Active Directory只允许您通过LDAPS更改密码,我非常确定您必须使用端口636。
当您指定LDAPS://时,尝试使用大写字母。至少有一个MS提供程序名字对象区分大小写。我不完全确定它是不是LDAP;我多年来一直对所有绰号都使用大写字母。
我认为您的密码必须是八位字节字符串(字节数组)。我不会读PHP,所以我不知道你是不是在做这个,但我猜是这样的。
您的域控制器需要证书才能执行LDAPS。我不是证书专家,但我认为您为服务器使用的名称必须与证书上的名称匹配,而且它通常不是IP地址(尽管我认为您可以在证书上将它们放在备用名称中),因此我认为您应该使用服务器名称。
https://stackoverflow.com/questions/20285640
复制