2011-05-04 4 views
1

JNDI를 사용하여 로컬 네트워크에서 Kerberos SRV 레코드를 조회하고 싶습니다. 나는 잘하면 영리한 방법으로 로컬 도메인을 추측하려고합니다. 그것이 실패하면 나는 평범한 입장을 찾아보고 싶다. _kerberos._tcp을 입력하고 DNS 도메인 검색 목록을 사용하여 올바른 항목을 찾으십시오. 이것은 nslookup -type=srv _kerberos._tcp 및 Linux가 host -t srv _kerberos._tcp 인 Windows에서 작동합니다. 도메인 example.test이 추가되고 항목이 있습니다.JNDI가 DNS 검색 목록을 사용합니까?

import java.util.Hashtable; 

import javax.naming.Context; 
import javax.naming.NamingEnumeration; 
import javax.naming.NamingException; 
import javax.naming.directory.Attribute; 
import javax.naming.directory.Attributes; 
import javax.naming.directory.DirContext; 
import javax.naming.directory.InitialDirContext; 

public class JndiDnsTest { 

    public static void main(String[] args) { 
     if (args.length < 2) { 
      System.out.println("Usage: " + JndiDnsTest.class.getName() + 
        " name record-types..."); 
      return; 
     } 
     String name = args[0]; 
     String[] recordTypes = new String[args.length - 1]; 
     System.arraycopy(args, 1, recordTypes, 0, args.length - 1); 
     Hashtable<String, String> env = new Hashtable<String,String>(); 
     env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory"); 
     try { 
      DirContext ctx = new InitialDirContext(env); 
      Attributes dnsQueryResult = ctx.getAttributes(name, recordTypes); 
      if (dnsQueryResult == null) { 
       System.out.println("Not found: '" + name + "'"); 
      } 
      for (String rrType: recordTypes) { 
       Attribute rr = dnsQueryResult.get(rrType); 
       if (rr != null) { 
        for (NamingEnumeration<?> vals = rr.getAll(); vals.hasMoreElements();) { 
         System.out.print(rrType + "\t"); 
         System.out.println(vals.nextElement()); 
        } 
       } 
      } 
     } catch (NamingException e) { 
      e.printStackTrace(System.err); 
     } 
     System.out.println("\nThe DNS search list:"); 
     for (Object entry: sun.net.dns.ResolverConfiguration.open().searchlist()) { 
      System.out.println(entry); 
     } 
     System.out.println("\nsun.net.spi.nameservice.domain = " + 
       System.getProperty("sun.net.spi.nameservice.domain")); 
    } 
} 

JNDI는 직접 이름에 대한 하나의 조회를 수행 나에게 나타납니다 여기에

는 JNDI를 통해 DNS 조회를 수행하는 예제 프로그램입니다. 위 명령이 성공할 경우 항목이 없습니다. 그것은 DNS 검색 목록을 사용하지 않는 것 같습니다. 그 내용은 하단에 올바르게 인쇄됩니다. 한편

Networking properties documentation는 sun.net.spi.nameservice.domain 속성이 정의되지 않은 경우

다음 공급자가 플랫폼 DNS 구성에서 구성된 모든 도메인 또는 도메인 검색 목록을 사용하는 것을 말한다 .

(속성이 설정되지 않음) Java 버전은 Sun Java 1.6.0_20입니다.

JNDI가 DNS 검색 목록을 사용하는지 여부를 결정합니다.

답변