You are not logged in.
Hallo,
ich versuche den Reportserver Enterprise mit dem Active-Directory zu verbinden.
Leider bekomme ich beim Ausführen des Scripts "importldap.groovy" ein Problem mit dem Suchergebnis der AD-Benutzer.
LDAP-Konfiguration in "ldapimport.groovy":
lul.setProviderUrl("ldap://dc1.intern.r-m.de:389");
lul.setSecurityPrincipal("CN=Test,OU=Services,OU=Accounts,OU=IT-Support,OU=Teststadt,DC=intern,DC=r-m,DC=de");
lul.setSecurityCredentials("anypassword");
lul.setLdapBase("DC=intern,DC=r-m,DC=de");
OrganisationalUnit targetNode = (GLOBALS.findObject("/usermanager/external"));
if(null == targetNode){
AbstractUserManagerNode umRoot = userManagerService.getRoots().get(0);
targetNode = new OrganisationalUnit("external");
umRoot.addChild(targetNode);
userManagerService.persist(targetNode);
}
lul.setTargetNode(targetNode);
lul.run();
public class LdapUserLoader {
private final Logger logger = Logger.getLogger(getClass().getName());
private String ldapBase;
private String ldapFilter = "(&(objectClass=user)(primaryGroupID=513)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(memberOf=cn=ReportUsers,ou=Groups,ou=Common,ou=Teststadt,dc=intern,dc=r-m,dc=de))";
Ist das ein Problem mit dem ldapFilter?
Gruß
Christoph Kneußel
Last edited by itatwork (2022-01-12 14:18:14)
Offline
.
Last edited by itatwork (2022-01-12 14:16:58)
Offline
Hallo Christoph,
erst mal vielen Dank für den Spam Alarm. Diese Woche haben wir - Krankheit und Urlaubsbedingt - viele Abwesenheiten. Bitte hab daher ein wenig Geduld was ide Antworten auf Deine Fragen angeht.
viele Grüße
Jan
Offline
Hallo Jan,
kein Thema, das verstehe ich.
Gruß
Christoph
Offline
Hi itatwork,
bitte versuch das:
im ldapimport Skript folgendes:
AbstractUserManagerNode parent = this.nodesInDirectoryByName.get(parentName);
if(null == parent){
if(parentName.equals(new LdapName(ldapBase))){
/* root node */
parent = targetNode;
}else{
throw new IllegalStateException("Missing parent for " + sr.getNameInNamespace());
}
}
durch
AbstractUserManagerNode parent = targetNode;
ersetzen.
Dann wird alles direkt in Deinen root importiert (per default hier : /usermanager/external)
In Deiner Fehlermeldung fehlt der parent-Node von einem User: Caused by: java.lang.IllegalStateException: Missing parent for ...
Viele Grüße
Eduardo
Offline
Hallo Eduardo,
vielen Dank, das hat funktioniert und der User-Login mit AD-Passwort auch.
Wenn ich User aus der entsprechenden AD-Gruppe entferne und den LDAP-Import nochmal anstoße, werden die User im Reportserver nicht entfernt.
Kann man das einstellen?
Manuell kann ich sie nicht entfernen, da der "alte" User schreibgeschützt ist.
Gruß
Christoph
Offline
Hallo Christoph,
schau Dir bitte das an: https://forum.reportserver.net/viewtopi … 6979#p6979
Viele Grüße
Eduardo
Offline
Hallo Eduardo,
das hat funktioniert, jedoch kommt beim nächsten Start des Import-Scripts folgende Fehlermeldung:
reportserver$ exec -c -t ldapimport.groovy
net.datenwerke.rs.scripting.service.scripting.exceptions.ScriptEngineException: javax.script.ScriptException: net.datenwerke.treedb.service.treedb.exceptions.UnsupportedChildException: Tried to add an object of type OrganisationalUnit to User. This is not possible.
------- SCRIPT ERROR INFO -------
Script execution failed.
error message: javax.script.ScriptException: net.datenwerke.treedb.service.treedb.exceptions.UnsupportedChildException: Tried to add an object of type OrganisationalUnit to User. This is not possible. (net.datenwerke.treedb.service.treedb.exceptions.UnsupportedChildException)
script arguments:
file: ldapimport.groovy (id: 324301, line 40)
line number: 40
line: umRoot.addChild(targetNode);
at net.datenwerke.rs.scripting.service.scripting.engines.GroovyEngine.eval(GroovyEngine.java:79)
at net.datenwerke.rs.scripting.service.scripting.ScriptingServiceImpl.executeScript(ScriptingServiceImpl.java:217)
at net.datenwerke.rs.scripting.service.scripting.ScriptingServiceImpl.executeScript(ScriptingServiceImpl.java:263)
at net.datenwerke.rsenterprise.license.service.EnterpriseCheckInterceptor.invoke(EnterpriseCheckInterceptor.java:35)
at net.datenwerke.rs.scripting.service.scripting.ScriptingServiceImpl.executeScript(ScriptingServiceImpl.java:317)
at net.datenwerke.rsenterprise.license.service.EnterpriseCheckInterceptor.invoke(EnterpriseCheckInterceptor.java:35)
at net.datenwerke.rs.scripting.service.scripting.ScriptingServiceImpl.executeScript(ScriptingServiceImpl.java:288)
at net.datenwerke.rsenterprise.license.service.EnterpriseCheckInterceptor.invoke(EnterpriseCheckInterceptor.java:35)
at net.datenwerke.rs.scripting.service.scripting.terminal.commands.ExecScriptCommand.doTransactionExecute(ExecScriptCommand.java:345)
at com.google.inject.persist.jpa.JpaLocalTxnInterceptor.invoke(JpaLocalTxnInterceptor.java:66)
at net.datenwerke.rs.scripting.service.scripting.terminal.commands.ExecScriptCommand$1$1.doFilter(ExecScriptCommand.java:269)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:66)
at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:168)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:168)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:168)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:118)
at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:113)
at net.datenwerke.rs.scripting.service.scripting.terminal.commands.ExecScriptCommand$1.call(ExecScriptCommand.java:263)
at net.datenwerke.rs.scripting.service.scripting.terminal.commands.ExecScriptCommand$1.call(ExecScriptCommand.java:1)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.lang.Thread.run(Thread.java:830)
Caused by: javax.script.ScriptException: net.datenwerke.treedb.service.treedb.exceptions.UnsupportedChildException: Tried to add an object of type OrganisationalUnit to User. This is not possible.
at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:347)
at org.codehaus.groovy.jsr223.GroovyCompiledScript.eval(GroovyCompiledScript.java:41)
at net.datenwerke.rs.scripting.service.scripting.engines.GroovyEngine.eval(GroovyEngine.java:74)
... 23 more
Caused by: net.datenwerke.treedb.service.treedb.exceptions.UnsupportedChildException: Tried to add an object of type OrganisationalUnit to User. This is not possible.
at net.datenwerke.treedb.service.treedb.AbstractNode.addChild(AbstractNode.java:354)
at net.datenwerke.treedb.service.treedb.AbstractNode.addChild(AbstractNode.java:330)
at net.datenwerke.treedb.service.treedb.AbstractNode$addChild.call(Unknown Source)
at ldap.Script3.run(Script3.groovy:40)
at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:344)
... 25 more
reportserver$
Ich hatte diese Lösung probiert, hat aber nicht geholfen:
https://forum.reportserver.net/viewtopic.php?id=291
Vielleicht habe ich das falsch implementiert:
if(objectClass.contains("organizationalUnit")) {
try {
umNode = createOUNode(sr, parent);
}catch(net.datenwerke.treedb.service.treedb.exceptions.UnsupportedChildException e){
throw new RuntimeException("NODE=" + sr.toString() + ", PARENT=" + parent.toString, e);
}
} else if(objectClass.contains("user")) {
umNode = createUserNode(sr, parent);
} else if(objectClass.contains("group")){
umNode = createGroupNode(sr, parent);
}
Danke und Gruß
Christoph
Offline
Hallo Christoph,
ich sehe die Ausgabe nicht,... kannst Du bitte mit dem Logger versuchen, eine Ausgabe zu erzeugen?
Ggf. musst Du den Logger zum Objekt mittels des Konstruktors überreichen, damit da benutzt werden kann.
import java.util.logging.Level;
import java.util.logging.Logger;
logger = Logger.getLogger(getClass().getName());
logger.log(Level.SEVERE, "NODE=" + sr.toString() + ", PARENT=" + parent.toString);
Viele Grüße
Eduardo
Offline
Hallo Eduardo,
ich habe das Logging bisschen ausgeweitet und es kam raus, dass es ein Problem mit dem "targetNode" gibt (siehe Notiz im Code):
lul.setProviderUrl("ldap://dc1.intern.r-m.de:389");
lul.setSecurityPrincipal("CN=Test,OU=Services,OU=Accounts,OU=IT-Support,OU=Teststadt,DC=intern,DC=r-m,DC=de");
lul.setSecurityCredentials("");
lul.setLdapBase("DC=intern,DC=r-m,DC=de");
OrganisationalUnit targetNode = (GLOBALS.findObject("/usermanager/external"));
if(null == targetNode){
AbstractUserManagerNode umRoot = userManagerService.getRoots().get(0);
targetNode = new OrganisationalUnit("external");
/* Hier taucht der Fehler auf! */
umRoot.addChild(targetNode);
/*
Exception Message:
net.datenwerke.rs.scripting.service.scripting.exceptions.ScriptEngineException: javax.script.ScriptException: net.datenwerke.treedb.service.treedb.exceptions.UnsupportedChildException: Tried to add an object of type OrganisationalUnit to User. This is not possible.
*/
userManagerService.persist(targetNode);
}
Gruß
Christoph
Offline
Hallo Christoph,
kannst Du bitte mit folgendem Skript prüfen, ob es neben dem eigentlichen Root (OU) andere Root-Nodes gibt? Z.B. Benutzer?
import java.util.Map.Entry
import java.util.logging.Level
import java.util.logging.Logger
import net.datenwerke.security.service.usermanager.UserManagerService
import net.datenwerke.security.service.usermanager.entities.AbstractUserManagerNode
import net.datenwerke.security.service.usermanager.entities.Group
import net.datenwerke.security.service.usermanager.entities.OrganisationalUnit
import net.datenwerke.security.service.usermanager.entities.User
UserManagerService userManagerService = GLOBALS.getRsService(UserManagerService.class);
Logger logger = Logger.getLogger(getClass().getName());
List<AbstractUserManagerNode> umRoots = userManagerService.getRoots();
for (AbstractUserManagerNode rootNode: umRoots) {
logger.log(Level.SEVERE, rootNode.getName() + ": " + rootNode);
}
Viele Grüße
Eduardo
Offline
Hallo Eduardo,
das stand, nach dem Script-Ausführen, im Log File:
13-Feb-2020 15:12:42.235 SEVERE [scriptExec-71] java_util_logging_Logger$log$1.call Test: Test
13-Feb-2020 15:12:42.236 SEVERE [scriptExec-71] java_util_logging_Logger$log$1.call User Root: net.datenwerke.security.service.usermanager.entities.OrganisationalUnit@4
Gruß
Christoph
Offline
Hallo Christoph,
bei Dir taucht der Fehler hier auf:
/* Hier taucht der Fehler auf! */
umRoot.addChild(targetNode);
Kannst Du mittels Logging herausfinden, was umRoot und targetNode sind ? also z.B. indem Du die Werte ausloggst, kurz bevor der Fehler passiert. Dann wissen wir vlt. warum das passiert.
Grüße
Eduardo
Offline
Hallo Eduardo,
ich gehe von aus, dass der Wert von targetNode=null ist, da er sonst nicht in der Bedingung feststeckt und
eine neue OU anlegen will:
if(null == targetNode){
AbstractUserManagerNode umRoot = userManagerService.getRoots().get(0);
targetNode = new OrganisationalUnit("external");
umRoot.addChild(targetNode);
userManagerService.persist(targetNode);
}
Das ist der Original-Code vom ldapimport.groovy Script.
Was mich wundert ist, dass "/usermanager/" leer ist und man dort keine Ordner anlegen kann.
Wenn man ein Verzeichnis anlegen will, kommt die gleiche Fehlermeldung, wie beim ldapimport-Script.
reportserver$ ls -l usermanager/
reportserver$ ls -l usermanager/
reportserver$ cd usermanager/
reportserver$ mkdir external
Tried to add an object of type OrganisationalUnit to User. This is not possible.
reportserver$
Siehe auch mein Screenshot von "Users and Groups" wo man die angelegten OUs sieht.
Update:
Kann man Screenshots hier im Forum mitschicken?
Gruß
Christoph
Last edited by itatwork (2020-02-19 07:44:22)
Offline
Hi Christoph,
ok, das ist sehr merkwürdig. Alles spricht aber dafür, dass in deinem Root irgendwelche Benutzer drin sind, obwohl nur eine "Root-"Organisation Unit drin sein darf.
Oben habe ich Dir folgendes Skript geschickt:
import java.util.Map.Entry
import java.util.logging.Level
import java.util.logging.Logger
import net.datenwerke.security.service.usermanager.UserManagerService
import net.datenwerke.security.service.usermanager.entities.AbstractUserManagerNode
import net.datenwerke.security.service.usermanager.entities.Group
import net.datenwerke.security.service.usermanager.entities.OrganisationalUnit
import net.datenwerke.security.service.usermanager.entities.User
UserManagerService userManagerService = GLOBALS.getRsService(UserManagerService.class);
Logger logger = Logger.getLogger(getClass().getName());
List<AbstractUserManagerNode> umRoots = userManagerService.getRoots();
for (AbstractUserManagerNode rootNode: umRoots) {
logger.log(Level.SEVERE, rootNode.getName() + ": " + rootNode);
}
Mit GENAU diesem Skript, was bekommst Du für Ausgaben? Kannst Du das bitte noch einmal testen?
Ich hake hier nach weil wir in der Vergangenheit genau so ein Problem hatten: es gab Benutzer auf der gleichen Ebene wie das oberste Root-Verzeichnis.
Viele Grüße
Eduardo
Offline
Hallo Christoph,
eine Frage:
in Deiner Ausgabe oben gab es folgendes:
13-Feb-2020 15:12:42.235 SEVERE [scriptExec-71] java_util_logging_Logger$log$1.call Test: Test
13-Feb-2020 15:12:42.236 SEVERE [scriptExec-71] java_util_logging_Logger$log$1.call User Root: net.datenwerke.security.service.usermanager.entities.OrganisationalUnit@4
Am Anfang dachte ich, "Test: Test" wäre eine Testausgabe von Dir gewesen. Deswegen meine Frage: was für eine Ausgabe bekommst du bei dem genauen Skript, ohne Anpassungen?
Wenn du "Test: Test" wieder bekommst , auf der gleichen Ebene wie User Root: net.datenwerke.security.service.usermanager.entities.OrganisationalUnit@4, dann ist das der Benutzer, von dem ich spreche. Dann würde ich Dir ein Skript zur Löschung dieses Benutzers schicken.
Viele Grüße
Eduardo
Offline
Hallo Eduardo,
alles klar, anbei der Ouput:
02-Mar-2020 16:01:22.806 SEVERE [scriptExec-98] java_util_logging_Logger$log$0.call Administrator Account: Account Administrator
02-Mar-2020 16:01:22.814 SEVERE [scriptExec-98] java_util_logging_Logger$log$0.call User Root: net.datenwerke.security.service.usermanager.entities.OrganisationalUnit@4
Gruß
Christoph
Offline
Hi Christoph,
ja, Du hast einen Benutzer im Root-Level. Probier bitte mit diesem Skript zur Löschung:
import java.util.Map.Entry
import java.util.logging.Level
import java.util.logging.Logger
import net.datenwerke.security.service.usermanager.UserManagerService
import net.datenwerke.security.service.usermanager.entities.AbstractUserManagerNode
import net.datenwerke.security.service.usermanager.entities.Group
import net.datenwerke.security.service.usermanager.entities.OrganisationalUnit
import net.datenwerke.security.service.usermanager.entities.User
UserManagerService userManagerService = GLOBALS.getRsService(UserManagerService.class);
Logger logger = Logger.getLogger(getClass().getName());
List<AbstractUserManagerNode> umRoots = userManagerService.getRoots();
for (AbstractUserManagerNode rootNode: umRoots) {
System.out.println(rootNode.getName() + ": " + rootNode);
if (rootNode.getName().equals("User Root")) {
logger.log(Level.SEVERE, "CLEANING: skipping: " + rootNode.getName());
continue;
}
logger.log(Level.SEVERE, "CLEANING: deleting: " + rootNode.getName());
rootNode.setWriteProtection(false);
userManagerService.remove(rootNode);
}
Das LDAP Skript scheint in manchen Fällen Benutzer zum Root-Verzeichnis zu verschieben, wenn sie gelöscht werden sollen. Mit diesem Skript kannst Du die Benutzer hier bereinigen.
Viele Grüße
Eduardo
Offline
Vielen Dank, Eduardo.
Das hat prima funktioniert.
Gruß
Christoph
Offline
Hallo Christoph,
ich habe Dir gerade eine Email geschickt mit Infos zum neuen ldapimport.groovy Skript.
Viele Grüße
Eduardo
Offline
Hallo Christoph,
wir haben ein neues Skript veröffentlicht: ldaptester.groovy
https://github.com/infofabrik/reportserver-samples
So kannst Du Deine LDAP Einstellungen gefahrlos testen, bevor sie ins "richtige" ldapimport.groovy bzw. ldap.cf angepasst werden.
Viele Grüße
Eduardo
Offline
Hallo Eduardo,
ich habe aktuell wieder das Problem mit dem root User.
Diesmal funktioniert aber nach der Löschung der Import nicht mehr.
11-Jan-2022 15:29:28.846 SEVERE [scriptExec-54] java_util_logging_Logger$log$0.call CLEANING: deleting: ***
Der Benutzer scheint nicht wirklich gelöscht zu sein:
11-Jan-2022 15:29:28.846 SEVERE [scriptExec-54] java_util_logging_Logger$log$0.call CLEANING: deleting: ***
11-Jan-2022 15:29:36.562 SEVERE [scriptExec-55] java_util_logging_Logger$log$0.call CLEANING: deleting: ***
11-Jan-2022 15:30:19.896 SEVERE [scriptExec-56] java_util_logging_Logger$log$0.call CLEANING: deleting: ***
11-Jan-2022 15:30:21.717 SEVERE [scriptExec-57] java_util_logging_Logger$log$0.call CLEANING: deleting: ***
11-Jan-2022 15:32:04.895 SEVERE [scriptExec-61] java_util_logging_Logger$log$0.call CLEANING: deleting: ***
Gibt es noch ein Trick?
Gruß
Christoph
Last edited by itatwork (2022-01-11 15:07:38)
Offline
Hi Christoph,
bitte lösch den Namen oder ersetze ihn durch *** (DSGVO)
Hast Du das Skript mit "-c" ausgeführt damit die Änderungen auch commited werden?
Grüße
Eduardo
Offline
Ja, mit -c.
Jetzt kommt noch ein Hinweis:
Caused by: net.datenwerke.rs.utils.exception.exceptions.NeedForcefulDeleteException: User *** is owner of teamspaces. Teamspace Ids: 118782810, 29585634, 104260071, 71217514, 62317009, 85420834, 78635272, 42707053, 44686918
Offline
Hi Christoph,
dann würde ich jemanden anderen als Owner von diesen TeamSpaces setzen, bevor der User gelöscht wird.
Gruss
Eduardo
Offline