2011-12-15 13 views
0

私は1つのOUだけを使用するとうまく動作するこのスクリプトを持っています。しかし、$ ldapbaseを配列に入れて複数のOUを定義するとすぐに、ldap_get_entriesとldap_modifyの動作が停止します。私は理由を知っていますが、それに応じてコードを修正する方法がわかりません。LDAPアクティブディレクトリを複数変更するOUを検索

OUを定義する代わりに、またはsamaccountname = $ usernameのOUを取得する代わりに、フォレストルート全体をセッショニングする方法がありますか。

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

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

    $printpin=$_POST['printpin']; 
    $domadlogin = '[email protected]'; 
    $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 
    } 
    ?> 

ご迷惑をおかけして申し訳ございません。

答えて

0

あなたはの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のは、検索して、ループの最後のブレークをドロップする修正する必要がある場合。

+0

ldap_modify()[function.ldap-modify]を取得しようとした後に感謝します。変更:ldap_modifyの正しいOUを選択するか、それらを使用しようとしていますか。すべてそれぞれのために。私は、ユーザーが所属するOUを使用してレコードを変更したいだけです。 – Codded

+0

ユーザーエントリを変更する権利がないようです。あなたが正しいエントリーを変更していることを確認してください($ dnを印刷してください)。別のツール(例:Apache Directory Studio)を使用してエントリを変更することもできます。できない場合は、LDAP構成を修正する必要があります。 – Furgas

関連する問題