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();
手順は
となります。
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 } );