SQL Server Setup Tool
Konfiguration & Verfahren
Standardisierte SQL-Server Installationen per WinForms-GUI, INI-Konfiguration und dbaTools. Dieses Dokument beschreibt alle Konfigurationsparameter, den Installationsablauf und die verwendeten technischen Verfahren für Entwickler und Administratoren.
Benutzeroberfläche
Die WinForms-GUI gliedert sich in acht konfigurierbare Gruppen. Alle Combobox-Inhalte werden beim Start aus der INI geladen. Domänen-Standardwerte werden automatisch vorausgewählt und im Formular hervorgehoben.
INI [Versions] / [Editions]
+ Reset-Button
Quelle: collations.txt
AD-Prüfung, UPN-Normalisierung
Pfad-Vorschau inkl. Instanz
Domain-spezifischer Typ
SSRS / SSAS / TDP
Thread-sicher via MethodInvoker
Abb. 1: SQL Server Setup Tool – Hauptfenster (Beispiel: Domäne CONTOSO, Instanz INST01)
| # | Gruppe | Inhalt | Konfigurationsquelle |
|---|---|---|---|
| ① | Version & Edition | SQL-Version und Edition, Domänenanzeige | [Versions], [Editions] |
| ② | Instanzname | Freitext + Reset-Button auf MSSQLServer | [General] DefaultInstanceName |
| ③ | Sortierung | Combobox, Domain-Sortierung an erster Stelle | Config\collations.txt, [Collations] Standard=, Domain_* |
| ④ | Service-Konto | Konto + Passwort + AD-Prüfung mit Lockout-Hinweis | Eingabe + AD-Bind |
| ⑤ | Plattenlayout | Laufwerksbuchstaben + Live-Pfad-Vorschau | [DiskLayout_*], [Paths] |
| ⑥ | Monitoring | Typ-Auswahl oder per INI ausgeblendet | [Monitoring] Enabled, Types |
| ⑦ | Optionale Komp. | SSRS / SSAS / TDP Checkboxen | [OptionalComponents] |
| ⑧ | Protokoll | Schwarzes Log-Fenster, Marquee-ProgressBar in Statusleiste | Laufzeit / MethodInvoker |
Projektstruktur
Das SQL Server Setup Tool automatisiert die standardisierte Installation von Microsoft SQL Server in Unternehmensumgebungen. Eine WinForms-GUI führt den Administrator durch alle Konfigurationsschritte; Installation und Nachkonfiguration erfolgen vollständig per PowerShell und dbaTools.
| Datei / Verzeichnis | Zweck |
|---|---|
Main.ps1 | Einstiegspunkt: Adminprüfung, Module laden, dbaTools sichern, GUI starten |
GUI\MainForm.ps1 | WinForms Formular, alle Event-Handler, Hintergrundthread-Steuerung |
Modules\Config.psm1 | INI-Parser, Domänenerkennung, collations.txt einlesen, Konfigurationsobjekt aufbauen |
Modules\Validation.psm1 | AD-Konto-/Passwortprüfung, Instanzname, Laufwerke |
Modules\DiskLayout.psm1 | SQL-Pfade aus Laufwerksbuchstaben + SubPaths aufbauen |
Modules\CopySource.psm1 | Robocopy-Wrapper: Share → lokales Ziel |
Modules\Installation.psm1 | Install-DbaInstance Aufruf, SSRS / SSAS / TDP |
Modules\PostInstall.psm1 | Nachkonfiguration: Memory, MAXDOP, Agent, TempDB |
Modules\DbaToolsSetup.psm1 | dbaTools aus ShareBasePath (beide Unterordner) oder Gallery laden |
Config\settings.ini | Zentrale Konfigurationsdatei (alle Parameter) |
Config\collations.txt | Collation-Auswahlliste – eine pro Zeile, #-Kommentare erlaubt |
Scripts\PostInstall.ps1 | Projekt-spezifische Nachkonfiguration (Vorlage) |
Module
INI + collations.txt
2019 / 2022 / 2025
(Runspace-Threading)
INI-Konfiguration (settings.ini)
Alle Combobox-Inhalte, Standardwerte, Pfade und Seriennummern werden beim Start aus
der INI-Datei in Config\settings.ini gelesen. Änderungen erfordern keinen
Neustart des Skripts – die Datei wird bei jedem Start neu eingelesen.
= werden vom Parser ignoriert.
Listen (Versionen, Editionen) müssen als kommagetrennte Werte in einem einzigen
Schlüssel stehen. Die Collation-Liste ist seit April 2025 ausgelagert in
Config\collations.txt – siehe Abschnitt 2a.
[General]
| Schlüssel | Beispielwert | Bedeutung |
|---|---|---|
| DefaultVersion | 2022 | Vorausgew. SQL-Version beim Start |
| DefaultEdition | Developer | Vorausgew. Edition |
| DefaultInstanceName | MSSQLServer | Standardinstanzname (Reset-Button) |
| DefaultCollation | SQL_Latin1_General_CP1_CI_AS | Fallback-Sortierung |
| SourceShare | \\srv\SQLSources | UNC-Pfad zu den Installationsmedien |
[Versions] und [Editions]
| Schlüssel | Beispielwert | Bedeutung |
|---|---|---|
| Available | 2019,2022,2025 | Füllt Version-Combobox |
| Standard | Developer,Standard,Enterprise | Editionen für 2019 und 2022 |
| SQL2025 | Developer-Standard,Developer-Enterprise | 2025-spezifische Editionen |
[Collations]
Die vollständige Auswahlliste wird seit April 2025 aus Config\collations.txt
gelesen – siehe Abschnitt 2a. In der INI verbleiben nur noch
die Standard-Collation und domänenspezifische Vorgaben.
[Collations]
# Globale Standardsortierung – Fallback wenn collations.txt fehlt
Standard=SQL_Latin1_General_CP1_CI_AS
# Domänenspezifische Vorgabe – erscheint an erster Stelle der Combobox
# Format: Domain_<NETBIOSNAME> = <Collation>
Domain_CONTOSO=Latin1_General_CI_AS
# List= entfällt – vollständige Liste in Config\collations.txt
[Paths] – Konfigurierbare SQL-Pfade
Die Unterverzeichnis-Teile werden mit dem Laufwerksbuchstaben aus [DiskLayout_*]
und dem Instanz-Suffix kombiniert. Der Suffix lautet MSSQLSERVER für die
Standardinstanz, sonst MSSQL$<Instanzname>.
| Schlüssel | Default | Resultierender Pfad (Beispiel) |
|---|---|---|
| InstallSubPath | Microsoft SQL Server | C:\Microsoft SQL Server |
| BackupSubPath | Daten\Backup | B:\Daten\Backup\MSSQL$INST01 |
| DataSubPath | Daten\SQL | D:\Daten\SQL\MSSQL$INST01\DATA |
| TempSubPath | Daten\SQL | T:\Daten\SQL\MSSQL$INST01\DATA |
| LogSubPath | Daten\SQL | E:\Daten\SQL\MSSQL$INST01\LOG |
[DiskLayout_Standard] und domänenspezifische Layouts
Laufwerksbuchstaben je Pfadtyp. Für jede Domäne kann eine eigene Sektion
[DiskLayout_<NETBIOSNAME>] angelegt werden, die automatisch
greift wenn der Server Mitglied dieser Domäne ist.
[DiskLayout_Standard]
DataDrive=D
LogDrive=E
TempDrive=T
BackupDrive=B
InstallDrive=C
# Überschreibt Standard für CONTOSO-Domäne
[DiskLayout_CONTOSO]
DataDrive=F
LogDrive=G
TempDrive=H
BackupDrive=I
InstallDrive=C
[SerialNumbers]
Schlüsselformat: SQL<Version>_<Edition>. Developer-Editionen
bleiben leer – kein Produktkey erforderlich.
| Schlüssel | Wert | Hinweis |
|---|---|---|
| SQL2022_Developer | (leer) | Kein Key benötigt |
| SQL2022_Standard | XXXXX-XXXXX-... | Volumenlizenz |
| SQL2025_Developer-Standard | XXXXX-XXXXX-... | Neue 2025-Edition |
| SQL2025_Developer-Enterprise | XXXXX-XXXXX-... | Neue 2025-Edition |
Collation-Auswahlliste (Config\collations.txt)
Die vollständige Liste der zur Auswahl stehenden Sortierungen wurde aus der
settings.ini ausgelagert. Sie liegt als einfache Textdatei im selben
Verzeichnis wie die INI und kann ohne Kenntnisse des INI-Formats gepflegt werden.
[Collations] Standard=) und domänenspezifische Vorgaben
(Domain_<n>=) bleiben in der settings.ini und
steuern die Vorauswahl. Die collations.txt bestimmt den
Inhalt der Combobox.
Datei-Eigenschaften
| Eigenschaft | Wert | Hinweis |
|---|---|---|
| Dateiname | collations.txt | Fest – wird automatisch gesucht |
| Speicherort | Config\ | Gleiches Verzeichnis wie settings.ini |
| Encoding | UTF-8 | Empfohlen |
| Format | Eine Collation pro Zeile | Keine Trennzeichen |
| Kommentare | # ... | Zeile beginnt mit # → ignoriert |
| Leerzeilen | Erlaubt | Zur Strukturierung nutzbar |
Verhalten und Priorität
# SQL Server-Sortierungen (Latin / CI)
SQL_Latin1_General_CP1_CI_AS
SQL_Latin1_General_CP1_CI_AI
SQL_Latin1_General_CP1_CS_AS
# Windows-Sortierungen (Deutsch / Mitteleuropa)
Latin1_General_CI_AS
Latin1_General_CS_AS
German_PhoneBook_CI_AS
# Weitere europäische Sprachen
Finnish_Swedish_CI_AS
French_CI_AS
Polish_CI_AS
# BIN
Latin1_General_BIN
Latin1_General_BIN2
Auflösungsreihenfolge in Get-CollationList
# 1. collations.txt lesen
$list = Get-Content "$ConfigDir\collations.txt" |
Where-Object { $_ -match '\S' -and $_ -notmatch '^#' } |
ForEach-Object { $_.Trim() }
# 2. Datei nicht vorhanden oder leer → Fallback auf Standard-Collation
if ($list.Count -eq 0) { return @($DefaultCollation) }
# 3. Domänen-Vorgabe an erste Position, Duplikat entfernen
if ($DomainCollation) {
$list = @($DomainCollation) + ($list | Where-Object { $_ -ne $DomainCollation })
}
return $list # → Combobox-Inhalt
| Situation | Verhalten |
|---|---|
collations.txt vorhanden und gefüllt | Liste aus Datei; Domain-Collation an Position 1 |
collations.txt fehlt | Warnung im Log; nur Standard= aus INI wird angeboten |
collations.txt leer (nur Kommentare) | Warnung im Log; nur Standard= aus INI wird angeboten |
| Domain-Collation ist bereits in der Liste | Duplikat wird entfernt, trotzdem an Position 1 |
| Keine Domain-Collation konfiguriert | Reihenfolge aus Datei unverändert |
Neue Sortierung hinzufügen
Einfach eine neue Zeile mit dem exakten SQL-Server-Collationnamen in
collations.txt eintragen. Das Tool liest die Datei beim nächsten Start
automatisch neu ein. Kein Eingriff in settings.ini erforderlich.
dbaTools-Share-Konfiguration ([dbaTools])
Der bisherige Schlüssel SharePath wurde durch ShareBasePath
ersetzt. Der Code leitet daraus automatisch die beiden benötigten Unterverzeichnisse ab –
manuelles Pflegen zweier Pfade entfällt.
Share-Struktur
<ShareBasePath>\dbatools\dbatools.psd1 muss existieren.
Der Anwender ist für die Aktualität der Share-Versionen verantwortlich.
settings.ini – [dbaTools]
[dbaTools]
# Basisverzeichnis auf dem Share.
# Darunter werden automatisch erwartet:
# <ShareBasePath>\dbatools – Hauptmodul
# <ShareBasePath>\dbatools.library – Bibliothek (dbaTools >= 2.x)
ShareBasePath = W:\75084-Datenbanken\MSSQL\CCM\_MSSQL_GUI\01_PreInstall
ModuleName = dbatools
# SharePath= (alte Variante) entfällt
Ladereihenfolge (DbaToolsSetup.psm1)
# 1. Bereits im Runspace geladen?
if (Get-Module -Name dbatools) { return }
# 2. Lokal installiert (Get-Module -ListAvailable)?
if (Get-Module -ListAvailable -Name dbatools) {
Import-Module dbatools; return
}
# 3. Share: ManifestPath erreichbar?
# <ShareBasePath>\dbatools\dbatools.psd1
if (Test-Path $DbaToolsConfig.ManifestPath) {
# dbatools.library-Parent temporär in PSModulePath eintragen
$env:PSModulePath = $libParent + ';' + $env:PSModulePath
# Beide Ordner nach C:\Program Files\WindowsPowerShell\Modules\ kopieren
foreach ($folder in @('dbatools', 'dbatools.library')) {
if (-not (Test-Path $dst)) {
Copy-Item -Path $src -Destination $dst -Recurse -Force
}
}
Import-Module $DbaToolsConfig.ManifestPath; return
}
# 4. Fallback: PowerShell Gallery
Install-Module dbatools -Scope AllUsers -Force
dbatools.library zwingend erforderlich. Es wird vor dem
Import-Module-Aufruf temporär in $env:PSModulePath
eingetragen, damit dbatools.psd1 die Abhängigkeit auflösen kann.
Die lokale Kopie verbleibt dauerhaft unter
C:\Program Files\WindowsPowerShell\Modules\dbatools.library\.
Abgeleitete Pfade im Konfigurationsobjekt
| Eigenschaft | Wert (Beispiel) |
|---|---|
| ShareBasePath | W:\...\01_PreInstall |
| ModulePath | W:\...\01_PreInstall\dbatools |
| LibraryPath | W:\...\01_PreInstall\dbatools.library |
| ManifestPath | W:\...\01_PreInstall\dbatools\dbatools.psd1 |
| LocalTargetDir | C:\Program Files\WindowsPowerShell\Modules |
Ablauf & Verfahren
Startsequenz (Main.ps1)
Beim Aufruf durchläuft Main.ps1 folgende Schritte in dieser Reihenfolge,
bevor die GUI erscheint:
- Adminrechte prüfen (
WindowsPrincipal) – Abbruch mit Dialog bei Fehlschlag - Alle sieben Module laden (
Import-Module -Force) - INI-Konfiguration lesen, Konfigurationsobjekt aufbauen, Domäne ermitteln
- Collation-Liste aus
Config\collations.txteinlesen - dbaTools sicherstellen – mit Splash-Fenster und Marquee-ProgressBar
- Relative PostInstall-Skriptpfade in absolute Pfade auflösen
- GUI starten (
Show-SetupForm)
Domänenerkennung und domänenspezifische Konfiguration
Get-CurrentDomain liest den NetBIOS-Domänennamen via
Win32_ComputerSystem. Der Name wird großgeschrieben und als Suchschlüssel
für folgende INI-Elemente verwendet:
[Collations] Domain_<n>– Sortierungsvorgabe, wird an erste Combobox-Position gesetzt[DiskLayout_<n>]– Eigene Sektion mit Laufwerksbuchstaben[Monitoring] Domain_<n>– Vorauswahl Monitoring-Typ
AD-Validierung (Validation.psm1)
# Stufe 1: UPN normalisieren
# user@domain.com -> DOMAIN\user
$normalized = ConvertTo-DomainAccountFormat -AccountName $account
# Stufe 2: Passwort validieren (genau 1 DC-Bind-Versuch)
$ctx.ValidateCredentials($samName, $password)
# Bei Fehler: Lockout-Zähler um 1 erhöht
GUI-Threading (Runspace-Konzept)
Lange Operationen (Robocopy, SQL-Installation, PostInstall) laufen in einem separaten PowerShell-Runspace damit die WinForms-GUI nicht einfriert.
| # | Regel | Umsetzung |
|---|---|---|
| 01 | GUI-Werte als Snapshot kopieren | Alle Controls werden vor Thread-Start ausgelesen, nie im Worker-Thread |
| 02 | GUI-Updates nur per Invoke | $control.Invoke([MethodInvoker]{...}) – nie direkte Property-Zuweisung |
| 03 | InvokeRequired prüfen | Hilfsfunktionen prüfen InvokeRequired vor jedem Aufruf |
| 04 | Timer-basiertes Cleanup | Timer im GUI-Thread prüft alle 500 ms ob Worker fertig ist |
$logCallback = [ScriptBlock]{
param([string]$msg)
$line = "$(Get-Date -Format 'HH:mm:ss') $msg"
$txtLog.Invoke([System.Windows.Forms.MethodInvoker]{
$txtLog.AppendText("$line`r`n")
$txtLog.ScrollToCaret()
})
}
[System.Windows.Forms.MethodInvoker] verwendet werden.
[System.Action] wird als Cmdlet-Name interpretiert und führt zu einem
CommandNotFoundException.
PostInstall-Nachkonfiguration
Nach erfolgreicher SQL-Server Installation ruft der Worker-Thread automatisch
Invoke-PostInstall auf. Alle Aktionen werden im Log-Fenster protokolliert.
| Funktion | Aktion | dbaTools-Befehl |
|---|---|---|
Set-SqlMaxMemory | Max Server Memory = 90% des physischen RAM | Set-DbaMaxMemory |
Set-SqlOptimizeForAdHoc | optimize for ad hoc workloads = 1 | Set-DbaSpConfigure |
Set-SqlCostThreshold | Cost Threshold for Parallelism = 50 | Set-DbaSpConfigure |
Set-SqlMaxDop | MAXDOP = min(8, logische CPUs) | Set-DbaSpConfigure |
Enable-SqlAgentAutoStart | SQL Agent = Automatic + Start | Set-Service / Start-Service |
Set-SqlTempDbFiles | TempDB-Dateien = max(4, min(8, CPUs)) | Set-DbaTempDbConfig |
Invoke-CustomPostInstallScript | Scripts\PostInstall.ps1 ausführen | Benutzerdefiniert |
param([string]$InstanceName, [ScriptBlock]$LogAction)
$sqlInst = if ($InstanceName -eq 'MSSQLSERVER') {
$env:COMPUTERNAME
} else { "$($env:COMPUTERNAME)\$InstanceName" }
# Backup-Kompression aktivieren
Set-DbaSpConfigure -SqlInstance $sqlInst -Name 'DefaultBackupCompression' -Value 1
# Operator anlegen
New-DbaAgentOperator -SqlInstance $sqlInst -Name 'DBA-Team' -EmailAddress Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein. '
Erweiterung & Systemvoraussetzungen
Neue SQL-Version hinzufügen
[Versions] Available=insettings.inierweitern[Editions]ggf. neue Sektion für versionsspezifische Editionen[SerialNumbers]neue SchlüsselSQL<Version>_<Edition>- Installationsmedien auf Share unter
<SourceShare>\SQL<Version>\bereitstellen
Neue Domäne konfigurieren
[DiskLayout_<NETBIOSNAME>]Sektion insettings.inianlegen[Collations] Domain_<NETBIOSNAME>=<Collation>eintragen[Monitoring] Domain_<NETBIOSNAME>=<Typ>eintragen (optional)
Collation-Liste anpassen
Config\collations.txtöffnen- Neue Zeile mit exaktem SQL-Server-Collationnamen eintragen
#-Kommentarzeilen zur Strukturierung verwenden- Tool neu starten – die Datei wird beim Start neu eingelesen
- Kein Eingriff in
settings.inierforderlich
dbaTools-Share umziehen oder aktualisieren
[dbaTools] ShareBasePath=auf neues Basisverzeichnis setzen- Sicherstellen dass beide Unterordner vorhanden sind:
\dbatoolsund\dbatools.library - Lokale Kopien in
C:\Program Files\WindowsPowerShell\Modules\löschen wenn ein Update eingespielt wird – das Tool kopiert beim nächsten Start automatisch neu
Systemvoraussetzungen
| Komponente | Anforderung | Hinweis |
|---|---|---|
| PowerShell | 5.1 oder höher | WMF 5.1 auf WS 2016+ |
| Betriebssystem | Windows Server 2019 / 2022 | WinForms benötigt .NET Framework |
| Berechtigungen | Lokaler Administrator | Wird beim Start geprüft |
| dbaTools | Aktuell (Share oder Gallery) | ShareBasePath hat Vorrang; \dbatools und \dbatools.library müssen vorhanden sein |
| Netzwerk | UNC-Zugriff auf SourceShare | Für Robocopy und dbaTools-Share |
| Active Directory | Optional | Nur für AD-Kontoprüfung |
| .NET Framework | 4.7.2+ | WinForms, System.DirectoryServices |
powershell.exe -ExecutionPolicy Bypass -File ".\Main.ps1"