Active Directory-Anbindung und Replikationskonfiguration

Allgemeines

Allgemeine Informationen zur Benutzerreplikation in Intrexx finden Sie hier.

Active Directory

Das Active Directory ist in drei Teile aufgegliedert: Schema, Konfiguration und Domain. Die ersten beiden Teile des Active Directory werden zwischen allen Domain Controllern der Gesamtstruktur repliziert, während die domainspezifischen Informationen grundsätzlich nur innerhalb der jeweiligen Domain, also auf ihren jeweiligen Domaincontrollern, verfügbar sind. Deshalb existiert in jeder Domain zusätzlich ein sogenannter globaler Katalog. Er repräsentiert alle Informationen der eigenen Domain und enthält zusätzlich wichtige Teilinformationen der anderen Domain der Gesamtstruktur und ermöglicht damit z. B. Domain-übergreifende Suchoperationen. Die Datensätze in der Datenbank werden im Active Directory als Objekte und deren Eigenschaften als Attribute definiert. Die Attribute sind abhängig von ihrem Typ definiert. Objekte werden eindeutig über ihren Namen identifiziert. Objekte lassen sich in zwei Haupt-Kategorien einteilen: Die möglicherweise bis zu vielen Millionen Objekte werden in Containern (Organisationseinheiten), auch OUs (Organizational Unit) genannt, abgelegt. Einige Container sind vordefiniert, beliebige weitere Organisationseinheiten können mit Subeinheiten (Unterorganisationseinheiten) erstellt werden. Als objektbasiertes System unterstützt Active Directory die Vererbung von Eigenschaften eines Objektcontainers an untergeordnete Objekte, die auch wieder Container sein können. Dadurch erlaubt es Active Directory, Netzwerke logisch und hierarchisch aufzubauen. Ein Active Directory beinhaltet verschiedene Objekte. Neben dem Benutzer gibt es Rechteobjekte wie Benutzergruppen und Rollen sowie Organisationen, Organisationseinheiten, allgemeine Container und Verteilergruppen (Mailsystem). Zudem ist ein Active Directory von unterschiedlichen Systemen nicht zwangsläufig identisch. Jedes System bringt seine eigenen Besonderheiten mit sich.

Intrexx bietet verschiedene Replikationsprofile an, die auf die unterschiedlichen Active Directory-Systeme adaptiert sind. Diese müssen entsprechend bei der Konfiguration eines Replikationsjobs ausgewählt werden.

Profilname Beschreibung
Active Directory Large Groups.xml Profil für Active Directories mit Gruppen, die mehr als 1000 Mitglieder beinhalten. Dieses Profil benötigt mehr Zeit bei der Replikation und sollte nur verwendet werden, wenn die Gruppenmitgliederzahl den besagten Wert überschreitet.
Active Directory NTLM compatible.xml Dieses Active Directory-Profil wird verwendet, wenn NTLMv1-Login- und Domänen-Namen in Intrexx erwünscht sind, z.B. für die integrierte Authentifizierung via Tomcat.
Active Directory.xml Standard Active Directory Replikationsprofil
Attribute Based Role Sample.xml Beispielprofil: In diesem Profil werden die Benutzer im Standard-Benutzer-Container abgelegt (placing="fixed") und anhand eines ihrer Attribute (hier: roleattr) einer Rolle zugewiesen.
Dynamic OU Path Sample.xml Beispielprofil: Hier werden Benutzer einem Container zugeordnet, der aus einem ihrer Attribute (hier: ou) ausgelesen wird. Der Attributwert wird als Pfad mit Backslash-Trennern erwartet (2. Parameter von $path)
Dynamic OU Sample.xml Beispielprofil: Ähnlich wie Profil Dynamic OU Path Sample, nur dass für die Container-Ermittlung lediglich der letzte Teil des Pfads ausgewertet wird.
eDirectory.xml Novell eDirectory
OpenLDAP - POSIX.xml OpenLDAP
Sun ONE.xml SUN One
Die nachfolgenden Tabellen stellen die gebräuchlichsten Attribute dar, d.h. nur einen Teil des tatsächlichen Umfanges. Insbesondere werden die Attribute durch andere Anwendungen erweitert wird (z.B. Microsoft Exchange), aber auch optionale Attribute sind individuell konfigurierbar.

Tabelle der Active Directory Felder des Benutzer-Objektes


