DBA Tooling · FI-TS München · 2026

SQL Server
Setup Tool

Standardisierte, reproduzierbare SQL Server Installationen
nach Unternehmensstandard — vollautomatisch, domänenspezifisch

SQL Server 2019 / 2022 / 2025 Windows Server 2022 PowerShell 5.1 dbaTools 2.x WinForms GUI

Uwe Janke  ·  Senior SQL Server DBA  ·  dtcSoftware

Motivation

The Problem

Manuelle SQL Server Installation — jedes Mal anders, jedes Mal fehleranfällig.

⏱️

1–3 Stunden

Manueller Aufwand je Installation — ohne Nachkonfiguration. Mit Härtung schnell 4+ Stunden

🗂️

Kein einheitlicher Standard

Laufwerksbelegung, Collation, TempDB-Größe variieren je Bearbeiter. Kein versionierter Stand

🔐

Härtung vergessen

SA-Account aktiv, Max Memory nicht gesetzt, Ola-Jobs fehlen — Abweichungen fallen erst im Betrieb auf

🏢

Domänen-Unterschiede

HLB vs. CONTOSO: andere Collation, andere Laufwerke, andere Sysadmin-Gruppen — manuell gepflegt

📋

57 Firmen-Scripts

Früher 57 einzelne SQL-Skripte manuell nachinstalliert. Kein Protokoll. Kein Fehler-Handling

🔄

Nicht reproduzierbar

Neue Umgebung? Alter DBA ist weg? — Kein Nachweis was installiert wurde und in welchem Zustand

Überblick

The Solution

Ein Tool, eine Konfiguration, ein Standard. Domäne einmal in der INI hinterlegen — danach läuft alles automatisch.


🖥️

WinForms GUI

Kein PowerShell-Wissen nötig. Domänspezifische Vorbelegung, alle Parameter auf einem Blick

🔒

17-stufige PostInstall-Härtung

NTFS, MaxMemory, MAXDOP, TempDB, SA-Obfuscation, Ola-Jobs, Firmen-Scripts — vollautomatisch

🏢

Zero-Touch für neue Domänen

INI-Block hinzufügen, kein Code anfassen. Alle Parameter domänenspezifisch überschreibbar

VorherNachher
1–4 Stunden manuell~25–70 Min. vollautomatisch
Jedes Mal andersReproduzierbar, versioniert
Härtung vergessen17 Schritte garantiert
57 SQL-Scripts manuellAutomatisch alphabetisch
Keine Domänen-LogikINI-basiert, zero-touch
✓ Getestet auf Windows Server 2022 · SQL Server 2019, 2022, 2025 · Domänen HLB und CONTOSO
Vorbereitung

Prerequisites & Source Structure

Voraussetzungen

AnforderungHinweis
Lokaler AdministratorAuf dem Zielserver
5 LaufwerkeC/F/G/H/I — per INI konfigurierbar
Netzwerk-Share erreichbar\\srv\SQLSources
dbaTools ≥ 2.0Wird automatisch installiert
sqmSQLToolWird automatisch installiert
SQL Server ISO entpacktIm SQLSources-Share vorbereitet
ℹ New-SqlSourceStructure.ps1 Legt den kompletten SQLSources-Ordnerbaum automatisch an — mit README.txt in jedem Ordner.

SQLSources-Struktur

\\srv\SQLSources\ ├── SQL2022\ │ ├── SQL_Install\ ← entpacktes ISO │ │ └── Updates\ ← aktuelles CU (.exe) │ ├── Reporting\ ← SSRS-Installer │ └── Management\ ← SSMS-Installer ├── SQL2019\ ← gleiche Struktur ├── SQL2025\ ← gleiche Struktur ├── Scripts\ ← Firmen-SQL-Skripte └── TDP\ ← IBM Spectrum Protect
Bedienung

The Interface

Domänenspezifisch vorbelegt — Version, Collation, Laufwerke, Monitoring. Alles auf einem Formular.

⚙️ SQL Server Setup - Standardisierte Installation
① SQL Server Version & Edition
Version:
2022
   Edition:
