【问题标题】:ldap_add(): Server is unwilling to perform - Using PHP to insert records into ADldap_add(): 服务器不愿意执行 - 使用PHP向AD插入记录
【发布时间】:2019-11-25 19:47:35
【问题描述】:

我正在使用 ldap_add 将记录插入 Active Directory,但我在 PHP 文件中的 ldap_add 行中收到 Warning: ldap_add(): Add: Server is unwilling to perform

奇怪的是,我可以在同一目录上使用“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;
        }
    }

我收到 Warning: ldap_add(): Add: Server is unwilling to performAD Insert failed(来自我自己的错误消息)。

【问题讨论】:

    标签: php active-directory ldap


    【解决方案1】:

    我认为你有几个问题:

    首先,这个:

    $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)才能设置或更改任何密码。

    【讨论】:

    • 感谢您的回复。我在测试期间已经尝试过了(使用 unicodePwd 代替 userPassword 并使用 UTF-16 编码),但它仍然在“ldap_add”行出错,并显示“服务器不愿意执行”消息。
    • 密码绝对是一个问题。我再次查看了您的代码,并用其他一些可能导致问题的内容更新了答案的开头。
    • 对不起,我在我的最终代码中注释掉了搜索部分。我包含它只是为了表明搜索工作正常。 $data['cn'] 是第一个使用 $data 的实例。您能想到为什么搜索会起作用但添加不起作用的任何其他原因? (我已经仔细检查了我的访问权限,并且我也有正确的写入权限)
    • 您可以在ldap_add 之前再次尝试使用print_r($data),以确保它看起来不错。此外,还有 objectClass 属性,就像我添加到我的答案中一样。
    • 感谢您的建议。我发布了最终对我有用的答案。
    【解决方案2】:

    任何正在寻找这个答案的人 - 阅读另一个答案中 @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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多