Klasse Feldname Beschreibung
Allgemein distinguishedName Definierter Name
Allgemein cn Common Name
Allgemein objectClass Objektklasse (USER)
Allgemein uSNCreated Original USN
Allgemein uSNChanged Aktuelle USN
Allgemein whenCreated Erstellt am
Allgemein whenChanged Geändert am
Allgemein objectGUID Objekt-GUID
user givenName Vorname
user sn Nachname
user name Anzeigename
user samAccountName Anmeldename NT
user userPrincipalName Anmeldename
user description Beschreibung
user title Titel
user initials Initiale
user employeeID Mitarbeiter-Nummer
user physicalDeliveryOfficeName Büroname
user company Firma
user department Abteilung
user streetAddress Strasse
user postalCode Postleitzahl
user postOfficeBox Postfach
user l Stadt
user st Bundesland
user co Land (Name)
user countryCode Ländercode (ISO-3166)
user c Ländercode (ISO-3166)
user wwwHomePage Webseite
user url Weitere Webseite
user mail E-Mail geschäftlich
user telephoneNumber Telefon
user otherTelephone Weitere Telefonnummern
user mobile Mobil
user otherMobile Weitere Mobilnummern
user facsimileTelephoneNumber Fax
user otherFacsimileTelephoneNumber Weitere Faxnummern
user ipPhone IP-Telefon
user otherIpPhone Weitere IP-Telefonnummern
user pager Pager
user otherPager Weitere Pager
user homePhone Telefon privat
user otherHomePhone Weitere priv. Telefonnr.
user msExchHideFromAddressLists Nicht in Exchange Adresslisten anzeigen: True = verbergen, null/leer = anzeigen
user thumbnailPhoto Foto (max. 100kB)
user accountExpires Account-Gültigkeitsdauer: Wert 0 = Unbegrenzt. Datumswert wird als 100ns-Intervall seit 01.01.1601 (UTC) berechnet.
user passwordlastset Letzte Passwortänderung als Long-Wert (100ns-Interval seit dem 01.01.1601 UTC
user userAccountControl Account-Optionen
user info Anmerkungen zum Benutzer
user homeDirectory Basisordner
user lastLogonTimestamp Letzter Anmeldezeitpunkt
user primaryGroupID Primäre Gruppenzuordnung
user Nsaccountlock
user uid Anmeldename (RFC 1274)

Tabelle der Active Directory Felder des Gruppen-Objektes


Klasse Feldname Beschreibung
Allgemein distinguishedName Definierter Name
Allgemein cn Common Name
Allgemein objectClass Objektklasse (GROUP)
Allgemein uSNCreated Original USN
Allgemein uSNChanged Aktuelle USN
Allgemein whenCreated Erstellt am
Allgemein whenChanged Geändert am
Allgemein objectGUID Objekt-GUID
group sAMAccountName Gruppenname (NT)
group description Beschreibung
group groupType Gruppenbereich/-typ
group info Anmerkung
group mail E-Mail
group memberOf Mitglied von
group managedBy verwaltet von
group primaryGroupToken Primäre Gruppenzuordnung

Tabelle der Active Directory Felder des Organisations-Objektes


Klasse Feldname Beschreibung
Allgemein distinguishedName Definierter Name
Allgemein cn Common Name
Allgemein objectClass Objektklasse
Allgemein uSNCreated Original USN
Allgemein uSNChanged Aktuelle USN
Allgemein whenCreated Erstellt am
Allgemein whenChanged Geändert am
Allgemein objectGUID Objekt-GUID
organizationalUnit name Name
organizationalUnit Description Beschreibung
organizationalUnit gPLink

Intrexx Benutzerverwaltung

Die Benutzerverwaltung umfasst mehrere Datenbanktabellen und eine View, um die Bestandteile zu verwalten.

Datenbanktabelle Funktion
DSOBJECT Objektverwaltung aller Objekte der Benutzerverwaltung
DSORGANIZATION Attribute der Organisationen
DSORGUNIT Attribute der Organisationseinheiten
DSCONTAINER Attribute der Container
DSDISTLIST Attribute der Verteilerlisten
DSGROUP Attribute der Benutzergruppen
DSUSER Attribute der Benutzer
DSROLE Zuordnungstabelle zu Rollen
DSSET Zuordnungstabelle zu Benutzergruppen
DSCLASS Objektklassen und zugehörige Datengruppen
DSCLASSTITLE Mehrsprachige Titel der Objektklassen
DSATTRIBUTE Verwaltung alle Attribute der Benutzerverwaltung und deren Eigenschaften
DSATTRIBUTETITLE Mehrsprachige Titel der Attribute
VBLUSER View aus DSUSER und DSOBJECT mit Bezug auf die Benutzer

Felder-Benutzerattribute (DSUSER)


Name Datenfeld Beschreibung Typ Länge
- LID Benutzer-ID Integer
- STRGUID Benutzer-GUID String 255
LOGIN STRLOGIN Anmeldename String 64
LOGINLWR STRLOGINLWR Anmeldename (Kleinschreibung) String 64
DOMAIN STRDOMAIN Domäne String 48
DOMAINLWR STRDOMAINLWR Domäne (Kleinschreibung) String 48
TIMEZONE STRTIMEZONE Zeitzone String 32
FIRSTNAME STRFIRSTNAME Vorname String 64
LASTNAME STRLASTNAME Nachname String 64
MIDDLENAME STRMIDDLENAME 2. Vorname String 64
FULLNAME STRFULLNAME Voller Name String 172
TITLE STRTITLE Titel String 64
GENDER LGENDER Geschlecht Integer
STREET STRSTREET Strasse String 96
POSTALCODE STRPOSTALCODE Postleitzahl String 10
POBOX STRPOBOX Postfach String 10
CITY STRCITY Stadt String 96
STATE STRSTATE Bundesland String 32
COUNTRY STRCOUNTRY Land String 32
MAILBIZ STRMAILBIZ E-Mail geschäftlich String 192
PHONEBIZ STRPHONEBIZ Telefon String 40
PHONEMOBILEBIZ STRPHONEMOBILEBIZ Mobil geschäftlich String 40
PHONEFAX STRPHONEFAX Fax String 40
PHONEPAGER STRPHONEPAGER Pager String 40
MAILHOME STRMAILHOME E-Mail privat String 192
PHONEHOME STRPHONEHOME Telefon privat String 40
PHONEMOBILEHOME STRPHONEMOBILEHOME Mobil privat String 40
BIRTH DTBIRTH Geburtsdatum DateTime
ENTER DTENTER Eintrittsdatum DateTime
LOGINATTEMPTS LLOGINATTEMPTS Anmeldeversuche (V7) Integer
PWDCHANGED DTPWDCHANGED Passwortänderungszeit (V7) DateTime
DEFAULTLANGUAGE STRDEFAULTLANG Standardsprache String 2
MUSTCHANGEPASS BMUSTCHANGEPASS Benutzer muss Passwort bei nächster Anmeldung ändern (V7) Boolean
MUSTNOTCHANGEPASS BMUSTNOTCHANGEPASS Benutzer darf Passwort nicht ändern (V7) Boolean
PWDEXPIRES BPWDEXPIRES Passwort läuft ab (V7) Boolean
DEFAULTLOCALE STRDEFAULTLOCALE Standardregionalschema (V7) String 50
TIMEZONE STRTIMEZONE Zeitzone String 32

Felder der Organisationsattribute (DSORGANIZATION)


Name Datenfeld Beschreibung Datentyp Länge
ID LID Organisations-ID Integer
STREET STRSTREET Strasse String 96
POSTALCODE STRPOSTALCODE Postleitzahl String 10
POBOX STRPOBOX Postfach String 10
CITY STRCITY Ort String 96
STATE STRSTATE Bundesland/State/Kanton String 32
COUNTRY STRCOUNTRY Land String 32

Felder der Organisationseinheiten (DSORGUNIT)


Name Datenfeld Beschreibung Datentyp Länge
ID LID Organisationseinheit-ID Integer
STREET STRSTREET Strasse String 96
POSTALCODE STRPOSTALCODE Postleitzahl String 10
POBOX STRPOBOX Postfach String 10
CITY STRCITY Ort String 96
STATE STRSTATE Bundesland/State/Kanton String 32
COUNTRY STRCOUNTRY Land String 32

Felder der Objekttabelle (DSOBJECT)


Name Datenfeld Beschreibung Datentyp Länge
ID LID Objekt-ID Integer
CONTAINERID LCONTAINERID Integer
NAME STRNAME Objektname String 128
CLASSID LCLASSID Objektklassen-ID: 2 = Benutzer 3 = Container 5 = Rolle 6 = Benutzergruppe 7 = Verteilerlisten 8 = Organisationseinheit 9 = Organisation Integer
GUID STRGUID Interne Objekt-GUID String 40
PRIORITY LPRIORITY Priorität (0 … 100) : 100 = Maximal 0 = Minimal Integer
DELETABLE BDELETABLE Objekt löschbar Boolean
DELETED BDELETED Objekt gelöscht Boolean
DISABLED BDISABLED Objekt deaktiviert Boolean
INTERNALUSN LINTERNALUSN Integer
RPLGUID STRREPLGUID GUID des Replikationsjobs String 40
DN STRDN Distinguished Name String 512
DESCRIPTION STRDESCRIPTION Objektbeschreibung String 512
EXTERNALGUID STREXTERNALGUID Externe Objekt-GUID (Active Directory) String 40
EXTPRIMGRPTKN
EXTPRIMGRPID LEXTPRIMGRPID Externe primäre Gruppenzuordnung (primaryGroupID) Integer

Das Intrexx-Replikationsprofil

Zur Definition der Replikation zwischen LDAP-Quellen und der Intrexx-Organisationsstruktur dienen LDAP-Replikationsprofile im Installationsverzeichnis cfg/ldapconfig. Die Replikationsprofile sind XML-Dateien, die für jeden zu übertragenden Objekttyp eine Abbildungsdefinition beinhalten. Jeder im Intrexx-Organisationsschema erfasste Objekttyp kann repliziert werden. Jedes Attribut ist beschreibbar.

Das <ldap>-Element (Dokumenten-Root-Knoten)

In diesem Element können globale Einstellungen vorgenommen werden. Es ist das Wurzel-Element für das XML-Dokument.
<ldap xmlns="https://schemas.unitedplanet.de/intrexx/server/ldap/replication/" enablePaging="true">
…
</ldap>
Parameter Ab Version Beschreibung
enablePaging 5.2 Mit diesem Parameter kann das seitenweise Abfragen von LDAP-Verzeichnissen aktiviert werden. Einige Verzeichnisserver limitieren die Anzahl der Einträge pro Ergebnisseite, z.B. Active Directory auf 1000 Treffer. Aktiviert man diese Option, wird der Verzeichnisserver angewiesen, auf Nachfrage auch die weiteren Seiten zu liefern, nicht nur die erste.
pageSize 7 Über das Attribut pageSize des ldap-Elements kann die Seitengröße für die Replikation gesetzt werden.
pageSize 5.2 Über das System-Property de.uplanet.lucy.server.usermanager.replication.ldap.pagesize kann die Seitengröße festgelegt werden. Der Default-Wert ist 500.

Nicht alle Verzeichnisserver unterstützen seitenweise Abfragen. Das Setzen dieser Optionen wird in diesem Fall zu einem Fehler führen.

Das <item>-Element

Das <item>-Element dient der Definition der Abbildung zwischen Intrexx-Objekttypen und LDAP-Abfrageergebnissen. Es kann eine Reihe weiterer Definition beinhalten:
<item class="<Zielklasse>" query="<LDAP-Query>" placing="<Platzierungsmodus>" [dnfilter="<Filter-Regexp>"]> <attribute source="<Quellattribut>"/>
...
<attribute destination="<Zielattribut>" source="<Quellausdruck>"/>
...
<call class="<Werkzeugklasse>" method="<Methode>" [execafterwrite="true|false"]> <parameter type="<Builtin-Parameter>"/>
...
<parameter type="<Java-Klasse>" value="<Wert>"/>
...
</call>
...
</item>
Parameter Beschreibung
Zielklasse Klassenname im Intrexxschema, z.B. für Benutzer USER.
LDAP-Query LDAP-Query, mit der die Objekte im externen Verzeichnis abgefragt werden sollen.
Platzierungsmodus Hier stellt Intrexx folgendes zur Verfügung:   parent: Intrexx versucht anhand der Platzierung im Quell-Verzeichnis den korrekten Ort in der Intrexx Organisationsstruktur zu ermitteln.   fixed: Intrexx benutzt einen Standardcontainer (z.B. Users) als Zielcontainer. Zu verwenden wenn man nur die Benutzerobjekte ohne Organisationsstruktur replizieren möchte.   fixed by domain: Intrexx benutzt einen Untercontainer des Standardcontainers, der dem Domänennamen des Objektes entspricht. Damit dies funktioniert, muss das Domänen-attribut des Zielobjektes korrekt befüllt werden.   dynamic <Quellausdruck>: Intrexx ermittelt anhand des Quellausdrucks aus den Verzeichnisdaten den entsprechenden Zielcontainer. Die Definition der Quellausdrücke finden Sie im Abschnitt <attribute>-Element.
dnfilter dnfilter="<Filter-Regexp>" Das Attribut dnfilter ist optional. Hier kann ein Regexp-Pattern angegeben werden, mit dem man die zu replizierenden Objekte nach dem DN (Distinguished Names) filtern kann, so z.B. dnfilter=".*ou=Intrexx User.*"

Das <attribute>-Element

Dieses Element gibt es in zwei Ausprägungen: mit Zielangabe dient es der Zuordnung von Quellausdrücken zu Intrexx-Zielfeldern, ohne Zielangabe ist eine Anweisung an das Replikationsmodul, das angegebene Quell-Attribut ebenfalls abzufragen, da es zu einem späteren Zeitpunkt gebraucht wird. Wird ein Quellattribut in keiner der beiden Varianten angegeben, so wird es auch nicht gelesen.

Zielattribut:

Attribut der Intrexx-Zielklasse

Quellattribut:

Attribut der LDAP-Objektklasse

Quellausdruck:

<Quellausdruck> = [<Quellattribut>|<Funktionsaufruf>]
Der Ausdruck besteht entweder aus einem Attribut oder einem Funktionsaufruf.

Funktionsaufruf:

<Funktionsaufruf>=$Funktionsname([<Quellausdruck>[,...]])
Eine Funktion kann 0-n Parameter haben, die ihrerseits wieder Quellausdrücke sind. Die Dokumentation der zur Verfügung stehenden Builtin-Funktionen finden Sie hier.

Das <call>-Element

Nicht jede Aufgabe kann über eine simple Zuordnung via Attribut-Element durchgeführt werden. Aus diesem Grund gibt es die Möglichkeit, per Definition von Aufrufen von Java-Klassen spezialisierten Code einzuhängen. Zur Parametrisierung des Aufrufs kann das <call>-Element 0-n <parameter>-Elemente beinhalten.

Werkzeugklasse:

Name der Java-Klasse, die die aufzurufende statische Methode enthält.

Methode:

Aufzurufende Methode

execafterwrite-Attribut:

Definiert, ob die Methode sofort oder erst nach dem Schreiben des Intrexx-Objektes erfolgt.

Das <parameter>-Element

Das Parameter-Element hat immer ein type-Attribut. Dieses beinhaltet entweder den Namen eines Builtin-Parameters, der automatisch korrekt befüllt wird, oder den Namen einer bekannten Java-Klasse,deren Inhalt über das value-Attribut definiert wird. Im Moment werden java.lang.String und die in der JRE eingebauten numerischen Klassen an dieser Stelle unterstützt.

Builtin-Parameter:

Parameter Beschreibung
$destinationitem Beinhaltet das Zielobjekt (IDs*-Objekt) für das Element
$dircontext Beinhaltet den LDAP-Verzeichniskontext
$domain Beinhaltet den bereits erzeugten Domainnamen für das Zielobjekt (nur bei execafterwrite=true verfügbar und es sich um ein Benutzerobjekt handelt)
$inserted Beinhaltet ein Flag, das spezifiziert, ob das Zielobjekt neu war oder aktualisiert wurde (nur bei execafterwrite=true verfügbar)
$itemconnector Beinhaltet die Referenz auf die Instanz der internen Klasse, die die Attributzuordnung vornimmt.
$jdbcconnection Beinhaltet die JDBC-Systemdatenbankverbindung von Intrexx
$login Beinhaltet den bereits erzeugten Loginnamen für das Zielobjekt (nur bei execafterwrite=true verfügbar und wenn es sich um ein Benutzerobjekt handelt)
$replicationconfig Beinhaltet das Replikationskonfigurationsobjekt
$searchresult Beinhaltet den aktuellen Datensatz im LDAP-Suchergebnis
$sourceconfig Beinhaltet ein Quelldefinitionsobjekt
$usn Beinhaltet die eindeutige Nummer des aktuellen Replikationslaufs
$dbmanager Type-abhängiges DbManager-Objekt für die Bearbeitung des Intrexx-Organisationsschemas

Builtin-Funktionen (ab Intrexx 5.2)

Folgende Funktionen stehen an verschiedenen Stellen zur Verfügung:

Funktion Intrexx Beschreibung
$add 5.2 $add(val0, val1) Zwei Werte addieren
$ansiTime 7.0 $ansiTime(value) Wandelt einen Long-Wert (100ns-Interval seit 01.01.1601 UTC) wie er im Feld passwordlastset verwendet wird.
$bitand 5.2 $bitand(value, bitmask) Wert mit Bitmaske verunden
$call 6.0 $call(class, method [, param-type, param-value [...]] Aufruf einer individuellen Methode
$case 5.2 $case(value, checkval0, result0[,checkval1, result1...][elseresult]) Case-Konstrukt
$concat 7.0 OU7 $concat(<string-expression1>, <string-expression2>) Fügt zwei Zeichenketten zusammen
$datetime 6.0 $datetime(format [, [locale,] timezone], value) Aus einem String einen Zeitstempel erzeugen, z.B.: <attribute destination="meinTollesDatumsFeld" source="$datetime(&quot;dd.MM.yyyy&quot;, &quot;Europe/Berlin&quot;, whenChanged)"/>
$format 5.2 $format(formatstring, value...) Formatierung eines Werts. Für den formatstring gilt die JAVA-Notation.
$generalizedTime 7.0 $generalizedTime(value) Aus einem String im Generalized Time Format (YYYYMMDDHHmmSS.fffZ) einen Zeitstempel erzeugen
$last 5.2 $last(array) Extrahiert letztes Element aus einem Array $last(value, number) Extrahiert die letzten n Zeichen aus einer Zeichenkette
$length 5.2 $length(value) Ermittelt die Länge einer Zeichenkette
$lower 5.2 $lower(value) Wandelt eine Zeichenkette in Kleinbuchstaben um
$null 5.2 $null() Null-Wert
$print 6.0 $print(value-array, separator) Ein Array von Werten in ein einzelnes Feld schreiben, Trennzeichen ist <separator>.
$replace 7.0 OU7 $replace(<string-expression>, <string-to-replace>, <string-replacement>) Ersetzt in einer Zeichenkette (string-expression ) alle Vorkommen einer Teil-Zeichenkette (string-to-replace)durch eine andere Zeichenkette (string-replacement)
$split 5.2 $split(value, delimiter) Splittet einen String in Einzelstrings.
$substring 5.2 $substring(string, beginindex [,endindex]) Einen Teil aus einer Zeichenkette ausschneiden
$trim 7.0 OU7 $trim(<string-expression>)
$upper 5.2 $upper(value) Wandelt eine Zeichenkette in Großbuchstaben um

LDAP Abfragen

Die Definition von LDAP-Anfragen wird in der RFC 4515 behandelt

RFC 4515

Lightweight Directory Access Protocol (LDAP):
String Representation of Search Filters https://www.ietf.org/rfc/rfc4517.txt

Syntax und Operatoren

LDAP-Abfragen bestehen aus einem oder mehreren Kriterien, die mittels UND- bzw. ODER-Operatoren miteinander verknüpft werden. Die Operatoren werden dabei zu Beginn notiert, gefolgt von den Suchkriterien. Die Suchkriterien werden dabei in runden Klammern aufgeführt, die nochmals in runde Klammern gefasst werden.

UND-Verknüpfung:

(& ( S1 ) ( S2 ) … ( Sn ) )

ODER-Verknüpfung:

(| ( S1 ) ( S2 ) … ( S3 ))

Verschachtelte Verknüpfungen:

Jede UND/ODER-Verknüpfung kann insgesamt wieder als einzelnes Kriterium definiert werden:
(|(& ( S1 ) ( S2 ))(& ( S3 ) ( S4 ))) entspricht: (S1 AND S2) OR (S3 AND S4)

Negation:

Die Negation / Umkehr einer Abfrage wird mit einem Ausrufezeichen realisiert:
(! ( S1 ))

Vergleich:

Der Vergleich einer Abfrage wird mit einem Gleichheitszeichen realisiert:

Gleichheit (givenName=Max)
Größer Vergleich (passwordlastset >= 130575614253222449)
Kleiner Vergleich (passwordlastset <= 130575614253222449)
Ungefähr Vergleich (givenName~=Meier)
Definiert (givenName=*)
Wildcards (givenName=Max*) (givenName=*meier*)

Nur Accounts mit Anmeldenamen die mit 8 oder 9 beginnen (z.B. wenn Anmeldenamen eine Personalnummer ist und nur bestimmte Nummernkreise repliziert werden sollen):
(|(sAMAccountName=8*)( sAMAccountName=9*)

Tipps und Tricks

Domänen mit vielen Objekten (> 5.000)

Die Anzahl von Objekten pro Replikation bzw. Abfrage im Active Directory ist aus Sicherheitsgründen begrenzt (Windows Server 2008 R2 = Max. 5.000). Diese Grenze kann administrativ im Active Directory aufgehoben werden, in dem man das Attribut dSHeuristic entsprechend konfiguriert. Diese Anpassung erfolgt jedoch auf eigene Gefahr und auch Microsoft schließt bei dieser Anpassung jede Haftung aus. Ab Intrexx 6.0 besteht die Möglichkeit des blockweisen Verarbeitens von Daten aus dem Active Directory implementiert. Der Parameter enablePaging ist in den Profilen bereits auf true gesetzt. Hierbei werden pro Block 1.000 Elemente gelesen.
<ldap xmlns=https://schemas.unitedplanet.de/intrexx/server/ldap/replication/enablePaging="true">

Feldinhalte aus Active Directory abschneiden

Die Intrexx Benutzerdaten besitzen Feldlängenbegrenzungen, die unter Umständen bei Replikationen zu sogenannten Truncation-Fehlern führt, da Felder im Active Directory teilweise zweckentfremdet werden und längere Feldinhalte als üblich übermittelt werden. Um dieser Situation entgegenzuwirken können die Feldlängen in Intrexx über den Schemamanager erweitert werden oder die Inhalte der AD-Felder werden bei der Verarbeitung abgeschnitten. Zur Sicherheit sollte man bei String-Feldern – auch nach einer Anpassung der Länge solche Begrenzungen vorsehen.
<attribute destination="FIRSTNAME" source="$case(givenName, $null, $null, $format(&quot;%1.64s&quot;,givenName))"/>
Im Beispiel wird der Vorname auf 64 Zeichen begrenzt. Für die blau markierte Stelle muss der entsprechende Längenwert eingetragen werden. Mit $format wird der Feldinhalt abgeschnitten und mit $case wird bei fehlendem Wert sichergestellt, das Null in das Intrexx-Feld geschrieben wird.

Replikation des Vorgesetzten

Die Replikation des Vorgesetzten ist in den Active Directory-Profilvorlagen bereits vordefiniert, jedoch per Default auskommentiert. Wird der Vorgesetzte unter Manager gepflegt, kann der Abschnitt im Replikationsprofil aktiviert werden. Die Funktion ermittelt anhand der Zuordnung im ActiveDirectory den Benutzer in Intrexx und ordnet diesen zu.
<call class="de.uplanet.lucy.server.usermanager.replication.ldap.LDAPImportTools" method="assignBoss" execafterwrite="true">  
<parameter type="$dbmanager"/>
<parameter type="$destinationitem"/>
<parameter type="$itemconnector"/>
<parameter type="$searchresult"/>
<parameter type="$jdbcconnection"/>
<parameter type="$usn"/>
<parameter type="java.lang.String" value="manager"/>
</call>

Replikation von Benutzerfotos

Seit Windows 2000 existieren Attribute zur Pflege von Benutzerfotos im Active Directory. Die Bildinformation kann jedoch erst ab Outlook/Exchange 2010 aus dem Active Directory genutzt und angezeigt werden. Die Größe pro Bild ist zwar auf 100kB begrenzt, doch bei vielen Mitarbeitern in einem Unternehmen kann das zu replizierende Volumen entsprechend hoch werden. Microsoft empfiehlt die Thumbnailfotogröße von 96 x 96 Pixel mit maximal 10KB. Die Fotos müssen im Active Directory auch gepflegt werden – d.h. dieser Aufwand müssen die Administratoren bewältigen. Zusätzlich muss noch ein Verfahren etabliert werden, welches eine Zustimmung für die Verwendung des Fotos vom jeweiligen Mitarbeiter dokumentiert.
<call class="de.uplanet.lucy.server.usermanager.replication.ldap.LDAPImportTools" method="assignImage" execafterwrite="true">
<parameter type="$dbmanager"/>
<parameter type="$destinationitem"/>
<parameter type="$itemconnector"/>
<parameter type="$searchresult"/>
<parameter type="$jdbcconnection"/>
<parameter type="$inserted"/>
<parameter type="java.lang.String" value="thumbnailPhoto"/>
</call>
Mit https://www.exclaimer.de/outlook-photos/ können Bilddaten in Active Directory importiert werden.

Klasse de.uplanet.lucy.server.usermanager.replication.ldap.LDAPImportTools

Hier finden Sie einen Überblick über die Methoden der Klasse de.uplanet.lucy.server.usermanager.replication.ldap.LDAPImportTools:

assignMembers

public void assignMembers​(IDsObjectRecord p_item, LDAPItemConnector p_connector, SearchResult p_sr, JdbcConnection p_conn, int p_iInternalUsn, String p_strMemberAttr, JobLog p_log) throws SQLException, NamingException
Mit dieser Methode werden Mitglieder, die in einem LDAP-Attribut eines Gruppen-Objekts spezifiziert sind, der entsprechenden Intrexx-Gruppe zugeordnet. Das Member-Attribut muss die Gruppen-Mitglieder in einem Array mit distinguished names beinhalten.

Parameter:

p_item Intrexx-Gruppen-Objekt
p_connector Item-Connector
p_sr Suchergebnis des LDAP-Gruppenobjekts
p_conn Datenbankverbindung
p_iInternalUsn Aktuelle internal USN
p_strMemberAttr Member-Attribut der LDAP-Gruppe
p_log Job-Log, wenn vorhanden

Throws:

SQLException - wenn eine Exception auftritt
NamingException - wenn eine Exception auftritt

assignMembersByLoginName

public void assignMembersByLoginName​(IDsObjectRecord p_item, LDAPItemConnector p_connector, SearchResult p_sr, JdbcConnection p_conn, int p_iInternalUsn, String p_strDomainQuery, String p_strMemberAttr, JobLog p_log) throws SQLException, NamingException
Mit dieser Methode werden Mitglieder, die in einem LDAP-Attribut eines Gruppen-Objekts spezifiziert sind, der entsprechenden Intrexx-Gruppe zugeordnet. Das Member-Attribut muss die Gruppen-Mitglieder in einem Array mit Login-Names beinhalten.

Parameter:

p_item Intrexx-Gruppen-Objekt
p_connector Item-Connector
p_sr Suchergebnis des LDAP-Gruppenobjekts
p_conn Datenbankverbindung
p_iInternalUsn Aktuelle internal USN
p_strMemberAttr Member-Attribut der LDAP-Gruppe
p_log Job-Log-Referenz
p_strDomainQuery User domain query

Throws:

SQLException - wenn eine Exception auftritt
NamingException - wenn eine Exception auftritt

assignDomain

public void assignDomain​(IDsObjectRecord p_item, LDAPItemConnector p_connector, SearchResult p_sr, String p_strDomainAttribute, String p_strDomainQuery) throws NamingException
Ordnet eine Domain, die vom Content eines LDAP-Attributs spezifiziert ist, einem Intrexx-Objekt zu.

Parameter:

p_item Intrexx-Item
p_connector Intrexx-Item-Connector
p_sr LDAP-Suchergebnis
p_conn Datenbankverbindung
p_strDomainQuery LDAP-Domain-Query
p_strDomainAttribute LDAP-Domain-Attribut

Throws:

NamingException - wenn eine Exception auftritt

assignCredentialsWithDomainQuery

public void assignCredentialsWithDomainQuery​(IDsObjectRecord p_item, LDAPItemConnector p_connector, SearchResult p_sr, String p_strLoginAttribute, String p_strDomainAttribute, String p_strDomainQuery) throws NamingException
Ordnet Credentials einem Intrexx-Objekt zu und die Domain via Domain-Attribut und Query.

Parameter:

p_item Intrexx-Item
p_connector Intrexx-Item-Connector
p_sr LDAP-Suchergebnis
p_strDomainQuery LDAP-Domain-Query
p_strDomainAttribute LDAP-Domain-Attribut
p_strLoginAttribute LDAP-Login-Attribut

Throws:

NamingException - wenn eine Exception auftritt

getDomain

public void getDomain​(LDAPItemConnector p_connector, SearchResult p_sr, String p_strDomainAttribute, String p_strDomainQuery) throws NamingException
Throws:

NamingException

assignNameFromLogin

public void assignNameFromLogin​(IDsObjectRecord p_record)
Ordnet einen Intrexx-Login-Namen als Objekt-Namen zu.

Parameter:

p_record Intrexx-User-Objekt-Record

assignPathRoleFromOUAttribute

public void assignPathRoleFromOUAttribute​(IDsObjectRecord p_item, LDAPItemConnector p_connector, SearchResult p_sr, JdbcConnection p_conn, int p_iInternalUsn, String p_strTopOUAttribute) throws Exception
Ordnet ein Objekt einer Gruppe, einer Rolle oder einem Set zu, die mit einem OUAttribut des Objekts importiert werden sollen.

Parameter:

p_item Intrexx-Item
p_connector Intrexx-Item-Connector
p_sr Suchergebnis
p_conn Datenbankverbindung
p_iInternalUsn internal USN
p_strTopOUAttribute OUAttribut

Throws:

Exception - wenn eine Exception auftritt

makeRelative

public String makeRelative​(String p_strBaseDn, String p_strDn) throws InvalidNameException
Throws:

InvalidNameException

findUser

public int findUser​(JdbcConnection p_conn, LDAPItemConnector p_itemConnector, String p_strMember, String p_strLogin, String p_strDomain) throws Exception
Parameter:

p_conn Datenbankverbindung
p_itemConnector Intrexx-Item-Connector
p_strMember Member-Attribute-Name
p_strLogin Login-Name
p_strDomain Domain-Name

Returns: user ID
Throws: Exception - wenn eine Exception auftritt

assignBoss

public void assignBoss​(IDsDbManager<IDsObjectRecord> p_dbMan, IDsObjectRecord p_item, LDAPItemConnector p_connector, SearchResult p_sr, JdbcConnection p_conn, int p_iInternalUsn, String p_strBossAttr) throws SQLException, NamingException
Ordnet den Vorgesetzten einem Objekt zu.

Parameter:

p_dbMan Datenbankmanager
p_item Item
p_connector Item-Connector
p_sr Suchergebnis
p_conn JDBC-Verbindung
p_iInternalUsn Internal Usn
p_strBossAttr Boss-Attribute-Name

Throws: SQLException - wenn eine Exception auftritt
NamingException - wenn eine Exception auftritt

normalizeName

public static String normalizeName​(String p_strName) throws InvalidNameException
Throws: InvalidNameException

dnForQuery

public static String dnForQuery​(String p_strDN) throws InvalidNameException
Throws: InvalidNameException

assignImage

public void assignImage​(IDsDbManager<IDsObjectRecord> p_dbMan, IDsObjectRecord p_item, LDAPItemConnector p_connector, SearchResult p_sr, JdbcConnection p_conn, boolean p_bInsert, String p_strImageAttribute) throws Exception
Ordnet ein Benutzerbild zu.

Parameter:

p_dbMan Datenbankmanager
p_item Intrexx-Item
p_connector Intrexx-Item-Connector
p_sr LDAP-Suchergebnis
p_conn Datenbankverbindung
p_bInsert true für insert, false für update
p_strImageAttribute LDAP-Image-Attribut-Name

Throws:

Exception - wenn eine Exception auftritt

assignAsMember

public void assignAsMember​(IDsObjectRecord p_item, LDAPItemConnector p_connector, SearchResult p_sr, JdbcConnection p_conn, int p_iInternalUsn, String p_strMemberOfAttr) throws SQLException, NamingException
Ordnet einen Benutzer einem Gruppen-Set zu, identifiziert durch ein Benutzerattribut.

Parameter:

p_item User-Item
p_connector LDAP-Item-Connector
p_sr LDAP-Suchergebnis
p_conn Systemdatenbankverbindung
p_iInternalUsn Internal Replication Usn
p_strMemberOfAttr memberOf-Attribut

Throws:

SQLException - wenn eine Exception auftritt
NamingException - wenn eine Exception auftritt

assignDefaultSet

public void assignDefaultSet​(IDsObjectRecord p_item, LDAPItemConnector p_connector, SearchResult p_sr, JdbcConnection p_conn, int p_iInternalUsn, String p_strDefaultSetGuid) throws SQLException
Ordnet einen Benutzer einem Default-Set zu

Parameter:

p_item User-Item
p_connector LDAP-Item-Connector
p_sr LDAP-Suchergebnis
p_conn Systemdatenbankverbindung
p_iInternalUsn Internal Replication Usn
p_strDefaultSetGuid Default-Set-GUID

Throws:

SQLException - wenn eine Exception auftritt

assignToSet

public void assignToSet​(IDsObjectRecord p_item, LDAPItemConnector p_connector, SearchResult p_sr, JdbcConnection p_conn, int p_iInternalUsn, String p_strSetGUID) throws SQLException
Ordnet einen Benutzer einem Set zu, identifiziert durch den gegebenen Namen.

Parameter:

p_item User-Item
p_connector LDAP-Item-Connector
p_sr LDAP-Suchergebnis
p_conn Systemdatenbankverbindung
p_iInternalUsn Internal Replication Usn
p_strSetGUID Set-GUID

Throws:

SQLException - wenn eine Exception auftritt

getContainers

public Map<String,​IValueHolder<?>> getContainers()

getRoles

public Map<String,​IValueHolder<?>> getRoles()

Deaktivierung von Accounts aus der Domäne unterbinden

Bei der Replikation von Benutzern wird deren Aktivierungszustand in die Account-Optionen übernommen. D.h. analog dazu, ob der Account in der Domäne aktiviert oder deaktiviert ist, wird der User in Intrexx ebenfalls aktiviert bzw. deaktiviert. Der Zustand der Option wird mit der Methode $bitand ermittelt und dem Intrexx-Attribut "DISABLED" zugeordnet.
<attribute destination="DISABLED" source="$bitand(userAccountControl,2)"/>
Möchte man nach der Replikation in Intrexx autark bestimmen, welcher Account aktiv sein soll, muss die Anweisung im Replikationsprofil auskommentiert bzw. entfernt werden.

Datumsfeld replizieren

Es gibt in einem Active Directory zwei Datumsinformationen, die im Format yyyy-MM-ddTHH:mm:ss.000 gespeichert werden: das Datum für die Erstellung (whenCreated) und das Datum der letzten Änderung (whenChanged) des Accounts. Weitere Datumsinformationen wie z.B. das Geburts- oder Eintrittsdatum sind nicht vorgesehen und müssen zusätzlich definiert werden. Um solche Datumsinformationen in Intrexx zu übernehmen kann das nachfolgende Konstrukt im Replikationsprofil angewendet werden. Es befüllt exemplarisch das Geburtsdatum in Intrexx mit einem Datumswert aus dem Active Directory. BIRTHDAY steht für den Attributnamen aus dem Active Directory.
<attribute destination="BIRTH" source="$case(BIRTHDAY, $null, $null, $datetime(&quot;dd.MM.yyyy&quot;, &quot;Europe/Berlin&quot;, $case(BIRTHDAY, $null, &quot;01.01.1900&quot;, BIRTHDAY)))"/>

Domain beim Replizieren fest schreiben

In größeren Unternehmensstrukturen mit stetig auftretenden Zukäufen bzw. Zusammenschlüssen kommt es auch zu Erweiterungen und Umstrukturierungen im Active Directory. Nicht selten passieren diese im laufenden Betrieb, bzw. die neue Domäne wird eingebunden und dann schrittweise umgebaut. Häufig folgt dieser Umbau dem organisatorischen Umbau. Dies hat seine Tücken, denn eigentlich sollte eine Domäne vor deren Einbindung konsolidiert werden. Das folgende Beispiel war die Lösung in einem Replikationsszenario, in dem zwei User-Objekte aus zwei verschiedenen Domänen-Replikationen dieselbe Domäne im Userattribut "Domain" beinhaltete. Bei der Replikation wird nun der Benutzername verwendet und die Domänen-Information pro Replikation (Domäne) fest vorgegeben und nicht aus dem AD-Feld ausgelesen.
<!-- Replikation des Users mit fest vorgegebener Domäne -->
<attribute destination="LOGIN" source="sAMAccountName"/>
<attribute destination="LOGINLWR" source="$lower(sAMAccountName)"/>
<attribute destination="DOMAIN" source="&quot;meinedomain.de&quot;"/>
<attribute destination="DOMAINLWR" source="&quot;meinedomain.de&quot;"/>

Festen Wert in Feld schreiben

Um generell bei der Replikation in ein Feld einen festen Wert zu schreiben – unabhängig von einem LDAP-Feld - muss im source-Attribut die Zeichenkette mit &quot; eingeschlossen werden.
<attribute destination="TYPE" source="&quot;Text&quot;"/>

UserAccountControl auswerten

Das Active Directory-Attribut UserAccountControl beinhaltet verschiedene Einstellungen, die in den meisten Fällen nur für die Steuerung in der Domäne relevant sind. Intrexx verwendet hieraus im Standard bereits die Option "Benutzeraccount deaktiviert". Sollten einige der Optionen aufgrund von Workflowsteuerungen oder zu Informationszwecken repliziert werden, müssen zuvor entsprechende Attribute vom Typ "Boolean" in der Intrexx -Benutzerverwaltung (Benutzer-Attribut) erstellt werden.

Bezeichnung Hex
Das Logon-Script wurde ausgeführt 0x00000001
Benutzeraccount deaktiviert 0x00000002
Home-Verzeichnis erforderlich 0x00000008
Kein Passwort erforderlich 0x00000020
Passwort läuft nie ab 0x00010000
Benutzer muss sich mit Smartcard authentifizieren 0x00040000
Computer-Account, der Mitglied dieser Domäne ist 0x00001000
Computer-Account für einen System-Backup Domain-Controller, der Mitglied dieser Domäne ist 0x00002000
Als zweiter Parameter in der Funktion $bitand muss der Hex-Wert angegeben werden. Der erste Parameter ist immer das Attribut aus dem Active Directory (userAccountControl):
<attribute destination="DISABLED" source="$bitand(userAccountControl,2)"/>
<-- Beispiel zum Abruf von "Kein Passwort erforderlich"
<attribute destination="NOPWREQ" source="$bitand(userAccountControl,20)"/>

Replikationsfehler melden




In jedem LDAP-Job ist in den Ausführungsoptionen eine entsprechende E-Mail-Adresse einzutragen, um fehlerbedingte Unterbrechungen frühzeitig zu erkennen, zu analysieren und zu beheben. Wählen Sie in bei "ab Status" die Einstellung "Fehler" aus.

Replikation mehrerer Domänen in ein Portal

Wenn mehrere Domänen in ein Portal synchronisiert werden, sollte ein Job bestimmt werden, der als initiale Replikation mit einer aktiven automatischen Ausführung konfiguriert ist. Die Replikationsjobs für die restlichen Domänen werden nacheinander ausgehend von diesem ersten Job ausgeführt, in dem man eine Kette an Folgeaufträgen definiert. Somit können keine Überlappungen der einzelnen Replikationsjobs entstehen, die Performance-Probleme bzw. Locking-Situationen auf der Datenbank verursachen.



Die Folgeaufträge können in der Aufgabenplanung im entsprechenden Replikationsjob konfiguriert werden. Wenn Sie den Zeitplan bearbeiten kann für jeden Job eine Gruppe definiert und der LDAP-Job hinzufügt werden. Achtung: Es darf nur ein LDAP-Job pro Gruppe vorhanden sein. Alle Einträge einer Gruppe werden parallel ausgeführt! Verursacht einer der Replikationen in der Kette einen Fehler, werden alle nachfolgenden Replikationen nicht ausgeführt. Um dies zu verhindern, kann die Einstellung "Nachfolgende Prozesse auch im Fehlerfall starten" aktiviert werden. Auftretende Fehler sollte man sich auf jeden Fall per E-Mail melden lassen und dann zeitnah beheben, damit auch fehlgeschlagene Replikationen bei erneuter Ausführung wieder komplett durchgeführt werden.

Replikation ohne Organisationsstruktur

Die Replikation in Intrexx erstellt ein Abbild des Active Directory.



Die Replikation funktioniert aber nur 1:1, wenn beim Importjob die Einstellung "Organisationsstruktur importieren" gesetzt ist. Die Benutzer werden beim Import ihrer jeweiligen Organisationseinheit (Parent) zugeordnet. Wurden die Organisationseinheiten zuvor nicht importiert, können diese nicht zugeordnet werden. Daher erfolgt kein Import der Benutzer. Es werden nur Benutzer und Benutzergruppen importiert, die im Active Directory keiner Organisationseinheit zugeordnet sind. Ein Import aller Benutzer ohne die Organisationsstruktur funktioniert nur über eine Anpassung des Profils. Die Anpassung sollte nur an der Kopie eines bestehenden Profils erfolgen. Ersetzen Sie hier jeweils das Wort parent mit fixed by domain an den folgenden beiden Stellen:
<item class="USER" query="(&amp;(objectClass=User)(objectCategory=Person)(!(cn=*$)))" placing="parent">
<item class="GROUP" query="(&amp;(objectClass=Group)(groupType:1.2.840.113556.1.4.803:=2147483648))" placing="parent">
Mit dieser Anpassung werden die Benutzer und Benutzergruppen auch ohne die Organisationseinheiten importiert und im Vorgabecontainer für neue Benutzer, der im Benutzermodul über das Hauptmenü "Benutzer / Konfiguration" definiert ist, aufgenommen.

Replikation von Benutzern einer Benutzergruppe

Wenn man die Replikation der User auf eine Benutzergruppe einschränken will, muss man das Profil für die Replikation anpassen. Hier kann man bei der user-query z.B. für die Gruppe Support die Bedingung "memberOf=CN=Support,OU=Support,DC=unitedplanet,DC=de))" einfügen.
<main use-usns="false" path-separator-char=","escape-char="\" 
user-query="(&amp;(objectClass=User)(objectCategory=Person)(!(cn=*$)
(memberOf=CN=Support,OU=Support,DC=unitedplanet,DC=de))"
group-query="(objectClass=Group)"
unit-query="(objectClass=organizationalUnit)"
domain-query="(objectClass=domain)" />
Sollen bei der Replikation auch alle vererbten Rechte (also alle Objekte die Mitglied der angegebenen Gruppe sind) berücksichtigt werden, kann bei Abfrage einer Windows-Domäne ab Windows Server 2003 SP2, das Query-Statement mit einem speziellen Filter erweitert werden:
<main use-usns="false" path-separator-char="," escape-char="\"
user-query="(&amp;(objectClass=User)(objectCategory=Person)(memberOf:1.2.840.113556.1.4.1941:=CN=SUPPORTER,OU=Team-Gruppen,DC=meinedomain,DC=org)(!(cn=*$)))"
group-query="(&amp;(objectClass=Group)"
unit-query="(objectClass=organizationalUnit)"
domain-query="(objectClass=domain)" />
Soll die Replikation der Benutzergruppen auch eingeschränkt werden, so kann bei der group-query die Bedingung (name=SUPPORTER) eingefügt werden.
<main use-usns="false" path-separator-char="," escape-char="\"
user-query="(&amp;(objectClass=User)(objectCategory=Person)(!(cn=*$)))"
group-query="(&amp;(objectClass=Group)(name=SUPPORTER))"
unit-query="(objectClass=organizationalUnit)"
domain-query="(objectClass=domain)" />
Weitere Hinweise zu speziellen LDAP-Filtern finden Sie hier: https://social.technet.microsoft.com/wiki/contents/articles/5392.active-directory-ldap-syntax-filters.aspx

Replikation ohne Benutzergruppen und Verteilergruppen

Können die Benutzergruppen oder Verteilergruppen aus dem Active Directory in Intrexx nicht sinnvoll eingesetzt werden, besteht auch die Möglichkeit nur die Benutzer und die Organisationsstruktur zu importieren. Die Benutzergruppen können auch in Intrexx definiert und die Benutzer aus dem Active Directory zugeordnet werden. Allerdings muss die Pflege der Zuordnung immer in Intrexx erfolgen, was ein entsprechender administrativer Aufwand ist. In einem bestehenden Replikationsprofil können die beiden zuständigen Blöcke wie folgt auskommentiert werden:
<!—Deactivate group replication
<item class="GROUP"
…
</item>
-->
<!—Deactivate group replication
<item class="DISTLIST"
…
</item>
-->

Aktionen nach Replikation

Es kann durchaus sinnvoll sein, die replizierten Benutzer nach der Replikation einer weiteren Behandlung zu unterziehen. Eine wichtige Aktion nach der Replikation ist das Ausführen der Indexierung für die Suchmaschine.



D.h. als Folgeauftrag nach der Benutzerreplikation sollte die Anwendungsindexierung "Benutzer/Benutzersuche" ausgeführt werden, damit sowohl neue Benutzer als auch geänderte Benutzer über die Suche gefunden werden können. Eine weitere nachgelagerte Aktion ist die Analyse bestimmter Daten im Benutzer und die Definition davon abhängiger Zusatzdaten oder Zuordnungen. Ein Beispiel ist die Erzeugung eines Zusatzattributs "Sortiername" für Benutzer. Dieses sollte den Namen in der Form "Nachname, Vorname" enthalten, um es z.B. in Auswahllisten zu verwenden. Ein nach der Replikation ausgeführter Prozess kann mit Groovy den Vor- und Nachnamen entsprechend kombinieren und in das Zusatzattribut im Benutzer zurückschreiben. In einem zweiten Beispiel wird ein Attribut aus dem Active Directory repliziert, das ein organisatorisches Merkmal wie die Kostenstelle oder ein Organisationskürzel enthält. Anhand dieses Merkmals soll der Benutzer nun einem bestimmten Rechteobjekt (Gruppe, Rolle) oder Organisationsobjekt (Organisationseinheit) zugeordnet werden. Auf diesem Weg kann die Administration teilweise automatisiert werden, wenn die AD-Struktur keine für das Portal verwertbaren Strukturen und Rechteobjekte liefert.



Verwenden Sie eine Timer-Ereignisquelle mit Datengruppenverbindung auf die Benutzer-Datengruppe, um einen Post-Replikationsprozess zu definieren. Die Ereignisquelle muss zwingend deaktiviert werden, da diese nicht zyklisch ausgeführt werden soll, sondern über die Folgeereignis-Kette des Replikationsjobs. Möglich ist dies über das Hauptmenü "Bearbeiten/Element deaktivieren", wenn der Timer auf der Arbeitsfläche markiert ist. Speichern Sie anschließend den Prozess. Über den mit dem Timer verbundenen Ereignisbehandler wird eine Groovy-Aktion ausgeführt, mit der das jeweilige Benutzer-Objekt behandelt werden kann.
def l_intUserId = g_record["E3911A1A0198AFAD87AE026B161B7F7F202D557A"].value /* datafield (PK) (S) Benutzer ID <integer> */
def l_strFirstname = g_record["71F6E73DF87EF94D5B2CB5F6946C7CC4093D876C"].value /* datafield Vorname <string> */
def l_strLastname = g_record["22BF94B5B5D9794429B741D8FD42128CC5E93A62"].value /* datafield Nachname <string> */
// Sortiername erzeugen
def l_strSortname = l_strLastname + ", " + l_strFirstname
//Aktualisieren des Benutzerdatensatzes
g_dbQuery.executeUpdate(conn, "UPDATE DSUSER SET STR_SORTNAME = ? WHERE LID = ?") {
setString(1, l_strSortname)
setInt(8, l_intUserId)
}		
}
Wenn Intrexx Share im Portal vorhanden ist, kann nach der Replikation auch ein Profil-Update ausgeführt werden, um z.B. Namensänderungen zu berücksichtigen. Hierzu muss zuerst geprüft werden, ob ein Profil für den aktuellen Benutzer vorhanden ist.



Mit dem nachfolgenden Groovy-Script kann mit der GUID des Benutzers geprüft werden, ob in Intrexx Share ein Profildatensatz vorhanden ist. Ist dies der Fall, wird der Ausgang "profile_exist" getriggert, der im Anschluss eine Datengruppenaktion ausführt, um die entsprechenden Felder im Profil zu aktualisieren.
def conn = g_dbConnections.systemConnection
def l_strUserGuid = g_record["ACF15A10BE183A1EFBC7EF8C462069428F1E4663"].value
/* datafield Guid <string> */
if(l_strUserGuid != null)
{
def l_intShareProfile = g_dbQuery.executeAndGetScalarIntValue(conn, "SELECT COUNT(*) FROM DATAGROUP('198F73334DF58D0996897A5D7EF8DB12E6727E8D') WHERE STRID = ? AND B_DELETED = ?", 0)
{
	setString(1, l_strUserGuid)
	setBoolean(2, false)
}
if(l_intShareProfile > 0)
{
	return profile_exist
}
}

Eingeschränkte Replikation von Gruppen

Um nur bestimmte Gruppen, die einer bestimmten Namenskonvention folgen zu replizieren, kann die Query für die Gruppen-Objekte (auch für jeden anderen Objekttyp) angepasst werden. Im Beispiel werden alle Gruppen, die mit "IX_" im Namen beginnen repliziert. Falls die Gruppen wiederum Mitgliedschaften in anderen Gruppen bzw. Rechteobjekten beinhalten, die für die Zuordnung der User relevant sind, muss genau geprüft werden, ob sich hier Lücken auftun, wenn die Objekte eingeschränkt repliziert werden.
<item class="GROUP" query="(&amp;(objectClass=Group)(cn=IX_*)(groupType:1.2.840.113556.1.4.803:=2147483648))" placing="parent">

Häufige Fehlermeldungen

Unprocessed Continuation Reference(s)

Da die LDAP-Import Schnittstelle von Intrexx auch kompatibel mit OpenLDAP ist, wird eine Funktion aufgerufen, die beim Microsoft Active Directory nicht korrekt implementiert ist. Die LDAP-Referrals werden von Microsoft nicht standardkonform umgesetzt. Daher tritt diese Warnmeldung beim Import aus Microsoft Active Directory auf. Die Meldung ist in vielen Fällen folgenlos und führt nicht zu einem Fehler beim Import. In seltenen Fällen kann es jedoch ein Hinweis auf eine Unterbrechung sein. In jedem Fall sollte man das Replikationsergebnis prüfen (Anzahl der Objekte in der AD gegen die Anzahl der replizierten Objekte vergleichen).

WARN 2008-06-19 11:29:44,110 - de.uplanet.lucy.server.usermanager.replication.ldap.LDAPReplicator[UserReplicationWorker]
javax.naming.PartialResultException: Unprocessed Continuation Reference(s); remaining name 'DC=unitedplanet,DC=de'
javax.naming.PartialResultException: Unprocessed Continuation Reference(s); remaining name 'DC=unitedplanet,DC=de'
at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2784)
at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2758)
at com.sun.jndi.ldap.LdapNamingEnumeration.getNextBatch(LdapNamingEnumeration.java:129)
at com.sun.jndi.ldap.LdapNamingEnumeration.hasMoreImpl(LdapNamingEnumeration.java:198)
at com.sun.jndi.ldap.LdapNamingEnumeration.hasMore(LdapNamingEnumeration.java:171)
at de.uplanet.lucy.server.usermanager.replication.ldap.LDAPReplicator.a(Unknown Source)
at de.uplanet.lucy.server.usermanager.replication.ldap.LDAPReplicator.a(Unknown Source)
at de.uplanet.lucy.server.usermanager.replication.ldap.LDAPReplicator.replicateIncremental(Unknown Source)
at de.uplanet.lucy.server.usermanager.replication.UserReplicationJobController$1.run(Unknown Source)
WARN 2008-06-19 11:29:45,637 - de.uplanet.lucy.server.usermanager.replication.ldap.LDAPReplicator[UserReplicationWorker]

