我正在使用ldap_add将记录插入到Active Directory中,但是我得到了警告:ldap_add():添加:服务器不愿意在我的PHP文件中的ldap_add行上执行。
奇怪的是,我可以在同一目录上使用“ cn = some name”过滤器执行 ldap_search ,但是当我使用ldap_add时失败。
我在同一问题上阅读了很多StackOverflow问题,其中大多数都尝试使用MD5哈希密码和/或从未在ldap.conf文件中使用TLS_REQCERT,并且我都尝试了两次,但均未成功。
这是我在ldap_connect和ldap_bind之后的代码,直到一切正常为止-
(对于连接,我正在使用-ldap_connect(“ ldaps:// MyIP:636”))
if ($ldapbind) {
echo "LDAP bind successful...";
//This part works fine and I'm able to do ldap_search with cn filter on the same directory
$searchResult = ldap_search($ldapconn,'OU=Users,OU=Testing OU,DC=My,DC=Domain,DC=Net', "(cn=manish test)") or die ("Error in search query: ".ldap_error($ldapconn));
$data = ldap_get_entries($ldapconn, $result);
echo '<h1>Dump all data</h1><pre>';
print_r($data);
echo '</pre>';
//ldap_search ends
//ldap_add part begins
$data['cn'] = 'mk test02';
$data['sn'] = 'test02';
$data["objectclass"][0] = "top";
$data["objectclass"][1] = "person";
$data['givenName'] = 'mkss';
$data['displayName'] = 'mk test02';
$data['name'] = 'mk test02';
$data['sAMAccountName'] = 'mk_test02';
$data['userPrincipalName'] = 'mk_test02@SomeName.Net';
$data['mail'] = 'manish.k@domain.com';
$data['userPassword'] = "{MD5}".base64_encode(pack("H*",md5('Password1!')));
//Also tried using just- $data['userPassword'] = md5('Password1!');
$adInsert = ldap_add($ldapconn, "OU=Users,OU=Testing OU,DC=My,DC=Domain,DC=Net", $data);
echo 'error- '.ldap_error($ldapconn);
if (!$adInsert)
{
echo '<p>AD Insert failed</p>';
exit;
}
}
我得到警告:ldap_add():添加:服务器不愿意执行,并且 AD插入失败(根据我自己的错误消息)。
答案 0 :(得分:0)
我认为您有几个问题:
首先,这个:
$data = ldap_get_entries($ldapconn, $result);
但是,您还将$data
变量用于新帐户的所有信息。从ldap_get_entries
返回的所有数据都将作为新帐户的信息的一部分发送。这很可能使其无法正常工作。
我还怀疑您设置objectClass
可能的方式存在问题。但是,我从未在PHP中创建过帐户,所以不确定。我猜想这会起作用:
$data["objectclass"] = "user";
但是我可能是错的。也许您的方法很好。
此外,密码:userPassword
属性仅在启用某些设置后才起作用。即使是这样,它实际上也只是真实密码属性unicodePwd
的同义词。因此userPassword
可能有效,但是unicodePwd
会始终有效。
密码字符串必须采用文档描述的非常特定的格式。具体来说,用引号和UTF-16编码括起来。您似乎正在尝试计算字符串的MD5哈希值。我认为这是您收到该错误的真正原因。
ldap-modify-batch
的PHP文档提供了一个用于更改用户密码的示例,但是显示了一个将常规字符串转换为AD期望格式的函数:
function adifyPw($pw)
{
return iconv("UTF-8", "UTF-16LE", '"' . $pw . '"');
}
根据您的情况,您可以像这样使用它:
$data['unicodePwd'] = adifyPw('Password1!');
请记住,您必须安全连接(通常表示LDAPS)才能设置或更改任何密码。
答案 1 :(得分:0)
任何人都在寻找答案的方法-在另一个答案中浏览 @GabrielLuci 的有用建议。 对我有用的是这些建议和此后的最佳答案的结合, ldap_add in php returning "already exists 68" error,特别是这部分-
So you should call something like the following before calling the ldap_add:
$dn = 'cn=' . $NewUser['cn'][0] . ',' . $dn;
因此,在我称为 ldap_add 的行的上方,我将其更改为以下内容-
$dn = 'OU=Users,OU=Testing OU,DC=My,DC=Domain,DC=Net';
$dn = 'cn=' . $data['cn'] . ',' . $dn;
$adInsert = ldap_add($ldapconn, $dn, $data);