PerlでLDAPのエントリを更新する

2012年12月17日
LDAPエントリ更新の雛形をメモ。

ソース

DNが uid=user1,ou=People,dc=exsample,dc=jp のエントリが持つmail属性を更新します。

use Encode;
use Net::LDAP;
 
my $admin     = 'cn=Manager,ou=People,dc=example,dc=jp';
my $pass      = 'password';
my $uid       = 'user1';
my $newemail  = encode('utf-8', 'user1@example.jp' );
my $bdn       = "uid=$uid,ou=People,dc=exsample,dc=jp";
##my $bdn2      = "ou=People,dc=exsample,dc=jp";
 
my $ldap = Net::LDAP->new('host:389');
 
my $mess    = $ldap->bind( $admin,  password => $pass );
 
my $ldapmem = $ldap->search(
                             base   => $bdn,
                             scope  => "base",
                             filter => "objectClass=*"
                           );
 
## my $ldapmem = $ldap->search(
##                             base   => $bdn2,
##                             scope  => "sub",
##                             filter => "(uid=$uid)"
##                           );
 
my $entry  = ($ldapmem->entries)[0];
my $result = $ldap->modify( 
                            $entry,
                            replace => { mail=> $newemail }
                          );
  $ldap->unbind();

簡単な説明

手順は

  1. バインドする
  2. 目的のエントリを探す
  3. そのエントリを更新
  4. アンバインドする

となります。

search()メソッドのscopeに“sub”を指定すると、指定のBDNから再帰的に検索します。 filterは必須で、これが無いとエントリがなぜか見つかりません。

search()メソッドの結果は配列で返されます。1エントリしか検索されない場合、第0番目の要素が該当します。 エントリのオブジェクトにあるget_value()メソッドで属性値を取り出せます。

  $entry  = ($ldapmem->entries)[0];
 
  print $entry->get_value("mail")."\n";

modify()メソッドで更新したいDN(今しがたsearch()で見つけたもの)、更新したい属性とその値を指定します。 groupオブジェクトのmember属性のように複数の値を格納する場合、属性値を取得後に値をマージ、マージ結果をmodify()メソッドでアップデートしてあげる事になるようです。 こんな感じ。配列で複数の値を表すようです。

my $result = $ldap->modify( 
                            $entry,
                            replace => { memberUid=> @memberUids }
                          );