Question

Je voudrais utiliser JNDI pour rechercher les enregistrements Kerberos SRV dans un réseau local. J'essaie de deviner le domaine local de manière, espérons-le, intelligente. Si cela échoue, je voudrais rechercher l'entrée simple, par exemple _kerberos._tcp sans aucun suffixe et comptez sur la liste de recherche du domaine DNS pour trouver la bonne entrée. Cela fonctionne sur Windows avec nslookup -type=srv _kerberos._tcp et linux avec host -t srv _kerberos._tcp. Le domaine example.test est annexé et l'entrée est trouvée.

Voici un exemple de programme pour effectuer des recherches DNS via JNDI:

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"));
    }
}

Il me semble que JNDI ne fait qu'une seule recherche pour le nom direct. Aucune entrée n'est trouvée là où les commandes ci-dessus réussissent. Il semble qu'il n'utilise pas la liste de recherche DNS. Cependant, son contenu est imprimé correctement en bas.

D'un autre côté Documentation des propriétés de réseautage dit ça

Si la propriété Sun.net.spi.NameService.Domain n'est pas définie, le fournisseur utilisera n'importe quelle liste de recherche de domaine ou de domaine configurée dans la configuration DNS de la plate-forme.

(La propriété n'est pas définie.) La version Java est Sun Java 1.6.0_20.

JNDI utilise-t-il la liste de recherche DNS ou non?

Était-ce utile?
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top