Data Truncation

Hier handelt es sich nicht um einen Fehler von Intrexx. Der Benutzerimport funktioniert nicht, da im Active Directory in einem oder mehreren Datensätzen zu lange Einträge vorhanden sind. Die maximale Feldlänge des entsprechenden Zieldatenfelds in der Intrexx-Benutzerverwaltung ist zu klein, bzw. der Active Directory Eintrag ist zu lang. Mögliche Lösungsansätze, um einen Fehler und Abbruch der Replikation zu verhindern finden Sie im Abschnitt Feldinhalte aus Active Directory abschneiden".

Importjob mit Fehler beendet:

de.uplanet.jdbc.StandardDbException: Error: 0, SQLState: 22001: Data truncation
at de.uplanet.jdbc.sqlserver.SQLServerDescriptor.convertException(Unknown Source)
at de.uplanet.jdbc.JdbcPreparedStatement.executeUpdate(Unknown Source)
at de.uplanet.lucy.server.usermanager.ds.managerimpl.DsDbManager._doUpdateInsert(Unknown Source)
at de.uplanet.lucy.server.usermanager.ds.managerimpl.DsDbManager.insert(Unknown Source)
at de.uplanet.lucy.server.usermanager.replication.ldap.LDAPReplicator.a(Unknown Source)
at de.uplanet.lucy.server.usermanager.replication.ldap.LDAPReplicator.b(Unknown Source)
at de.uplanet.lucy.server.usermanager.replication.ldap.LDAPReplicator.a(Unknown Source)
at de.uplanet.lucy.server.usermanager.replication.ldap.LDAPReplicator.b(Unknown Source)
at de.uplanet.lucy.server.usermanager.replication.ldap.LDAPReplicator.a(Unknown Source)
at de.uplanet.lucy.server.usermanager.replication.ldap.LDAPReplicator.a(Unknown Source)
at de.uplanet.lucy.server.usermanager.replication.ldap.LDAPReplicator.replicateIncremental(Unknown Source)
at de.uplanet.lucy.server.usermanager.replication.UserReplicationJobController$1.run(Unknown Source)
03.12.2008 15:17:54: *** ERROR OCCURED, JOB STOPPED ***

