ldap_add():服务器不愿意执行-使用PHP将记录插入AD

时间:2019-11-25 19:47:35

标签: php active-directory ldap

我正在使用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插入失败(根据我自己的错误消息)。

2 个答案:

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