Erweiterte Platzhalter
Platzhalter wie ${user.email} oder ${device.model} werden an mehreren Stellen in Relution genutzt, u. a. bei Gerätenamen, Zertifikaten, Exchange-Konten oder App-Konfigurationen. Über die zugrunde liegende Template-Engine FreeMarker stehen dabei zusätzliche Funktionen zur Verfügung, mit denen Platzhalter weiter angepasst werden können.
Ab Relution 26.5.3 können Platzhalter-Ausdrücke nur noch die Werte lesen, die als Platzhalter vorgesehen sind, also die im Portal unter Verfügbare Platzhalter angebotenen. Andere Eigenschaften bleiben leer, der Aufruf anderer Methoden lässt die Auswertung fehlschlagen (siehe Hinweise →). Eigene Ausdrücke, die über die angebotenen Platzhalter hinausgehen, sollten nach dem Update geprüft werden. ${device.rooted} und ${device.jailbroken} werden seitdem ausgewertet: Bei einem gerooteten bzw. per Jailbreak veränderten Gerät wird true eingesetzt, andernfalls bleibt der Platzhalter leer.
Teilzeichenfolgen (Substring)
Mit der Notation [start..*länge] wird nur ein Ausschnitt eines Werts verwendet: ab Position start höchstens länge Zeichen. Die Zählung beginnt bei 0. Ist der Wert kürzer, wird entsprechend weniger eingesetzt, bei leerem Wert nichts. Voraussetzung ist, dass start nicht hinter dem Ende des Werts liegt; andernfalls schlägt die Ersetzung wie bei [start..ende] fehl (siehe Hinweis unten).
${user.givenName[0..*1]}→ erster Buchstabe des Vornamens${device.model[0..*2]}→ erste zwei Zeichen des Gerätemodells
Beispiel: ${user.givenName[0..*1]}${user.surname[0..*1]}-${device.model[0..*2]}-${(device.custom1)!"00000"} ergibt bei einem Benutzerkonto „Max Mustermann“ mit einem custom1-Wert von 00042 auf einem iPad12,1 beispielsweise MM-iP-00042.
[start..ende] (z. B. [0..0]) setzt voraus, dass der Wert mindestens bis zur Position ende reicht. Ist der Wert gesetzt, aber kürzer oder leer, schlägt die Ersetzung fehl und keiner der Platzhalter im betroffenen Text wird ersetzt. Dasselbe gilt für [start..*länge], wenn start größer als die Länge des Werts ist.Standardwert bei nicht gesetztem Feld
Ist ein Feld nicht gesetzt, kann mit dem !-Operator ein Standardwert hinterlegt werden: ${(device.custom1)!"00000"}. Ist das benutzerdefinierte Feld custom1 nicht gesetzt, wird stattdessen 00000 verwendet, anstatt dass der Platzhalter leer bleibt. Ein gesetzter, aber leerer Wert gilt dagegen als vorhanden: Der Standardwert greift dann nicht, und der Platzhalter bleibt leer.
Groß-/Kleinschreibung und Zeichen ersetzen
Über ?lower_case bzw. ?upper_case wird ein Wert vollständig in Klein- oder Großbuchstaben umgewandelt. Mit ?replace("alt", "neu") lassen sich einzelne Zeichen oder Zeichenfolgen ersetzen, beispielsweise um Umlaute für Systeme aufzulösen, die keine Sonderzeichen im Benutzernamen zulassen:
${user.surname?lower_case?replace("ä","ae")?replace("ö","oe")?replace("ü","ue")?replace("ß","ss")}
Lokalen Teil einer E-Mail-Adresse verwenden
Um aus ${user.name} (bzw. ${user.email}) nur den Teil vor dem @-Zeichen zu verwenden, stehen mehrere Varianten zur Verfügung:
${user.name?keep_before("@")}${user.name?split("@")[0]}${user.name[0..user.name?index_of("@")-1]}
Enthält der Wert kein @, liefern die ersten beiden Varianten den vollständigen Wert, während die dritte fehlschlägt. Empfohlen wird daher ?keep_before.
Benutzerzertifikate
Neu in 26.5Über Platzhalter der Form ${user.certificate.…} werden die im Benutzerprofil hinterlegten Zertifikate (Abschnitt Benutzerdefinierte Zertifikate) als base64-kodierte Zeichenkette in eine Konfiguration eingefügt — zum Beispiel in eine Managed App Konfiguration, deren Felder ein Zertifikat als base64-String erwarten. Aufgelöst wird der Platzhalter beim Übertragen der Konfiguration anhand des Benutzers, der dem jeweiligen Gerät zugewiesen ist.
Drei Auswahlformen stehen zur Verfügung:
| Platzhalter | Auflösung |
|---|---|
${user.certificate.EXCHANGE} | Zertifikat des Subtyps mit der längsten Restlaufzeit |
${user.certificate.EXCHANGE["mein-zertifikat"]} | Zertifikat mit exakt diesem Namen (Groß-/Kleinschreibung wird beachtet); bei mehreren gleichnamigen das mit der längsten Restlaufzeit |
${user.certificate.EXCHANGE[device.serialnumber]} | Zertifikatsname wird aus einem anderen Platzhalter berechnet |
Als Subtyp wird die Kategorie angegeben, die im Benutzerprofil für das Zertifikat ausgewählt ist. Beim Subtyp spielt die Groß-/Kleinschreibung keine Rolle.
| Kategorie im Benutzerprofil | Subtyp |
|---|---|
| Allgemeines Zertifikat | GENERAL_CERTIFICATE |
| WLAN | WIFI |
| Exchange | EXCHANGE |
| VPN und Apps | VPN |
| S/MIME-Verschlüsselung | SMIME_ENCRYPTION |
| S/MIME Signierung | SMIME_SIGNING |
Zertifikatsname in eckigen Klammern
Bei berechneten Namen wird der innere Platzhalter ohne umschließendes ${…} geschrieben, also [device.serialnumber] statt [${device.serialnumber}] — verschachtelte ${…}-Ausdrücke werden nicht unterstützt. Für Namen, die nur aus Buchstaben, Ziffern und Unterstrichen bestehen, funktioniert auch die Punktform ${user.certificate.EXCHANGE.iPhone}.
${user.certificate.EXCHANGE.mein-zertifikat} wird als Rechenoperation interpretiert und führt dazu, dass die gesamte Konfiguration ohne ersetzte Platzhalter ausgeliefert wird.Passwort für PKCS#12-Zertifikate
Für passwortgeschützte PKCS#12-Zertifikate (z. B. eine S/MIME-Identität) wird das Importpasswort über den reservierten Schlüssel password mitgeliefert:
${user.certificate.SMIME_SIGNING.password}${user.certificate.SMIME_SIGNING["mein-zertifikat"].password}
Bei Zertifikaten, die kein PKCS#12-Container sind, bleibt der Wert leer. Da password ein reservierter Schlüssel ist, kann ein Zertifikat, das selbst den Namen password trägt, nicht über Platzhalter ausgewählt werden — sowohl die Punkt- als auch die Klammerform liefern in diesem Fall das Passwort. Für solche Zertifikate sollte ein anderer Name verwendet werden.
Ausgabeformat
Unabhängig vom hochgeladenen Dateiformat (PEM oder DER) liefert der Platzhalter immer die base64-kodierte DER-Form des Zertifikats. PKCS#12-Container werden unverändert base64-kodiert ausgeliefert, sodass sie zusammen mit dem Passwort direkt von der empfangenden App importiert werden können. Andere Zertifikatstypen werden ebenfalls so ausgeliefert, wie sie gespeichert sind.
Beispiel einer Managed App Konfiguration für einen E-Mail-Client mit S/MIME-Signatur:
<key>SMIMECertificate</key>
<string>${user.certificate.SMIME_SIGNING}</string>
<key>SMIMECertificatePassword</key>
<string>${user.certificate.SMIME_SIGNING.password}</string>
Verfügbarkeit
Benutzerzertifikat-Platzhalter sind für Konfigurationen vorgesehen, deren Inhalt an das Gerät des zugewiesenen Benutzers übertragen wird, insbesondere Managed App Konfigurationen (iOS/macOS, Android Enterprise), Knox-Konfigurationen (Android Enterprise, Samsung KNS), eigene Konfigurationsprofile (.mobileconfig) und Windows Custom CSP. In diesen Konfigurationen führt das Portal sie auch unter Verfügbare Platzhalter auf. Nicht aufgelöst werden sie (der Platzhalter bleibt leer) in Gerätenamen, also beim Umbenennen von Geräten und in Gerätename-Konfigurationen für Apple und Windows, unter Android Enterprise in Sperrbildschirm- und Supportnachrichten, bei der Arbeitskonto-Einrichtung und in Setup-Aktionen sowie in Skript-Umgebungsvariablen und in Webhook-Aktionen von Gerätegruppen. Für Linux-Konfigurationen werden sie nicht unterstützt. In eigenen Konfigurationsprofilen (.mobileconfig) ist der Platzhalter nur in String-Feldern möglich, nicht in data-Feldern; in Managed App Konfigurationen funktioniert beides.
Kann kein Zertifikat ermittelt werden — etwa bei unbekanntem Subtyp, nicht vorhandenem Namen oder fehlender Benutzerzuweisung —, bleibt der Platzhalter leer und die Konfiguration wird dennoch ausgeliefert. Details zur Ursache werden im Serverlog protokolliert.
Hinweise
Welche Basis-Platzhalter (z. B. ${user.email}, ${device.serialnumber}) in einer bestimmten Konfiguration zur Verfügung stehen, wird im Konfigurationsformular bzw. im jeweiligen Dialog im Abschnitt Verfügbare Platzhalter angezeigt. Ein Klick auf einen Eintrag kopiert ihn in die Zwischenablage.
Nicht gesetzte Werte werden als leere Zeichenfolge eingesetzt. Schlägt dagegen die Auswertung eines Ausdrucks fehl — etwa bei einem Ausschnitt [0..0] aus einem gesetzten, aber leeren Wert oder einem unbekannten Funktionsnamen —, betrifft das nicht nur den einzelnen Platzhalter: Der gesamte Text des Felds bzw. der Konfiguration wird unverändert ausgeliefert, also mit allen nicht ersetzten ${…}-Ausdrücken. Die Ursache wird im Serverlog protokolliert.