Class DISTLIST is not castable to the class GROUP

Dieser Fehler tritt auf, wenn die Klasse eines Objekts im Active Directory verändert wird. Bei der Anlage eines Objektes wird dessen Funktion durch die Klasse definiert (Benutzergruppe oder eine Verteilerliste). Die Umwandlung eines Objektes wie z.B. einer Verteilergruppe in eine Benutzergruppe oder umgekehrt hat Auswirkungen auf Intrexx und die dort replizierten Objekte. Im Active Directory werden die Objekte durch ein Flag unterschieden, während in Intrexx jeder Objekttyp in einer eigenen Datengruppe verwaltet wird. Eine Umwandlung resultiert in einem Replikationsfehler:

Error when processing search result:
mail=adresse@domain.de
objectGUID;binary=[B@64250a59
name=Objektbezeichnung
memberOf=CN=Benutzer,OU=Empfänger,DC=row,DC=domain,DC=de
primaryGroupToken=5338
de.uplanet.lucy.usermanager.DsRuntimeException: The dest ds class DISTLIST is not castable to the class GROUP
at de.uplanet.lucy.server.usermanager.ds.managerimpl.DsDbManager.a(Unknown Source)
at de.uplanet.lucy.server.usermanager.ds.managerimpl.DsDbManager.select(Unknown Source)
at de.uplanet.lucy.server.usermanager.ds.managerimpl.DsDbManager.select(Unknown Source)
at de.uplanet.lucy.server.usermanager.ds.managerimpl.DsDbManager.select(Unknown Source)
at de.uplanet.lucy.server.usermanager.ds.managerimpl.DsDbManager.selectFullRecord(Unknown Source)
at de.uplanet.lucy.server.usermanager.ds.managerimpl.DsDbManager.selectFullRecord(Unknown Source)
at de.uplanet.lucy.server.usermanager.replication.ldap.LDAPReplicator.a(Unknown Source)
at de.uplanet.lucy.server.usermanager.replication.ldap.LDAPReplicator.b(Unknown Source)
at de.uplanet.lucy.server.usermanager.replication.ldap.LDAPReplicator.a(Unknown Source)
at de.uplanet.lucy.server.usermanager.replication.ldap.LDAPReplicator.a(Unknown Source)
at de.uplanet.lucy.server.usermanager.replication.ldap.LDAPReplicator.replicateIncremental(Unknown Source)
at de.uplanet.lucy.server.usermanager.replication.UserReplicationJob.doWork(Unknown Source)
at de.uplanet.lucy.server.scheduler.AbstractJob.execute(Unknown Source)
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)

