SQL-Registry #
Die EULANDA-Datenbank hat eine eigene hierarchische Konfigurations-Ablage,
die SQL-Registry genannt wird. Sie funktioniert konzeptionell wie die
Windows-Registry, ist aber in der Tabelle Registry der Datenbank abgelegt
und damit pro Mandant unterschiedlich.
Dort werden unter anderem gespeichert:
- Firmenstamm-Einstellungen (Bankverbindungen, Briefpapier-Defaults)
- Plugin-Konfigurationen (DMS-Pfad, Shopify-Tokens, Mailprovider)
- Grundwerte (USt-Sätze, Umrechnungsfaktoren, Textvorlagen)
- Pfade zu Reports, Dateien, Scans
Drei Ebenen – nur eine davon nutzt man direkt #
Aus Sicht des PowerShell-Anwenders liegen zwischen dem Skript und der
Tabelle Registry zwei Abstraktionsschichten:
flowchart TD
A["PowerShell-Skript
Get-EulandaRegistryValue
Set-EulandaRegistryValue
Get-EulandaRegistrySubtree"]:::anlegen
B["EulandaXtools
(PowerShell-Wrapper)"]:::buchen
C["SQL-API
cn_RegRead, cn_RegWrite,
cn_RegBulkRead,
cnf_RegReadString ..."]:::umwandlung
D[("Tabelle Registry
Key-IDs, Parent-Refs,
ValType, CryptData, Utf16")]:::store
A --> B --> C --> D
X["Direktes SELECT / UPDATE"]:::storno
X -.->|NICHT MACHEN| D
classDef anlegen fill:#2e86c1,color:#fff,stroke:#1a5276
classDef buchen fill:#27ae60,color:#fff,stroke:#196f3d
classDef umwandlung fill:#8e44ad,color:#fff,stroke:#5b2c6f
classDef store fill:#566573,color:#fff,stroke:#2c3e50
classDef storno fill:#c0392b,color:#fff,stroke:#7b241c
Niemals direkt auf die TabelleRegistrylesen oder schreiben. Die Tabelle hat eine interne Struktur mit Key-IDs, Parent-Referenzen, Typen (String / Int / Binary / Encrypted) und in neueren Versionen Utf16-Varianten. Ein direktesSELECToderUPDATEist fragil und bricht bei Versionswechseln oder lokalisierten Varianten stumm. Immer über die Stored Procedures (cn_Reg...) oder Scalar Functions (cnf_Reg...) gehen – oder die fertigen EulandaXtools-Wrapper.
Beispiel: einen Wert lesen #
Get-EulandaRegistryValue liefert den Wert als String zurück
(oder $null, wenn er nicht existiert). Klassisches Beispiel: den
Firmennamen aus dem Firmenstamm holen.
Import-Module EulandaXtools
$udl = 'C:\Eulanda\mandant.udl'
Get-EulandaRegistryValue -Udl $udl `
-Path '\MODULES\Grundwerte\Firmenstamm' `
-Name 'Firma'
# Ergebnis z.B.: EULANDA Software GmbH
Beispiel: einen bestehenden Wert ändern #
Nur bestehende Values überschreiben, niemals neue Pfade anlegen. Die Root-Struktur der EULANDA-Registry (\VENDOR,\MODULES,\OBJECTS,\SYSTEM, …) ist strikt vorgegeben und wird an vielen Stellen in Belegdruck, Plugins und Triggern gelesen. Wer ausserhalb der definierten Felder schreibt, legt Artefakte an, die kein Modul jemals wieder anfasst – im besten Fall Ballast, im schlechtesten Fall irreführend für Support-Fälle.
Typisches Beispiel: den Firmennamen ändern – alter Wert sichern, neuen setzen, später wieder zurückstellen.
$conn = Get-ConnByUdl -Udl $udl
try {
$alt = Get-EulandaRegistryValue -Conn $conn `
-Path '\MODULES\Grundwerte\Firmenstamm' -Name 'Firma'
Set-EulandaRegistryValue -Conn $conn `
-Path '\MODULES\Grundwerte\Firmenstamm' -Name 'Firma' `
-Value 'Neuer Name GmbH'
# ... Arbeit, die mit dem neuen Namen laufen muss ...
# Alten Wert wiederherstellen
Set-EulandaRegistryValue -Conn $conn `
-Path '\MODULES\Grundwerte\Firmenstamm' -Name 'Firma' -Value $alt
}
finally {
$conn.Close()
}
Beispiel: ganzen Subtree lesen (Performance-Pfad) #
Bulk-Read statt N Einzelaufrufe. Wer mehrere Values aus derselben Ebene braucht, sollte nicht N-mal einzeln abfragen, sondern einmalGet-EulandaRegistrySubtreenutzen. Das geht intern übercn_RegBulkReadund ist auf VPN-Verbindungen um Faktor ~9 schneller.
Die Rückgabe ist eine zweistufige Hashtable: der Key ''
(leere Zeichenkette) enthält die Values direkt unter dem angefragten
Pfad, weitere Keys sind relative Unterpfade.
$conn = Get-ConnByUdl -Udl $udl
try {
$werte = Get-EulandaRegistrySubtree -Conn $conn `
-Path '\MODULES\Grundwerte\Firmenstamm'
# Root-Values direkt unter dem Pfad (z.B. Firma, IBAN, UstId ...)
$werte[''].Keys | ForEach-Object {
"$_ = $($werte[''][$_])"
}
# Voller Baum inkl. Unterebenen (z.B. Bankverbindung 1, 2, ...)
foreach ($sub in $werte.Keys) {
foreach ($n in $werte[$sub].Keys) {
"{0,-30} = {1}" -f ("$sub\$n".TrimStart('\')), $werte[$sub][$n]
}
}
}
finally {
$conn.Close()
}
Pfad-Konventionen #
Typische Wurzel-Zweige in der EULANDA-Registry:
| Pfad | Inhalt |
|---|---|
\VENDOR\<hersteller>\... | Hersteller-Einstellungen (z.B. esol, eulanda) |
\MODULES\<modul>\... | Modul-/Plugin-Konfiguration |
\OBJECTS\SETTINGS\<plugin> | Plugin-Metadaten (.package, .version) |
\SYSTEM\Devices\... | Gerätekonfiguration (Mail, Drucker, Scanner) |
\SYSTEM_NC\FILES\... | Binäre Inhalte (z.B. installierte Plugin-ZIPs) |
Verschlüsselte Werte. Einige Registry-Einträge enden auf.cryptund habenValType=6. Sie werden per LockBox-Algorithmus verschlüsselt abgelegt (z.B. Shopify-Tokens, Mail-Passwörter). Zum Entschlüsseln wird das separate Modul EulandaCrypt benötigt – nicht in EulandaXtools enthalten, weil sonst Windows Defender anschlägt.
Detaillierte SP-Signaturen und der Utf16-Rückfall sind im internen
Dokument docs/internal/sql-registry.md im Repository dokumentiert.