Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java连接到远程AD LDS服务器_Java_Active Directory_Adlds - Fatal编程技术网

使用Java连接到远程AD LDS服务器

使用Java连接到远程AD LDS服务器,java,active-directory,adlds,Java,Active Directory,Adlds,我有一个azure虚拟机,我在上面托管了一个AD LDS实例。我还在OU中创建了一些用户。我正在尝试使用Java代码连接到AD LDS实例。我的代码如下: public final class Main { private static final List<String> EMPTY_ARGS = emptyList(); public static void main(String[] args) throws Exception { Lis

我有一个azure虚拟机,我在上面托管了一个AD LDS实例。我还在OU中创建了一些用户。我正在尝试使用Java代码连接到AD LDS实例。我的代码如下:

public final class Main {

    private static final List<String> EMPTY_ARGS = emptyList();

    public static void main(String[] args) throws Exception {

        List<String> argsList = asList(args);

        String url = "LDAP://xx.xx.xxx.xx:389/o=org,c=US";   //Public IP of VM
        String principal = "CN=Test User,OU=Users,O=org,C=US";
        String password = "password";
        List<String> attributeNames = new ArrayList<String>();

        attributeNames.add(url);
        attributeNames.add(principal);
        attributeNames.add(password);

        System.out.println("url = " + url);
        System.out.println("principal = " + principal);
        System.out.println("password = " + password);
        System.out.println("attributeNames = " + attributeNames);

        Hashtable<Object, Object> env = new Hashtable<Object, Object>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, url);
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, principal);
        env.put(Context.SECURITY_CREDENTIALS, password);

        env.put("java.naming.ldap.factory.socket", "cnauroth.ldaputil.CustomSSLSocketFactory");

        DirContext ctx = null;

        try {
            System.out.println("Inside");
            ctx = new InitialDirContext(env);

            System.out.println("Successfully authenticated.");

            if (!attributeNames.isEmpty()) {
                Attributes attributes = ctx.getAttributes(principal,
                    attributeNames.toArray(new String[attributeNames.size()]));

                for (String attributeName : attributeNames) {
                    Attribute attribute = attributes.get(attributeName);

                    if (null != attribute) {
                        NamingEnumeration<?> values = attribute.getAll();

                        if (null != values) {
                            if (values.hasMore()) {
                                System.out.println(attributeName);

                                while (values.hasMore())
                                    System.out.println("    " + values.next());
                            }
                        }
                    }
                }
            }
        }
        finally {
            if (null != ctx) {
                try {
                    ctx.close();
                }
                catch (NamingException e) {
                    e.printStackTrace(System.err);
                }
            }
        }
    }
}
公共最终类主{
私有静态最终列表EMPTY_ARGS=emptyList();
公共静态void main(字符串[]args)引发异常{
列表argsList=asList(args);
String url=“LDAP://xx.xx.xxx.xx:389/o=org,c=US”;//虚拟机的公共IP
String principal=“CN=Test User,OU=Users,O=org,C=US”;
字符串password=“password”;
List attributeName=new ArrayList();
attributeNames.add(url);
attributeNames.add(主体);
AttributeName.add(密码);
System.out.println(“url=“+url”);
System.out.println(“principal=“+principal”);
System.out.println(“password=“+password”);
System.out.println(“attributeNames=“+attributeNames”);
Hashtable env=新的Hashtable();
put(Context.INITIAL\u Context\u工厂,“com.sun.jndi.ldap.LdapCtxFactory”);
env.put(Context.PROVIDER_URL,URL);
环境put(Context.SECURITY_认证,“simple”);
环境put(Context.SECURITY_PRINCIPAL,PRINCIPAL);
环境放置(Context.SECURITY\u凭证、密码);
put(“java.naming.ldap.factory.socket”、“cnauroth.ldaputil.CustomSSLSocketFactory”);
DirContext ctx=null;
试一试{
系统输出打印项次(“内部”);
ctx=新的初始目录上下文(env);
System.out.println(“已成功验证”);
如果(!attributeNames.isEmpty()){
Attributes=ctx.getAttributes(主体,
attributeNames.toArray(新字符串[attributeNames.size()]);
for(字符串attributeName:attributeName){
Attribute=attributes.get(attributeName);
if(null!=属性){
NamingEnumeration values=attribute.getAll();
if(null!=值){
if(values.hasMore()){
System.out.println(attributeName);
while(values.hasMore())
System.out.println(“+values.next());
}
}
}
}
}
}
最后{
如果(null!=ctx){
试一试{
ctx.close();
}
捕获(NamingE例外){
e、 printStackTrace(System.err);
}
}
}
}
}
当我从VM外部执行此代码时,会出现以下错误:

Exception in thread "main" javax.naming.CommunicationException: 191.238.241.11:389 [Root exception is java.net.ConnectException: Connection timed out: connect]
    at com.sun.jndi.ldap.Connection.<init>(Unknown Source)
    at com.sun.jndi.ldap.LdapClient.<init>(Unknown Source)
    at com.sun.jndi.ldap.LdapClient.getInstance(Unknown Source)
    at com.sun.jndi.ldap.LdapCtx.connect(Unknown Source)
    at com.sun.jndi.ldap.LdapCtx.<init>(Unknown Source)
    at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(Unknown Source)
    at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(Unknown Source)
    at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(Unknown Source)
    at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(Unknown Source)
    at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
    at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
    at javax.naming.InitialContext.init(Unknown Source)
    at javax.naming.InitialContext.<init>(Unknown Source)
    at javax.naming.directory.InitialDirContext.<init>(Unknown Source)
    at cnauroth.ldaputil.Main.main(Main.java:92)
Caused by: java.net.ConnectException: Connection timed out: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.connect(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.<init>(Unknown Source)
    at sun.security.ssl.SSLSocketFactoryImpl.createSocket(Unknown Source)
    at cnauroth.ldaputil.CustomSSLSocketFactory.createSocket(CustomSSLSocketFactory.java:72)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.jndi.ldap.Connection.createSocket(Unknown Source)
    ... 15 more
线程“main”javax.naming.CommunicationException中的异常:191.238.241.11:389[根异常为java.net.ConnectException:连接超时:连接] 位于com.sun.jndi.ldap.Connection。(未知源) 位于com.sun.jndi.ldap.LdapClient。(未知源) 位于com.sun.jndi.ldap.LdapClient.getInstance(未知源) 位于com.sun.jndi.ldap.LdapCtx.connect(未知源) 位于com.sun.jndi.ldap.LdapCtx。(未知来源) 位于com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(未知源) 位于com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(未知源) 位于com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(未知源) 位于com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(未知源) 位于javax.naming.spi.NamingManager.getInitialContext(未知源) 位于javax.naming.InitialContext.getDefaultInitCtx(未知源) 位于javax.naming.InitialContext.init(未知源) 位于javax.naming.InitialContext。(未知源) 位于javax.naming.directory.InitialDirContext。(未知源) 位于cnauroth.ldaputil.Main.Main(Main.java:92) 原因:java.net.ConnectException:连接超时:连接 位于java.net.DualStackPlainSocketImpl.connect0(本机方法) 位于java.net.DualStackPlainSocketImpl.socketConnect(未知源) 位于java.net.AbstractPlainSocketImpl.doConnect(未知源) 位于java.net.AbstractPlainSocketImpl.connectToAddress(未知源) 位于java.net.AbstractPlainSocketImpl.connect(未知源) 位于java.net.PlainSocketImpl.connect(未知源) 位于java.net.socksocketimpl.connect(未知源) 位于java.net.Socket.connect(未知源) 位于sun.security.ssl.SSLSocketImpl.connect(未知源) 位于sun.security.ssl.SSLSocketImpl。(未知源) 位于sun.security.ssl.SSLSocketFactoryImpl.createSocket(未知源) 位于cnauroth.ldaputil.CustomSSLSocketFactory.createSocket(CustomSSLSocketFactory.java:72) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源) 在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源) 位于java.lang.reflect.Method.invoke(未知源) 位于com.sun.jndi.ldap.Connection.createSocket(未知源) ... 还有15个
错误的原因可能是什么?如果我在虚拟机本身上运行类似的代码,我就能够连接到AD LDS实例

使用telnet并检查您是否能够连接到服务器。我无法使用telnet进行连接。这是防火墙问题吗?我检查了端口389是否打开,它是否打开。我提供的IP地址可能是Azure提供的VM的公共虚拟IP地址,我需要一个静态IP地址来连接VM