AD LDS Attribute in einer Partition ändern

StehtimSchilf

Erfahrenes Mitglied
Hi Forum

Ich habe mit Microsoft AD LDS ein dummy-AD mit folgender Partition angelegt:
localhost:50000/CN=devmid,DC=devlab,DC=local (s. Screenshot weiter unten).

Bitte beachtet, dass der CN bewusst so gewählt wurde - wird sogar im AD LDS Wizard als Beispiel verwendet.

So soweit, kein Problem.

Ich kann nun mit nachfolgendem Code, problemlos Attribute (name, comment, distinguishedName) eines Benutzer in CN=users auslesen, aber nicht modifizieren:

Code:
    private static void testADLDSSetAttribute2() {
        String url = "ldap://192.168.1.1:50000/CN=devmid,DC=devlab,DC=local";
        String credentials = "supergeheim";
        String principals = "CN=administrator,CN=users,CN=devmid,DC=devlab,DC=local";                             
        String loginNameAttributeName = "name";
        
        String loginName = "midtest2";
        String attributeName = "comment";
        String attributeValue = "modified: " + new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(Calendar.getInstance().getTime());
        String[] returningAttributes = {loginNameAttributeName, attributeName, "distinguishedName"};
                
        Hashtable<String,String> env = new Hashtable<String,String>();
        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, principals);
        env.put(Context.SECURITY_CREDENTIALS, credentials);
        env.put(Context.REFERRAL, "ignore");
        
        try {
            DirContext ctx = new InitialLdapContext(env, null);
            
            // constrain attributes
            SearchControls sc = new SearchControls();
            sc.setSearchScope(SearchControls.SUBTREE_SCOPE);
            sc.setReturningAttributes(returningAttributes);
            
            // start ldap search
            String searchBase = "";
            String searchFilter = "(objectCategory=user)";
            NamingEnumeration<SearchResult> ne = ctx.search(searchBase, searchFilter, sc);

            // retrieve search results
            while (ne.hasMoreElements()) {
                SearchResult searchResult = (SearchResult) ne.nextElement();
                NamingEnumeration<? extends Attribute> resAttrs = searchResult.getAttributes().getAll();
                while (resAttrs.hasMoreElements()) {                    
                    Attribute attr = (Attribute) resAttrs.nextElement();
                    
                    // e.g.:      name: kateArcher 
                    DebugFunctions.info(attr.toString());
                }
            }
            
            // try to modify a attribute
            ModificationItem[] mods = new ModificationItem[1];
            Attribute mod0 = new BasicAttribute(attributeName, attributeValue);

            // REPLACE_ATTRIBUTE = update attribute
            mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, mod0);

            // modify attribute
            String cn = "CN=midtest2,CN=users,CN=devmid,DC=devlab,DC=local";
//            String cn = "CN=midtest2,CN=users,DC=devlab,DC=local";
//            String cn = "CN=midtest2,CN=users";
//            String cn = "CN=midtest2";
            DebugFunctions.info(cn);
            ctx.modifyAttributes(cn, mods);            
        
        } catch (Exception e) {
            DebugFunctions.printStackTrace(e);
        }
    }


In der Konsole erhalte ich für die ausgelesenen Werte:
name: midtest2
distinguishedName: CN=midtest2,CN=users,CN=devmid,DC=devlab,DC=local
name: administrator
distinguishedName: CN=administrator,CN=users,CN=devmid,DC=devlab,DC=local
name: person1
distinguishedName: CN=person1,CN=devmid,DC=devlab,DC=local
name: midtest1
distinguishedName: CN=midtest1,CN=devmid,DC=devlab,DC=local
name: midtest3
distinguishedName: CN=midtest3,CN=beings,CN=devmid,DC=devlab,DC=local


Somit funktioniert die Verbindung zum AD LDS!


Bei der Zeile 58

Code:
            ctx.modifyAttributes(cn, mods);

erhalte ich dann jedoch folgende Fehlermeldung:

CN=midtest2,CN=users,CN=devmid,DC=devlab,DC=local
javax.naming.NameNotFoundException: [LDAP: error code 32 - 0000208D: NameErr: DSID-0310020A, problem 2001 (NO_OBJECT), data 0, best match of:
'CN=devmid,DC=devlab,DC=local'



Er findet den Benutzer CN=midtest2,CN=users,CN=devmid,DC=devlab,DC=local nicht. dieser existiert jedoch, habe ich doch den distinguishedName ausgegeben. Der Benutzer ist da! Ich habe für CN alle Varianten probiert (s. auskommentierte Zeilen ab Zeile 53). Immer der gleiche Fehler! Der Benutzer, welcher auf das AD LDS zugreift, hat genügend Rechte!


So, aus Verzweiflung habe ich nun ein 2. AD LDS angelegt, mit einer Partition DC=devmid2,DC=devlab,DC=local. Man beachte, dass ich hierbei in der Partition KEIN CN verwendet habe.

Hier die Ansicht in ADSIEDIT:
pic1.png

Die erste Partition enthält ein CN drin, die zweite nicht.


Ich habe am Code nichts angepasst, ausser die Variablen: url, principals (logisch, ist ja ein anderes AD LDS) und dann die Variable cn (Zeile 53) auf "CN=midtest2,CN=users" gesetzt - läuft!

Es läuft einfach! Was muss ich also nun am Code oben ändern, damit ich auch in einem AD LDS mit einem CN in der Partition die Werte ändern kann? Das AD LDS hat ein CN drin, ich kann das nicht ändern!

Ideen?

cheerioh
SiS
 
Zuletzt bearbeitet:

Neue Beiträge