SQL-Registry
Zuletzt geändert: 19.04.2026 04:42

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 Tabelle Registry lesen 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 direktes SELECT oder UPDATE ist 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 einmal Get-EulandaRegistrySubtree nutzen. Das geht intern über cn_RegBulkRead und 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:

PfadInhalt
\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 .crypt und haben ValType=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.