読者です 読者をやめる 読者になる 読者になる

Ruby/LDAP を使って LDAP からユーザーとその所属グループのリストを生成する

Ruby/LDAP を使う。Ruby/LDAP

  1. People からユーザとそのメイングループ番号を gidNumber から取得する。
  2. 各ユーザーのメイングループの cn を取得する。
  3. グループを全て走査して、所属するユーザーにマップをグループに追加する。
  4. 「user:group1,group2」という形式で書き出す。
#!/usr/bin/env ruby

require 'ldap'

people = Hash.new

LDAP::SSLConn.new("ldap.company.com") do |conn|
  conn.set_option(LDAP::LDAP_OPT_PROTOCOL_VERSION,3)
  bind_conn = conn.bind(バインドユーザのDN, バインドユーザのパスワード)

  bind_conn.search2("ou=People,dc=company,dc=com",
      LDAP::LDAP_SCOPE_SUBTREE,
      "uidNumber=*", ['uid', 'gidNumber']) { |entry|
    uid = entry['uid'].first
    gid = entry['gidNumber'].first
    people.store(uid, gid)
  }

  people.each do |k, v|
    bind_conn.search2("ou=Group,dc=company,dc=com",
        LDAP::LDAP_SCOPE_SUBTREE,
        "gidNumber=#{v}", ['cn']) { |entry|
      cn = entry['cn'].first
      people.store(k, [cn])
    }
  end

  groups = Array.new
  bind_conn.search2("ou=Group,dc=company,dc=com",
      LDAP::LDAP_SCOPE_SUBTREE,
      "gidNumber=*", ['dn']) { |entry|
    entry['dn'].each { |e| 
      groups.push e
    }
  }

  groups.each do |group|
    bind_conn.search2(group,
        LDAP::LDAP_SCOPE_SUBTREE,
        "(objectClass=*)", ['cn', 'memberUid']) { |entry|
      cn = entry['cn'].first
      uids = entry['memberUid']
      next if uids.nil?
      uids = [uids] unless uids.is_a?(Array)
      uids.each { |uid|
        if people.key? uid
          people[uid].push(cn)
        end
      }
    }
  end
end

people.each do |uid, groups|
  print "#{uid}:"
  puts groups.join(",")
end