# PowerShell DSC: Deklarative Konfiguration für den Windows-Stack

TL;DR / Management Summary Desired State Configuration (DSC) ist das Windows-Pendant zu Ansible oder Puppet. Anstatt zu sagen, wie etwas installiert werden soll (imperativ), definieren wir, was der Zustand des Systems sein soll (deklarativ). Der lokale LCM (Local Configuration Manager) sorgt dafür, dass dieser Zustand erreicht und dauerhaft gehalten wird. Ein Senior Admin nutzt DSC, um “Gold-Images” (Artikel 422) lebendig zu halten und automatisiert Korrekturen vorzunehmen, wenn ein User etwas verstellt.


# 1. Einführung & Architektur

Definition statt Scripting.

In einem normalen Skript prüfen Sie: if (Dienst läuft nicht) { Start-Dienst }. In DSC schreiben Sie: Service MySvc { State = 'Running' }.

# Die Kern-Komponenten

  1. Resources: Die Bausteine (Dateien, Dienste, Registry, Pakete).
  2. Configuration: Das PowerShell-Skript, das die Ressourcen bündelt.
  3. MOF (Managed Object Format): Die kompilierte Datei, die der Kernel versteht.
  4. LCM (Local Configuration Manager): Die Engine auf dem Client, die die MOF-Datei einliest und überwacht.

# Architektur-Übersicht (Mermaid)

graph TD
    ADMIN[Admin / VS Code] -->|Write PS Script| CONFIG[DSC Configuration]
    CONFIG -->|Compile| MOF[MOF File]
    MOF -->|Push / Pull| LCM[Local Configuration Manager]
    LCM -->|Execute| RES[Resources: File, Reg, Svc]
    RES -->|Check & Fix| OS[Windows System]
    OS -->|Drift?| LCM

# 2. DSC in der Praxis

Die erste Konfiguration.

# Beispiel: Standard-Webserver Setup

Configuration MyWebConfig {
    Import-DscResource -ModuleName PSDesiredStateConfiguration
    
    Node "localhost" {
        # Feature sicherstellen
        WindowsFeature IIS {
            Ensure = "Present"
            Name   = "Web-Server"
        }
        
        # Willkommens-Datei anlegen
        File WelcomePage {
            Ensure  = "Present"
            Content = "Willkommen im Enterprise-Wiki"
            DestinationPath = "C:\inetpub\wwwroot\index.html"
        }
    }
}

# 1. Konfiguration laden
MyWebConfig
# 2. MOF anwenden
Start-DscConfiguration -Path .\MyWebConfig -Wait -Verbose

# 3. Deep Dive: Der LCM (Local Configuration Manager)

Das Gehirn des Clients.

Sie steuern den LCM über das [DSCLocalConfigurationManager()] Attribut.

# Konfigurations-Modi


# 4. Day-2 Operations: Pull-Server vs. Push

Skalierung auf 500+ Clients.

  1. Push: Der Admin sendet die MOF-Datei aktiv an den Client. Gut für Ad-hoc Änderungen.
  2. Pull: Der Client fragt regelmäßig bei einem zentralen Webserver nach: “Gibt es eine neue Konfiguration für mich?”. Ideal für große, verteilte Umgebungen.

# 5. Troubleshooting & “War Stories”

Wenn der Soll-Zustand nicht erreicht wird.

# Top 3 Fehlerbilder

  1. Symptom: Start-DscConfiguration schlägt fehl mit “The system cannot find the file specified”.

    • Ursache: Die benötigte DSC-Resource (Modul) ist auf dem Ziel-PC nicht installiert.
    • Lösung: Module via Save-Module auf einen Share legen und im Skript verteilen.
  2. Symptom: Endloser “Pending” Status.

    • Lösung: Remove-DscConfigurationDocument -Stage Pending und Neustart des LCM-Dienstes.
  3. Symptom: Hohe CPU-Last durch WmiPrvSE.exe.

    • Ursache: Zu viele komplexe Datei-Checks (Checksummen) in der GPO.
    • Lösung: Validate Intervall im LCM erhöhen.

# “War Story”: Der Kampf gegen die Schatten-IT

In einer Design-Abteilung installierten User ständig lokale Tools, die den Virenscanner störten. Die Lösung: Wir definierten einen DSC-Zustand für den Ordner C:\Program Files. Jede Datei, die nicht in unserer Master-Liste stand, wurde vom LCM alle 15 Minuten gelöscht (Ensure = 'Absent'). Ergebnis: Nach drei Tagen gaben die User auf und nutzten nur noch die vom Software-Center bereitgestellten Tools. DSC war der effektivste “Hausmeister”, den wir je hatten.


# 6. Monitoring & Reporting

Compliance tracken.

# DSC Reporting via PowerShell

# Zeigt an, ob der Client aktuell 'InDesiredState' ist
Get-DscConfigurationStatus

# 7. Fazit & Empfehlung

DSC ist die Basis für modernen Infrastructure as Code (IaC) unter Windows.


# Anhang: Cheatsheet

Aufgabe Befehl
LCM Status Get-DscLocalConfigurationManager
Erzwungener Check Update-DscConfiguration -Wait
Ressourcen suchen Find-DscResource
Testen (ohne Fix) Test-DscConfiguration

# Referenzen