Ab Intrexx Version 7 sollte bei einer solchen Änderung das ursprüngliche Objekt in Intrexx gelöscht und in der entsprechenden Datengruppe neu angelegt werden. Wurde das Objekt in einer Verteilergruppe oder in Berechtigungen verwendet, ist es nicht mehr wirksam, da nicht mehr vorhanden. Die korrekte Vorgehensweise wäre ein neues Objekt anzulegen und die Benutzer zuzuordnen, anstatt den Typ eines Objektes zu verbiegen. Administratoren sparen sich durch dieses Verfahren zwar Zeit, das die zugeordneten Objekte im neuen Objekt nicht erneut erfolgen muss, doch die daraus resultierenden Probleme sollten bekannt sein.

Connection timed out: connect

Dieser Fehler tritt auf, wenn der angegebene Domänencontroller nicht erreichbar ist. Dies kann durch fehlende Zugriffsrechte auf den Server oder gesperrte Ports verursacht werden. Tritt der Fehler im laufenden Betrieb bei einem bereits erfolgreich eingerichteten Replikationsjob auf, kann die Ursache an einem Serverausfall oder auch einer geänderten IP-Adresse oder geänderten Zugriffsrechten liegen. Es ist gerade in großen Organisationen mit mehreren unabhängig gepflegten Domänen wichtig, dass Änderungen abgestimmt werden, um solche Probleme zu vermeiden.