Developer
    🏢 Domain: HLB
② Instanzname
Instanzname:
MSSQLServer
 
Standard
 (leer / MSSQLServer = Standardinstanz)
③ Sortierung (Collation)
Sortierung:
SQL_Latin1_General_CP1_CI_AS
  ✓ Domain-Sortierung aktiv (HLB-Standard)
④ Service-Konto  (leer = NT SERVICE\MSSQLSERVER)
Konto (DOMAIN\User):
HLB\svc-sql-prod
 
AD prüfen
Passwort:
••••••••
 ⚠️ AD-Prüfung zählt zur Lockout-Policy!
⑤ Plattenlayout  Domain HLB · aus INI
Installation:
C:
Daten:
G:
Log:
H:
TempDB:
I:
Backup:
F:
⑥ Monitoring
Monitoring-Typ:
Vollständig
⑦ Optionale Komponenten
SSRS
SSAS
SSMS
SSIS
TDP
⑧ Aktionen
Quellen kopieren
Installation starten
Schließen
⑨ Protokoll
[09:42:11]Konfiguration geladen. Domain: HLB · Sortierung: SQL_Latin1_General_CP1_CI_AS [09:43:05]Phase 1: Robocopy gestartet - \\srv\SQLSources\SQL2022 → C:\SQLSources\SQL2022 [09:48:32]Phase 1 abgeschlossen. 4,2 GB in 327 Sek. kopiert [09:48:35]Phase 2: Install-DbaInstance SQL Server 2022 Developer ...
Phase 2 - SQL Server Installation läuft ... bitte warten
Ablauf

4-Phase Workflow

Alle Phasen laufen sequenziell in einem Background-Thread — GUI bleibt jederzeit bedienbar.

1
Quellvorbereitung
Robocopy
5–15 Min.
2
SQL Server Install
Install-DbaInstance
10–25 Min.
3
Opt. Komponenten
SSAS/SSRS/SSMS/TDP
0–20 Min.
4
PostInstall
17 Schritte
3–8 Min.

Phase 1 — Robocopy

Lokale Kopie vom Share

robocopy \\srv\SQLSources\SQL2022 C:\SQLSources\SQL2022 /E /R:2 /W:5

Warum lokal?

Setup.exe und CU-Patch laufen stabiler von lokalem Laufwerk. Netzwerkunterbrechungen während des Setups vermieden

Slipstream CU

CU-Datei in \Updates\ wird von Install-DbaInstance automatisch als UpdateSourcePath verwendet

Phase 3 — Optionale Komponenten

KomponenteInstaller
SSRSSQLServerReportingServices.exe — eigenständig ab 2017
SSASIm SQL-Setup via Feature AS aktiviert
SSMSSSMS-Setup-ENU.exe — versionsneutral
SSISFeature IS im SQL-Engine-Setup (keine Extra-Datei)
TDPsetup.exe aus \TDP\ — versionsneutral
Deep Dive · Phase 2

Install-DbaInstance — Parameter & Slipstream

Das Tool übergibt alle Parameter vollständig aus INI + GUI an Install-DbaInstance. Keine INI-Datei wird manuell erstellt.

