Perl Net::LDAPでLDAPアカウント情報を検索表示

概要

LDAPでアカウントを管理しているとuid一覧を取得したくなったりメールアドレス一覧を取得したくなったりします。

ldapsearchコマンドでも実現可能ですがPerlでNet::LDAPを使ってスクリプトを書いてみました。

サンプル

エントリ内のデータを全て表示

#!/usr/bin/env perl

use strict;
use warnings;
use Net::LDAP;

my $ldap;
my $msg;

# 接続先サーバーの定義
my $LDAP_HOST = "ldap.example.com";
my $LDAP_DN = undef;
my $LDAP_PW = undef;

# 検索条件の定義
my $SEARCH_BASE = "ou=Users,dc=example,dc=com";
my $SEARCH_FILTER = "(&(objectclass=inetOrgPerson)(uid=*))";

# LDAPサーバーへの接続
$ldap = Net::LDAP->new($LDAP_HOST) or die $@;

# bind
if (defined $LDAP_DN) {
  $msg = $ldap->bind($LDAP_DN, password => $LDAP_PW);
} else {
  $msg = $ldap->bind();
}

if ($msg->code) {
  die $msg->error;
}

# 検索
$msg = $ldap->search(
  base => $SEARCH_BASE,
  filter => $SEARCH_FILTER,
);

# 各エントリの取得
#foreach my $entry ($msg->entries) {

# 各エントリツリー表示
  my $dn = $entry->dn;
  print "dn: $dn\n";

    foreach my $attr ($entry->attributes) {
      foreach my $val ($entry->get_value($attr)) {
        print "$attr: $val\n";
      }
    }

# 問い合わせ結果を表示
print "\n";
}

# unbind
$ldap->unbind;
exit 0;


特定の属性の値だけ表示

上記スクリプトは各LDAPアカウントのデータを全て表示させるものですが、
以下のように変更すると特定のattributesの値が取得出来ます。

# 各エントリの取得
foreach my $entry ($msg->entries) {

# 各エントリツリー表示
  my $dn = $entry->dn;
  print "dn: $dn\n";

    foreach my $attr ($entry->attributes) {
      foreach my $val ($entry->get_value($attr)) {
        print "$attr: $val\n";
      }
    }

# 問い合わせ結果を表示
print "\n";
}

foreach my $entry ($msg->entries) {
  print "uid=", $entry->get_value('uidNumber'), "(", $entry->get_value('uid'), ")", "\n";


表示例

uid=1000(tsunokawa)

こんな感じでidコマンドの結果のように特定属性のみ取得して表示させることが出来るようになります。


またメールアドレス一覧を取得したくなったら以下のように変更すると取得可能です。

print $entry->get_value('mail'),"\n";