20.07.2014 22:17:36: *** User Replication Job 912496D87C849A5D109ED500F0D696A01B60D680 STARTED ***
Configuration:06C3620E8A4A3AB57992EF33A0263409CE7727C9 / DOMAIN
javax.naming.CommunicationException: 192.168.10.100:389 [Root exception is java.net.ConnectException: Connection timed out: connect]
at com.sun.jndi.ldap.Connection.<init>(Connection.java:209)
at com.sun.jndi.ldap.LdapClient.<init>(LdapClient.java:116)
at com.sun.jndi.ldap.LdapClient.getInstance(LdapClient.java:1580)
at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2678)
at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:296)
at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:175)
at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:193)
at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:136)
at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:66)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.init(InitialContext.java:223)
at javax.naming.ldap.InitialLdapContext.<init>(InitialLdapContext.java:134)
at de.uplanet.lucy.server.usermanager.replication.ldap.LDAPReplicator.a(Unknown Source)
at de.uplanet.lucy.server.usermanager.replication.ldap.LDAPReplicator.replicateIncremental(Unknown Source)
at de.uplanet.lucy.server.usermanager.replication.UserReplicationJob.doWork(Unknown Source)
at de.uplanet.lucy.server.scheduler.AbstractJob.execute(Unknown Source)
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)
Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:529)
at java.net.Socket.connect(Socket.java:478)
at java.net.Socket.<init>(Socket.java:375)
at java.net.Socket.<init>(Socket.java:189)
at com.sun.jndi.ldap.Connection.createSocket(Connection.java:351)
at com.sun.jndi.ldap.Connection.<init>(Connection.java:186)
... 18 more
20.07.2014 22:17:57: *** ERROR OCCURRED, JOB STOPPED ***

Werkzeuge

Für das Testen einer Query ist der Suchdialog des Jxplorer gut geeignet.

Werkzeug Webseiten

Apache Directory Studio: https://directory.apache.org/studio/
LDAP Adnub: https://www.ldapadmin.org/