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);