ldap_add(): 服务器不愿意执行 - 使用 PHP 向 AD 中插入记录
ldap_add(): Server is unwilling to perform - Using PHP to insert records into AD
我正在使用 ldap_add 将记录插入 Active Directory,但我收到 警告:ldap_add():添加:服务器不愿执行 在我的 PHP 文件中 ldap_add 的行上。
奇怪的是,我能够在同一目录上使用 "cn=some name" 过滤器执行 ldap_search,但是当我使用时它失败了ldap_add.
我阅读了很多关于同一问题的 Whosebug 问题,其中大多数尝试使用 MD5 散列密码 and/or 使用 TLS_REQCERT never in ldap.conf 文件,我有两种都试过了,但都没有成功。
这是我在 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插入失败(来自我自己的错误信息)。
我认为你有几个问题:
首先,这个:
$data = ldap_get_entries($ldapconn, $result);
但是您还使用 $data
变量来获取新帐户的所有信息。从 ldap_get_entries
返回的所有数据都作为新帐户信息的一部分发送。这很可能会使它不起作用。
我还怀疑您设置 objectClass
的方式可能 有问题。但是,我从未在 PHP 中创建过帐户,所以我不确定。我猜这会起作用:
$data["objectclass"] = "user";
但我可能是错的。或许你的方法正好。
另外,密码:userPassword
attribute only works when certain settings are enabled. Even when it is, it's really just a synonym for the real password attribute, 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)才能设置或更改任何密码。
任何正在为此寻找答案的人 - 阅读其他答案中 @GabrielLuci 提出的有用建议。
对我有用的是这些建议和关于这个 post- 的最佳答案的组合
,具体这部分-
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);
我正在使用 ldap_add 将记录插入 Active Directory,但我收到 警告:ldap_add():添加:服务器不愿执行 在我的 PHP 文件中 ldap_add 的行上。
奇怪的是,我能够在同一目录上使用 "cn=some name" 过滤器执行 ldap_search,但是当我使用时它失败了ldap_add.
我阅读了很多关于同一问题的 Whosebug 问题,其中大多数尝试使用 MD5 散列密码 and/or 使用 TLS_REQCERT never in ldap.conf 文件,我有两种都试过了,但都没有成功。
这是我在 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插入失败(来自我自己的错误信息)。
我认为你有几个问题:
首先,这个:
$data = ldap_get_entries($ldapconn, $result);
但是您还使用 $data
变量来获取新帐户的所有信息。从 ldap_get_entries
返回的所有数据都作为新帐户信息的一部分发送。这很可能会使它不起作用。
我还怀疑您设置 objectClass
的方式可能 有问题。但是,我从未在 PHP 中创建过帐户,所以我不确定。我猜这会起作用:
$data["objectclass"] = "user";
但我可能是错的。或许你的方法正好。
另外,密码:userPassword
attribute only works when certain settings are enabled. Even when it is, it's really just a synonym for the real password attribute, 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)才能设置或更改任何密码。
任何正在为此寻找答案的人 - 阅读其他答案中 @GabrielLuci 提出的有用建议。
对我有用的是这些建议和关于这个 post- 的最佳答案的组合
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);