2017-01-12 6 views
-1

Scalaを使用して多数のADグループを展開しようとしています。Scalaを使用してADグループを展開する

http://www.thetekblog.com/2010/06/active-directory-with-ldap-retrieving-all-members-of-a-group/

ここで与えられたコードに基づいて、私は

package com.abhi 

import java.util 
import javax.naming.ldap._ 
import javax.naming._ 
import java.util.Hashtable 
import javax.naming.directory.{SearchControls, SearchResult} 
object LDAPScala extends App { 
    val base = "ou=Foo,dc=MYCOMPANY,dc=COM" 
    val env = new util.Hashtable[String, String]() 
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory") 
    env.put(Context.SECURITY_AUTHENTICATION, "simple") 
    env.put(Context.SECURITY_PRINCIPAL, "[email protected]") 
    env.put(Context.SECURITY_CREDENTIALS, "Bar") 
    env.put(Context.PROVIDER_URL, "ldap://ldapserver.mycompany.com:389") 
    val groupList = List("Group1", "Group2", "Group3") 

    try { 
     val ctx = new InitialLdapContext(env, null) 
     val searchCtls = new SearchControls() 
     searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE) 
     val attributes = Array("member","memberof") 
     searchCtls.setReturningAttributes(attributes); 

     for { 
     group <- groupList 
     } { 
     val searchFilter = s"(&(objectCategory=group)(name=${group}))" 
     val answers = ctx.search(base, searchFilter, searchCtls) 
     while(answers.hasMoreElements) { 
      val answer = answers.next() 
      val attributes = answer.getAttributes.getAll 
      while(attributes.hasMore) { 
       val attr = attributes.nextElement() 
       val everyone = attr.getAll 
       while(everyone.hasMore) { 
       val person = everyone.next() 
       println(person) 
       } 
      } 
     } 
     } 
    } catch { 
     case e : Exception => 
     println(e.getMessage) 
     println(e.getStackTrace) 
    } 
} 

このコードは動作し、私はこの

CN=User1,OU=Users,OU=Accounts,OU=tor,OU=CA,OU=AMER,OU=Regions,DC=FOO,DC=COM 
CN=User2,OU=Users,OU=Accounts,OU=LON,OU=UK,OU=EMEA,OU=Regions,DC=FOO,DC=COM 
CN=User3,OU=Users,OU=Accounts,OU=pla,OU=US,OU=AMER,OU=Regions,DC=FOO,DC=COM 

のように、各グループ内のユーザーのリストを表示することができ、次のコードを書きました3つの質問

  1. 私はログインIDが必要でした(私はそれらがsamAccountNamesと呼ばれると思います)。 CNにはログインIDではなく実際の人の名前が入っています。

  2. これは私にすべてのメンバーを与えますか?あまりにも多くのユーザーがいる場合、ADはグループのユーザー数を切り捨てるような制限があることを覚えています。

  3. グループ内にグループがある場合、上記のコードが機能するかどうかわかりません。

答えて

0

私はsamAccountNamesへのCNを変換することができました。最終コードは

package com.abhi 
import java.util 
import javax.naming.ldap._ 
import javax.naming._ 
import javax.naming.directory.SearchControls 
import scala.collection.mutable.ArrayBuffer 

object LDAPScala extends App { 
    val base = "dc=FOO,dc=COM" 
    val env = new util.Hashtable[String, String]() 
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory") 
    env.put(Context.SECURITY_AUTHENTICATION, "simple") 
    env.put(Context.SECURITY_PRINCIPAL, "[email protected]") 
    env.put(Context.SECURITY_CREDENTIALS, "pass") 
    env.put(Context.PROVIDER_URL, "ldap://adserver.foo.com:389") 
    val groupList = List("group1", "group2", "group3") 

    try { 
     val people = for { 
     group <- groupList 
     cn <- queryAD(base, s"(&(objectCategory=group)(name=${group}))", "member") 
     sam <- queryAD(cn, "(sAMAccountName=*)", "samaccountname") 
     name <- getName(cn) 
     } yield (group, sam, name) 
     people.foreach{case (g, s, n) => println(s"$g,$s,$n")} 
    } catch { 
     case e : Exception => 
     println(e.getMessage) 
     println(e.getStackTrace) 
    } 

    def getName(cn: String): Option[String] = { 
     val regex = """^CN=([\w\s\d]*),.*$""".r 
     cn match { 
     case regex(name) => Some(name) 
     case _ => None 
     } 
    } 

    def queryAD(base: String, searchFilter: String, attribute: String): List[String] = { 
     val ctx = new InitialLdapContext(env, null) 
     val searchCtls = new SearchControls() 
     searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE) 
     searchCtls.setReturningAttributes(Array(attribute)) 
     val answers = ctx.search(base, searchFilter, searchCtls) 
     var retVal = ArrayBuffer[String]() 
     while(answers.hasMoreElements) { 
     val answer = answers.next() 
     val member = answer.getAttributes.get(attribute).getAll 
     while(member.hasMoreElements) { 
      val person = member.next().toString 
      retVal += person 
     } 
     } 
     retVal.toList 
    } 
} 
です。
関連する問題