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:
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
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:
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
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:
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: