ActiveDirectoryをLDAPサーバとして参照

ここではperlのモジュールNet::LDAPを使用したActiveDirectoryをLDAPサーバとして参照する方法を、実際のスクリプトを引用しながら説明します。引用したスクリプトは、ユーザーがどのグループに所属しているか、また、グループを構成するメンバの一覧をWeb上で参照したい、との要望に応じて実際に作成して動作しているものです。ActiveDirectoryにログオンできる環境であることが前提です。ActiveDirectoryを認証にだけでなくディレクトリサーバとしても活用しましょう!メールアドレスくらいは入れておこうね。
LDAPクライアントアプリ(これはこれで便利なのですが一般向けではないので)を用いてスキーマやフィルタ条件を確認しながらスクリプト作成するとやりやすいです。

  • LDAPサーバアクセスの準備
#サーバ接続
my $ldap = Net::LDAP->new($HOST, port=>389);
#バインド(ログオン)
my $rtn_bind = $ldap->bind(
    $DN,
    $PW,
);
if($rtn_bind->is_error()){
    #エラー処理
}else{
    #正常処理
}
    • $HOST:ActiveDirectoryサーバアドレス
    • port:ポート番号指定(デフォルト値389)
    • $DN:ActiveDirectoryにログオンする際のID@ドメイン名.local(例)user_id@DOMAIN.local
    • $PW:ActiveDirectoryにログオンする際のPW
  • エントリのサーチ
my $rtn_search = $ldap->search(
    base=>$BASE,
    filter => "(&(cn=*))",
    attrs => ["cn","objectClass","memberof","member","description"]) or die "$@";
    • base:CN=Users,dc=(ドメイン名),dc=local; #BaseDN
    • filter:サーチフィルタ
    • attrs:属性指定。指定なき場合は全部の要素を拾ってくる(参考
      • cn:表示名
      • objectClass:エントリ種類(person|groupとか)
      • memberof:personであった場合に所属するグループ
      • member:groupであった場合に構成するメンバ
      • description:備考欄

あとはこんな感じ(以下)

#*** データの抽出
foreach my $entry ($rtn_search->all_entries){
    my $name = $entry->get_value('cn');	#名称
    my @objectClasses = $entry->get_value('objectClass','all');    #all:複数ある場合はすべてのエントリを取得
    #objectClasses[0]=top
    #objectClasses[1]=(person|group|container)
    #objectClasses[2]=(organizationalPerson|(null))
    #objectClasses[3]=(user|null)
    if($type eq 'person'){
        print("P\t$name");
        my @memberOf = $entry->get_value('memberOf','all');
        foreach my $project (@memberOf){
            $project = (split(/,/, $project))[0];    #CN=XXX,CN=YYY,CN=ZZZ => CN=XXX
            $project = (split(/=/, $project))[1];    #CN=XXX => XXX
            print("\t$project");
        }
    }elsif($type eq 'group'){
        print("G\t$name");
        my @members = $entry->get_value('member','all');    #複数ある場合はすべてのエントリを取得
        foreach my $member (@members){
            #同上
        }
    }
}