Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php LDAP修改active directory多OU搜索_Php_Active Directory_Ldap - Fatal编程技术网

Php LDAP修改active directory多OU搜索

Php LDAP修改active directory多OU搜索,php,active-directory,ldap,Php,Active Directory,Ldap,当我只使用一个OU时,我有这个脚本可以很好地工作。但只要我将$ldapbase放入一个数组并定义多个OU,ldap\u get\u条目和ldap\u modify就会停止工作。我知道为什么,但不知道如何相应地修改代码 有没有一种方法可以搜索整个林根而不必定义OU,或者只获取samaccountname=$username的OU <?php $username=$_GET['username']; if(isset($_POST['printpin'])) {

当我只使用一个OU时,我有这个脚本可以很好地工作。但只要我将$ldapbase放入一个数组并定义多个OU,ldap\u get\u条目和ldap\u modify就会停止工作。我知道为什么,但不知道如何相应地修改代码

有没有一种方法可以搜索整个林根而不必定义OU,或者只获取samaccountname=$username的OU

 <?php
    $username=$_GET['username']; 

    if(isset($_POST['printpin'])) {

    $printpin=$_POST['printpin'];   
    $domadlogin = 'admin@dom.co.uk';
    $domadpw = 'pass';

    $ldapServer = "dc.dom.co.uk";

    $ldapBase[] = "OU=Users1,DC=dom,DC=co,DC=uk";
    $ldapBase[] = "OU=Users2,DC=dom,DC=co,DC=uk";
    $ldapBase[] = "OU=Users3,DC=dom,DC=co,DC=uk";

    $ds = ldap_connect($ldapServer);
    if (!$ds) {die('Cannot Connect to LDAP server');}

    $ldapBind = ldap_bind($ds,$domadlogin,$domadpw);
    if (!$ldapBind) {die('Cannot Bind to LDAP server');}

    ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
    ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);

    foreach($ldapBase as $dn){ 
    $sr = ldap_search($ds, $dn, "(samaccountname=$username)");
    }

    $ent= ldap_get_entries($ds,$sr);
    $dn=$ent[0]["dn"];
    $newinfo['primaryTelexNumber']= $printpin;

    $save = ldap_modify($ds, $dn, $newinfo);

    if (!$save) {die('Cannot save to LDAP server');}
    ?>

    <p>Your new PIN number has now been set.</p>
    <p>Username:&nbsp;<?php echo $username; ?><br />PIN:<?php echo $printpin; ?></p>

    <?php
    }
    else {
    ?>

    <p>Username:&nbsp;<?php echo $username; ?></p>
    <form action="pin.php?username=<?php echo $username; ?>" method="POST">
    PIN: <input type="text" name="printpin" title="printpin"/>
    <input type="hidden" name="username" value="<?php echo $username; ?>"/>
    <input type="submit" value="Save">
    </form> 


    <?php
    }
    ?>

非常感谢您的帮助。

您应该将更多代码移到foreach循环中,并添加一些检查,如:

foreach ($ldapBase as $dn){ 
    $sr = ldap_search($ds, $dn, "(samaccountname=$username)");
    $ent = ldap_get_entries($ds, $sr);

    if ($ent === false || $ent['count'] === 0)
        continue;

    $dn = $ent[0]['dn'];
    $newinfo['primaryTelexNumber'] = $printpin;

    $save = ldap_modify($ds, $dn, $newinfo);

    if (!$save)
        die('Cannot save to LDAP server');

    break;
}

如果需要搜索和修改所有OU,则删除循环中的最后一个中断。

感谢您的回复,尝试后我正在获取ldap_modify[function.ldap modify]:modify:中的访问不足。。。。。这是为ldap_修改选择了正确的OU,还是尝试在for each中使用它们。我只想使用用户所在的OU并修改其记录。您似乎无权修改用户条目。检查您是否正在更改右项打印$dn。您还可以尝试使用另一个工具(例如Apache Directory Studio)修改条目。如果不能,则需要修复LDAP配置。