2014-01-31 2 views
0

Я пытаюсь изменить атрибуты почты и пароля Active Directory с помощью java. Для этого был создан сертификат безопасности и импортирован в хранилище сертификатов jvm (carcerts). Соединение выполняется с использованием ssl, однако при попытке изменить любое поле, например, на почту, появляется следующее сообщение об ошибке:Изменить атрибут почты Active Directory

javax.naming.OperationNotSupportedException: [LDAP: код ошибки 53 - 00002035: LdapErr: DSID-0C090B3E, комментарии: Операция не допускается через GC порт, данные 0, v1db1

исходный код:

// change mail 
private void salvarEmailESenhaNoAd() throws IOException, NamingException { 
    Properties mudaSenhaProperties = new PropertiesFactory().propertiesByJndi("mudaSenha"); 

    ADUtil adUtil = null; 

    try 
    { 
     adUtil = new ADUtil(mudaSenhaProperties); 

     adUtil.changeEmail("CN=018061671627,OU=SDS,OU=CS,OU=STI,OU=DG,OU=PRES,OU=TRERN,DC=tre-rn,DC=jus,DC=br", dadosUsuario.getEmail()); 

    } 
    finally 
    { 
     if (adUtil != null) 
     { 
      adUtil.close(); 
     } 
    } 
} 



public class ADUtil { 

private LdapContext ldapContext = null; 

public ADUtil(Properties properties) throws NamingException 
{ 
    ldapContext = createUserContext(properties); 
} 


private LdapContext createUserContext(Properties properties) throws NamingException { 


    String javaNamingFactoryInitial = properties.getProperty("java.naming.factory.initial"); 
    String javaNamingProviderUrl = properties.getProperty("java.naming.provider.url"); 
    String javaNamingSecurityAuthentication = properties.getProperty("java.naming.security.authentication"); 
    String javaNamingSecurityPrincipal = properties.getProperty("java.naming.security.principal"); 
    String javaNamingSecurityCredentials = properties.getProperty("java.naming.security.credentials"); 
    String javaNamingSecurityProtocol = properties.getProperty("java.naming.security.protocol"); 
    String javaNamingReferral = properties.getProperty("java.naming.referral"); 
    String javaNetSslTrustStore = properties.getProperty("javax.net.ssl.trustStore"); 
    String javaNetSslTrustStorePassword = properties.getProperty("javax.net.ssl.trustStorePassword"); 

    Hashtable<String, String> env = new Hashtable<String, String>(); 

    System.setProperty("javax.net.ssl.trustStore", javaNetSslTrustStore); 
    System.setProperty("javax.net.ssl.trustStorePassword", javaNetSslTrustStorePassword); 

    env.put(Context.INITIAL_CONTEXT_FACTORY, javaNamingFactoryInitial); 
    env.put(Context.SECURITY_AUTHENTICATION, javaNamingSecurityAuthentication); 
    env.put(Context.SECURITY_PRINCIPAL, javaNamingSecurityPrincipal); 
    env.put(Context.SECURITY_CREDENTIALS, javaNamingSecurityCredentials); 
    env.put(Context.SECURITY_PROTOCOL, javaNamingSecurityProtocol); // para poder modificar password y grupos del usuario. 
    env.put(Context.PROVIDER_URL, javaNamingProviderUrl); 
    env.put(Context.REFERRAL, javaNamingReferral); 

    return new InitialLdapContext(env, null); 
} 


public void changePassword(String userCN, String newPassword) throws NamingException, UnsupportedEncodingException, IOException { 

    modifyAdAttribute(userCN, "unicodePwd", converteString(newPassword)); 
    System.out.println("Password changed for " + userCN); 
} 

public void changeEmail(String userDN, String newEmail) throws NamingException, UnsupportedEncodingException, IOException { 

    modifyAdAttribute(userDN, "mail", converteString(newEmail)); 
    System.out.println("Email changed for " + newEmail); 

} 


private void modifyAdAttribute(String userCN, String attribute, Object value) throws NamingException{ 
    ModificationItem[] modificationItem = new ModificationItem[1]; 
    modificationItem[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, 
      new BasicAttribute(attribute, value)); 
    ldapContext.modifyAttributes(userCN, modificationItem); 

} 


private static byte[] converteString(String password) throws UnsupportedEncodingException{ 
    String newQuotedPassword = "\"" + password + "\""; 
    return newQuotedPassword.getBytes("UTF-16LE"); 
} 

public void close() throws NamingException 
{ 
    if (ldapContext != null) 
    { 
     ldapContext.close(); 
    } 
} 

Чтение атрибутов обычно делается на код ниже:

public class TesteLdap { 

/** 
* @param args the command line arguments 
*/ 
private static SearchControls getSimpleSearchControls() { 
    SearchControls searchControls = new SearchControls(); 
    searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE); 
    searchControls.setTimeLimit(30000); 
    //String[] attrIDs = {"objectGUID"}; 
    //searchControls.setReturningAttributes(attrIDs); 
    return searchControls; 
} 

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


    try { 

     Hashtable env = new Hashtable(); 
     env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
     env.put(Context.PROVIDER_URL, "ldap://rndc10.tre-rn.jus.br:3269"); 
     env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
     env.put(Context.SECURITY_PRINCIPAL, "user"); 
     env.put(Context.SECURITY_CREDENTIALS, "password"); 

     env.put(Context.SECURITY_PROTOCOL, "ssl"); 
     env.put(Context.REFERRAL, "ignore"); 

     String filter = "(&(objectClass=user)(CN=018061671627))"; 

     LdapContext ctx = new InitialLdapContext(env, null); 
     ctx.setRequestControls(null); 
     NamingEnumeration<?> namingEnum = ctx.search("OU=DG,OU=PRES,OU=TRERN,DC=tre-rn,DC=jus,DC=br", filter, getSimpleSearchControls()); 

     while (namingEnum.hasMore()) { 
      SearchResult result = (SearchResult) namingEnum.next(); 
      Attributes attrs = result.getAttributes(); 
      System.out.println(attrs.get("cn")); 
      System.out.println(attrs.get("displayname")); 
      System.out.println(attrs.get("mail")); 
      System.out.println(attrs.get("distinguishedName")); 

     } 
     namingEnum.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 

Моя среда: Active Directory на Windows, 2008R2 Standart, Open JDK 7 работает на unbutu 12.10.

Я был бы признателен, если бы кто-нибудь помог мне, потому что я пробовал все, но я не могу заставить его работать.

ответ

0

У вас есть контроллеры только для чтения (только для чтения) в вашей среде? И если да, то rndc10.tre-rn.jus.br RODC?

Возможно, вы должны указывать на DC, который можно записать?

Вы пытались обновить эту строку:

env.put(Context.PROVIDER_URL, "ldap://rndc10.tre-rn.jus.br:3269"); 

к:

env.put(Context.PROVIDER_URL, "ldaps://rndc10.tre-rn.jus.br:3269"); 
            ^
1

ошибка, кажется, все понятно. Вы должны выполнить эту операцию над LDAPS через порт 636. Вы пробовали использовать

env.put(Context.PROVIDER_URL, "ldaps://rndc10.tre-rn.jus.br:636"); 

(Обратите внимание, что LDAPS: // не является обязательным, если вы укажете SSL отдельно).

Смежные вопросы