ParameterQuelle
VersionGUI ComboBox
EditionGUI ComboBox
InstanceNameGUI TextBox
CollationINI / Domain-Override
DataPath / LogPathINI DiskLayout
TempPathINI DiskLayout
BackupPathINI DiskLayout
UpdateSourcePath\SQL_Install\Updates\ auto
ProductIDINI SerialNumbers
SqlSvcAccountGUI Eingabe
FeaturesINI + GUI Checkboxen
# Slipstream CU automatisch erkennen
$cuPath = Join-Path $localSrc 'SQL_Install\Updates'
$cuFile = Get-ChildItem $cuPath '*.exe' `
           -ErrorAction SilentlyContinue |
           Select-Object -First 1

# Install-DbaInstance Aufruf (Auszug)
$params = @{
  SqlInstance      = 'localhost'
  Version          = $ver
  Edition          = $edition
  Path             = $localSrc
  UpdateSourcePath = if ($cuFile) { $cuPath } else { $null }
  Collation        = $collation
  DataPath         = $paths.Data
  LogPath          = $paths.Log
  TempPath         = $paths.TempDB
  BackupPath       = $paths.Backup
  Features         = $features
  SqlSvcAccount    = $svcAccount
  SqlSvcPassword   = $svcPassword
  ProductID        = $productKey
  PerformVolumeMaintenanceTasks = $true
}
Install-DbaInstance @params -Confirm:$false
✓ Instant File Initialization PerformVolumeMaintenanceTasks = $true — SQL Server darf Volume ohne Zero-Fill allokieren. Deutlich schneller bei Dateioperationen.
Deep Dive · Konfiguration

Domain Detection & INI-Logik

Das Tool erkennt die Domäne automatisch beim Start und lädt domänenspezifische Vorgaben aus der INI — ohne Code-Änderung.

1
Domäne erkennen

[System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().Name — NetBIOS-Name extrahiert

2
INI-Sektion suchen

Erst [DiskLayout_HLB], dann [DiskLayout_Standard] als Fallback

3
Collation, Monitoring, Gruppen

Domain_HLB = SQL_Latin1... — pro Key domänenspezifisch oder Standard-Fallback

4
Neue Domäne = nur INI

Keine PowerShell-Änderung. Nur neuen [DiskLayout_XYZ] Block in settings.ini eintragen

# settings.ini (Auszug)
[DiskLayout_Standard]
DataDrive   = G
LogDrive    = H
TempDrive   = I
BackupDrive = F
InstallDrive= C

[Collations]
Standard       = Latin1_General_CI_AS
Domain_HLB     = SQL_Latin1_General_CP1_CI_AS
Domain_CONTOSO = Latin1_General_CI_AS

[SysadminGroups]
Domain_HLB     = HLB\Fg_DC_SqlAdminAll_Mod
Domain_CONTOSO = CONTOSO\Rg_SQL_Sysadmin
Standard       =   # leer = kein Sysadmin

[Monitoring]
Domain_HLB     = 2  # Vollständig
Domain_CONTOSO = 1  # Standard
DefaultType    = 1
Deep Dive · Phase 4

PostInstall — 17 Schritte

Vollautomatisch nach der Installation. Jeder Schritt protokolliert, jeder Fehler abgefangen.

1
NTFS-Berechtigungen
2
Max Server Memory (90%)
3
Optimize for Ad hoc
4
Cost Threshold = 50
5
MAXDOP (CPU-basiert)
6
SQL Agent Autostart
7
TempDB optimieren
8
Recovery-Modell FULL
9
SQL Browser deaktivieren
10
AD Sysadmin-Gruppen
11
SA-Obfuscation
12
Monitoring-Key
13
Instanz-Validierung
14
Custom PostInstall.ps1
15
Ola Hallengren Install
16
Splunk konfigurieren
17
Firmen-SQL-Skripte *.sql
ℹ Schritt 7 — TempDB Dateianzahl CPU-basiert (max. 8), Größe aus INI. Spätere manuelle Anpassung entfällt.
✓ Schritt 17 — neu Ersetzt die alten 57 manuellen SQL-Skripte. Alphabetisch, GO-Trenner, ContinueOnError.
Deep Dive · Schritt 17

Firmen-SQL-Scripts — Von 57 zu Wenigen

Früher 57 einzelne SQL-Skripte manuell nachinstalliert. Heute durch sqmSQLTool weitgehend abgedeckt — der Rest läuft automatisch.

Früher (Skript)Heute (sqmSQLTool)
010_maxmemory.sqlSchritt 2 PostInstall
020_maxdop.sqlSchritt 5 PostInstall
030_ntfs.sqlInvoke-sqmNtfsSetup
040_sa_rename.sqlInvoke-sqmSaObfuscation
050_ola_jobs.sqlNew-sqmOlaMaintenanceJobs
Firmen-Logins, LinkedServerSchritt 17 (verbleibend)
ℹ Standardpfad \\srv\SQLSources\Scripts\ — wird automatisch verwendet wenn SqlScriptsPath in settings.ini leer ist.
# Invoke-SqlScriptFolder — Ablauf
$scripts = Get-ChildItem '\\srv\SQLSources\Scripts' `
            -Filter '*.sql' | Sort-Object Name

