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.
-
Ein Schema ist eine Schablone für alle Active Directory-Einträge. Es definiert sowohl Objekttypen, ihre Klassen und Attribute als auch ihre Attributsyntax. Welche Objekttypen im Active Directory verfügbar sind, lässt sich durch die Definition neuer Typen beeinflussen. Das dafür zugrundeliegende Muster ist das Schema, das die Objekte und ihre Attribute definiert.
-
Die Konfiguration stellt die Struktur des Active Directory-Waldes und seiner Bäume dar.
-
Die Domain enthält schließlich alle Informationen, die sie selbst und die in ihr erstellten Objekte beschreiben.
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:
-
Konten, wie zum Beispiel Benutzer-, Gruppen- und Computerkonten
-
Ressourcen, wie zum Beispiel Datei- und Druckerfreigaben
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 | 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 | ||
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
Das Modul "Benutzer" 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. |
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="<Target class>" query="<LDAP-Query>" placing="<Placement mode>" [dnfilter="<Filter-Regexp>"]> <attribute source="<Source attribute>"/>
...
<attribute destination="<Target attribute>" source="<Source expression>"/>
...
<call class="<Tool class>" method="<Methode>" [execafterwrite="true|false"]> <parameter type="<Builtin-Parameter>"/>
...
<parameter type="<Java class>" value="<Value>"/>
...
</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. Definition siehe z.B. https://tools.ietf.org/html/rfc2254 |
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
Folgende Funktionen stehen an verschiedenen Stellen zur Verfügung:
Funktion |
Intrexx Version |
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("dd.MM.yyyy", "Europe/Berlin", 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 |
6.0 | $print(value-array, separator) Ein Array von Werten in ein einzelnes Feld schreiben, Trennzeichen ist <separator>. | |
$sid | 11.0 |
$sid(value) Transformiert die Microsoft ID in eine Intrexx GUID. Beispiel: <attribute destination="EXTERNALSID" source="$sid(objectSID;binary)"/> |
$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("%1.64s",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>
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("dd.MM.yyyy", "Europe/Berlin", $case(BIRTHDAY, $null, "01.01.1900", 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.
<!-- Replication of the user with a fixed domain -->
<attribute destination="LOGIN" source="sAMAccountName"/>
<attribute destination="LOGINLWR" source="$lower(sAMAccountName)"/>
<attribute destination="DOMAIN" source=""meinedomain.de""/>
<attribute destination="DOMAINLWR" source=""meinedomain.de""/>
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 " eingeschlossen werden.
<attribute destination="TYPE" source=""Text""/>
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)"/>
<-- Example for retrieving "No password required"
<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="(&(objectClass=User)(objectCategory=Person)(!(cn=*$)))" placing="parent">
<item class="GROUP" query="(&(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 Modul "Benutzer" ü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="(&(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="(&(objectClass=User)(objectCategory=Person)(memberOf:1.2.840.113556.1.4.1941:=CN=SUPPORTER,OU=Team-Gruppen,DC=meinedomain,DC=org)(!(cn=*$)))" group-query="(&(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="(&(objectClass=User)(objectCategory=Person)(!(cn=*$)))" group-query="(&(objectClass=Group)(name=SUPPORTER))" unit-query="(objectClass=organizationalUnit)" domain-query="(objectClass=domain)" />
Weitere Hinweise zu speziellen LDAP-Filtern finden Sie hier:
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 Replikations-Jobs. 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) User ID <integer> */
def l_strFirstname = g_record["71F6E73DF87EF94D5B2CB5F6946C7CC4093D876C"].value /* datafield Firstname <string> */
def l_strLastname = g_record["22BF94B5B5D9794429B741D8FD42128CC5E93A62"].value /* datafield Lastname <string> */
// Create sortname
def l_strSortname = l_strLastname + ", " + l_strFirstname
//Update of user record
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="(&(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)
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: http://www.ldapadmin.org/
Weitere Informationen
Objekte, Klassen und Attribute
Die Bereiche des Moduls "Benutzer"
Replikation - Benutzer- und Gruppenimport
Portal-Login über Identitiy Provider
Proxyserver zur Authentifizierung nutzen