# Alphabetisch: 001_ bis 057_
foreach ($script in $scripts) {
  $sql = Get-Content $script.FullName -Raw

  # GO-Trenner: Batches aufteilen
  $batches = $sql -split '\r?\nGO\r?\n|\r?\nGO$' |
              Where-Object { $_.Trim() -ne '' }

  foreach ($batch in $batches) {
    try {
      Invoke-DbaQuery -SqlInstance $inst `
          -Query $batch -ErrorAction Stop
      log "  OK: $($script.Name)"
    } catch {
      log "  WARN: $($script.Name) - $_"
      # ContinueOnError - naechstes Skript
    }
  }
}
⚡ Benennung empfohlen 001_logins.sql, 002_linkedserver.sql — Reihenfolge über Dateiname steuerbar.
Deep Dive · Schritte 10–11

SA-Obfuscation & Sysadmin-Gruppen

SA-Account ist das bekannteste Angriffsziel auf SQL Server. Das Tool verschleiert ihn automatisch — sicher, ohne manuellen Eingriff.

10
AD-Gruppe zur sysadmin-Rolle

Domain-spezifische Gruppe aus INI. Mindestens eine Gruppe muss zugewiesen sein — sonst kein sysadmin mehr nach SA-Umbenennung

11
SA umbenennen + Passwort

Invoke-sqmSaObfuscation: zufälliger Name, zufälliges 32-Zeichen Passwort. Name + Passwort nur im Rückgabeobjekt — sicher verwahren

⚠ Sicherheitsnetz eingebaut Wenn keine AD-Gruppe zugewiesen werden konnte, wird SA-Obfuscation automatisch übersprungen — kein Zugriffsverlust möglich.
AngriffSchutz
Brute Force auf saLogin heißt nicht mehr sa
Standard-Passwort32-Zeichen Zufalls-Passwort
SA bleibt aktivGesperrter Login (disabled)
Kein Admin-ZugangAD-Gruppe vor Umbenennung gesetzt
ℹ Nur wenn AD-Gruppe zugewiesen [SysadminGroups] leer lassen = SA-Obfuscation wird übersprungen. Empfohlen: AD-Gruppe immer konfigurieren.
✓ Schritt 13 — Validierung Get-sqmSQLInstanceCheck prüft nach allen PostInstall-Schritten ob die Instanz healthy ist.
Toolchain

Connection to sqmSQLTool & AlwaysOn

Das Setup Tool richtet die Basis ein. sqmSQLTool übernimmt danach den laufenden Betrieb — AlwaysOnSetup die HA-Konfiguration.

Nach dem Setup — sqmSQLTool-Aufgaben

💾

Backup-Jobs

New-sqmOlaUsrDbBackupJob — FULL/DIFF/LOG-Jobs. Bereits in PostInstall Schritt 15 angelegt

🏥

Monitoring & Splunk

Invoke-sqmSplunkConfiguration — Monitoring-Key + Splunk-Forwarder. PostInstall Schritt 16

📜

Laufender Betrieb

Deadlock-Analyse, Health-Checks, Zertifikat-Management — alles nach dem initialen Setup

AlwaysOn nach dem Setup

🔷

Voraussetzung: Gleiche Basis

AlwaysOnSetup setzt voraus dass SQL Server auf allen Nodes identisch installiert ist — genau das liefert das Setup Tool

🔄

Typischer Workflow

1. SQLSetupTool auf Node 1 + Node 2 → 2. AlwaysOnSetup für AG-Konfiguration → 3. sqmSQLTool für laufenden Betrieb

ℹ Collation-Konsistenz Für AlwaysOn müssen alle Nodes dieselbe Collation haben. INI-basierte Vorbelegung stellt das sicher.
AlwaysOnSetup — HA-Konfiguration nach SQL-Installation sqmSQLTool — DBA-Toolbox (Monitoring, Backup, Analyse) SQLMigration — Produktivdatenbanken migrieren
Abgrenzung

Scope & Boundaries

Was das Tool bewusst nicht macht — und warum.

Außerhalb des Scope

AufgabeZuständigkeit
Laufwerke formatieren / zuweisenServer-Team
Windows Server installierenServer-Team
DNS-EinträgeNetzwerk-Team
Produktivdatenbanken migrierenSQLMigration Tool
AlwaysOn konfigurierenAlwaysOnSetup Tool
Firewall-RegelnNetzwerk-Team

Designentscheidungen

ℹ Kein Upgrade-Szenario Das Tool installiert neu. In-Place-Upgrades (z.B. 2019 → 2022) sind ein eigenes Tool: InplaceUpDate.
ℹ Lokale Robocopy-Kopie immer Setup.exe läuft immer von lokalem Laufwerk — nie direkt vom Share. Stabiler, kein Timeout-Risiko.
✓ Idempotentes PostInstall Die meisten PostInstall-Schritte können mehrfach ausgeführt werden ohne Schaden anzurichten. Neustart = sicher.
Fehlerbehandlung

Troubleshooting

ProblemUrsacheLösung
Install-DbaInstance Timeout Setup dauert länger als erwartet (CU-Patch) dbaTools wartet aktiv — kein manueller Eingriff. Bei echtem Timeout: Log unter %TEMP%\dbatools
Robocopy fehlgeschlagen Share nicht erreichbar oder keine Schreibrechte auf lokalem Laufwerk UNC-Pfad in settings.ini prüfen. Laufwerk C: muss ausreichend Platz haben (~10 GB)
SA-Obfuscation übersprungen Keine Sysadmin-Gruppe in [SysadminGroups] konfiguriert Domain-Eintrag in settings.ini ergänzen. SA bleibt dann aktiv — manuell sichern
SQL-Skript schlägt fehl (Schritt 17) Syntax-Fehler, fehlendes Objekt, Berechtigungsproblem im Firmen-Script ContinueOnError: restliche Skripte laufen weiter. Fehlschlager im Log als WARN sichtbar
Falsche Collation gesetzt Domäne nicht erkannt — Standard-Fallback verwendet Domain-Erkennung im Log prüfen. Ggf. Domain_XYZ Eintrag in settings.ini ergänzen
dbaTools Import fehlgeschlagen PSGallery nicht erreichbar, ShareBasePath fehlt Offline-Kopie unter [dbaTools] ShareBasePath in settings.ini konfigurieren
Zusammenfassung

Summary & Next Steps

Key Takeaways

1–4h → 25–70 Minuten

4 Phasen vollautomatisch — Robocopy, Install-DbaInstance, Komponenten, Härtung

Zero-Touch für neue Domänen

INI-Block hinzufügen — kein PowerShell-Code anfassen. Sofort einsatzbereit

17-stufige Härtung garantiert

NTFS, MaxMemory, MAXDOP, TempDB, SA-Obfuscation, Ola-Jobs, Firmen-Scripts

57 SQL-Scripts obsolet

sqmSQLTool deckt den Großteil ab. Rest läuft als Step 17 automatisch

Basis für die gesamte Toolchain

Einheitliche Basis für AlwaysOnSetup, sqmSQLTool, SQLMigration

Links & Ressourcen

GitHubgithub.com/JankeUwe/SQLSetupTool
QuellstrukturNew-SqlSourceStructure.ps1
Websitewww.powershelldba.de

Nächste Präsentationen

sqmSQLTool — DBA-Toolbox (Monitoring, Backup, Analyse) AlwaysOnSetup — Availability Groups automatisch konfigurieren DeadlockCollector — Automatische Deadlock-Erfassung ReportDeploymentTool — SSRS Massendeployment InplaceUpDate — In-Place SQL Server Upgrade