Ein einzelnes kompromittiertes Passwort – und ein Angreifer bewegt sich lateral durch das gesamte Netzwerk. Genau das passiert in Umgebungen, wo alle Windows-Clients dasselbe lokale Adminpasswort haben. Windows LAPS löst dieses Problem: automatische Passwortrotation, sichere Speicherung, vollständiges Auditing.

Dieser Post zeigt den kompletten LAPS-Rollout – für reine Entra-ID-Umgebungen via Intune und für On-Premises via GPO.


Das Problem mit lokalen Adminkonten

Das lokale Administratorkonto (.\Administrator) ist auf jedem Windows-System vorhanden – selbst wenn Benutzer über Domänenkonten arbeiten. In der Praxis sieht die Realität oft so aus:

Wer ein einziges Gerät kompromittiert, hat damit Zugang zu allen. Pass-the-Hash und Lateral Movement sind trivial.


Windows LAPS vs. Legacy LAPS

Es gibt zwei LAPS-Varianten, die du kennen musst:

Windows LAPS (neu)Legacy LAPS (alt)
Verfügbar abWindows 11 22H2 / Server 2022 (April 2023 Update)Windows Vista+ (via MSI)
SpeicherortEntra ID oder Active DirectoryNur Active Directory
VerschlüsselungJa (in AD)Nein (Klartext in AD)
Intune-SupportJa, nativNur via Legacy-Profil
PowerShell-ModulLAPS (built-in)AdmPwd.PS

Empfehlung: Nutze Windows LAPS. Legacy LAPS speichert Passwörter unverschlüsselt im AD-Attribut ms-Mcs-AdmPwd – das ist 2026 keine akzeptable Lösung mehr.

Voraussetzung: April 2023 Cumulative Update oder neuer auf allen Windows-Geräten.


Option 1: LAPS mit Entra ID + Intune (Cloud-Only)

Entra ID konfigurieren

Zuerst LAPS in Entra ID aktivieren:

Entra Admin Center → Geräte → Geräteeinstellungen → „Lokale Administratorpasswort-Lösung aktivieren” → Ein

Oder per Graph API:

Connect-MgGraph -Scopes "Policy.ReadWrite.DeviceConfiguration"

$params = @{
    localAdminPassword = @{
        isEnabled = $true
    }
}

Update-MgPolicyDeviceRegistrationPolicy -BodyParameter $params

Intune-Richtlinie erstellen

Im Intune Admin Center → Endpunktsicherheit → Kontoverwaltung → „Lokales Administratorkennwort” → Richtlinie erstellen.

Oder per PowerShell über Graph:

Connect-MgGraph -Scopes "DeviceManagementConfiguration.ReadWrite.All"

$policy = @{
    name        = "LAPS - Alle Windows Clients"
    description = "Automatische Rotation lokaler Adminpasswörter via Windows LAPS"
    platforms   = "windows10"
    technologies = "mdm"
    settings    = @(
        @{
            "@odata.type" = "#microsoft.graph.deviceManagementConfigurationSetting"
            settingInstance = @{
                "@odata.type" = "#microsoft.graph.deviceManagementConfigurationChoiceSettingInstance"
                settingDefinitionId = "device_vendor_msft_laps_policies_backupdirectory"
                choiceSettingValue = @{
                    value = "device_vendor_msft_laps_policies_backupdirectory_1"  # Entra ID
                }
            }
        },
        @{
            "@odata.type" = "#microsoft.graph.deviceManagementConfigurationSetting"
            settingInstance = @{
                "@odata.type" = "#microsoft.graph.deviceManagementConfigurationSimpleSettingInstance"
                settingDefinitionId = "device_vendor_msft_laps_policies_passwordagelimitdays"
                simpleSettingValue = @{
                    "@odata.type" = "#microsoft.graph.deviceManagementConfigurationIntegerSettingValue"
                    value         = 14
                }
            }
        }
    )
} | ConvertTo-Json -Depth 10

Invoke-MgGraphRequest -Method POST `
    -Uri "https://graph.microsoft.com/beta/deviceManagement/configurationPolicies" `
    -Body $policy `
    -ContentType "application/json"

Empfohlene Einstellungen in der Richtlinie:

EinstellungEmpfohlener Wert
SicherungsverzeichnisAzure Active Directory
Kennwortalter (Tage)14
Kennwortlänge20
KennwortkomplexitätGroß- + Kleinbuchstaben + Ziffern + Sonderzeichen
KontoverwaltungLokaler integrierter Administratorname
Nach Ablauf rotierenJa

Option 2: LAPS mit Active Directory (On-Premises / Hybrid)

Schema erweitern

Einmalig auf einem DC mit Enterprise-Admin-Rechten:

# Windows LAPS Schema-Erweiterung
Update-LapsADSchema -Verbose

Das erstellt die neuen AD-Attribute:

Berechtigungen setzen

Computer-Objekte müssen ihre eigenen LAPS-Attribute schreiben dürfen:

# Für alle Computer in einer OU
Set-LapsADComputerSelfPermission -Identity "OU=Clients,DC=contoso,DC=local"

# Admins Leserechte geben
Set-LapsADReadPasswordPermission `
    -Identity "OU=Clients,DC=contoso,DC=local" `
    -AllowedPrincipals "CONTOSO\IT-Admins"

GPO konfigurieren

Gruppenrichtlinienverwaltung → neue GPO für die Client-OU:

Computerkonfiguration → Administrative Vorlagen → System → LAPS

Wichtigste Einstellungen:


Passwörter auslesen

Entra-ID-Passwort abrufen

# Modul installieren (falls nicht vorhanden)
Install-Module Microsoft.Graph -Scope CurrentUser

Connect-MgGraph -Scopes "DeviceLocalCredential.Read.All"

# Passwort für ein bestimmtes Gerät
Get-LapsAADPassword -DeviceIds "WORKSTATION01" -IncludePasswords -AsPlainText

Ausgabe:

DeviceName  : WORKSTATION01
DeviceId    : a1b2c3d4-...
Account     : Administrator
Password    : Xk#9mQpL2$vNwR7e
PasswordExpirationTime : 07.04.2026 08:42:13

AD-Passwort abrufen

# Passwort im Klartext anzeigen
Get-LapsADPassword -Identity "WORKSTATION01" -AsPlainText

# Mit Ablaufzeit
Get-LapsADPassword -Identity "WORKSTATION01" -AsPlainText |
    Select-Object ComputerName, Account, Password, PasswordExpirationTime

Passwort sofort rotieren

Nach einem Incident oder wenn du ein Passwort eingesehen hast, direkt rotieren:

# Entra ID - Gerät zur sofortigen Rotation zwingen
Set-LapsAADResetPassword -DeviceIds "WORKSTATION01"

# Active Directory
Reset-LapsPassword -Identity "WORKSTATION01"
Invoke-LapsPolicyProcessing  # Auf dem betroffenen Client ausführen

LAPS-Status überwachen

Welche Geräte haben kein gültiges LAPS-Passwort?

Connect-MgGraph -Scopes "Device.Read.All", "DeviceLocalCredential.Read.All"

$devices = Get-MgDevice -All -Filter "operatingSystem eq 'Windows'"

$lapsStatus = foreach ($device in $devices) {
    try {
        $laps = Get-LapsAADPassword -DeviceIds $device.Id -ErrorAction Stop
        [PSCustomObject]@{
            Gerät        = $device.DisplayName
            LAPS         = "Aktiv"
            Läuft_ab     = $laps.PasswordExpirationTime
            DaysLeft     = ($laps.PasswordExpirationTime - (Get-Date)).Days
        }
    } catch {
        [PSCustomObject]@{
            Gerät        = $device.DisplayName
            LAPS         = "KEIN PASSWORT"
            Läuft_ab     = $null
            DaysLeft     = $null
        }
    }
}

$lapsStatus | Sort-Object LAPS, DaysLeft | Format-Table -AutoSize

Abgelaufene Passwörter auf einen Blick

# AD: Alle Computer mit abgelaufenem oder fehlendem LAPS-Passwort
$threshold = (Get-Date).AddDays(3)

Get-ADComputer -Filter {Enabled -eq $true} -Properties msLAPS-PasswordExpirationTime |
    ForEach-Object {
        $expiry = if ($_."msLAPS-PasswordExpirationTime") {
            [datetime]::FromFileTime($_."msLAPS-PasswordExpirationTime")
        } else { $null }

        [PSCustomObject]@{
            Computer = $_.Name
            LAPS_Ablauf = $expiry
            Status = if (-not $expiry)             { "FEHLT" }
                     elseif ($expiry -lt (Get-Date)) { "ABGELAUFEN" }
                     elseif ($expiry -lt $threshold) { "LÄUFT BALD AB" }
                     else                            { "OK" }
        }
    } |
    Where-Object { $_.Status -ne "OK" } |
    Sort-Object LAPS_Ablauf |
    Format-Table -AutoSize

Zugriffsprotokoll auswerten

Jeder LAPS-Abruf wird in Entra ID bzw. Active Directory protokolliert. Das ist wichtig – wer hat wann welches Passwort eingesehen?

# Entra ID Audit-Log: LAPS-Passwort-Abrufe der letzten 7 Tage
Connect-MgGraph -Scopes "AuditLog.Read.All"

$since = (Get-Date).AddDays(-7).ToString("yyyy-MM-ddTHH:mm:ssZ")

Get-MgAuditLogDirectoryAudit `
    -Filter "activityDisplayName eq 'Recover device local administrator password' and activityDateTime ge $since" |
    Select-Object ActivityDateTime,
        @{N="Admin";    E={ $_.InitiatedBy.User.UserPrincipalName }},
        @{N="Gerät";    E={ ($_.TargetResources | Where-Object Type -eq "Device").DisplayName }},
        Result |
    Sort-Object ActivityDateTime -Descending |
    Format-Table -AutoSize

Häufige Fallstricke

1. Altes Legacy-LAPS parallel aktiv Wenn Legacy-LAPS und Windows LAPS gleichzeitig konfiguriert sind, kann es zu Konflikten kommen. Legacy-LAPS deinstallieren oder die GPO-Einstellung explizit deaktivieren, bevor Windows LAPS übernimmt.

2. April-2023-Patch fehlt Windows LAPS ist zwar im OS integriert, aber auf Geräten ohne das April-2023-CU inaktiv. Intune-Berichte zeigen diese Geräte als „nicht konfiguriert” – einfach nicht konfigurierbar.

# Prüfen ob Windows LAPS aktiv ist (lokal auf dem Client)
Get-LapsStatistics

3. Lokales Konto hat anderen Namen Nicht jede Umgebung nutzt Administrator als lokalen Admin-Account. LAPS kann alternativ das Konto über den SID (S-1-5-21-...-500) ansprechen – zuverlässiger als der Name.

4. Break-Glass ohne LAPS Für den Notfall sollte mindestens ein Gerät (z. B. ein Jumphost) ein bekanntes, dokumentiertes lokales Passwort haben – außerhalb von LAPS, sicher in einem PAM-System oder Vault gespeichert.


Best Practices Checkliste

Bevor du LAPS für produktiv erklärst:


Fazit

Windows LAPS ist keine optionale Härtungsmaßnahme – es ist ein Minimum. Lateral Movement durch shared local admin credentials ist einer der ältesten Angriffsvektoren in Windows-Umgebungen, und LAPS eliminiert ihn vollständig.

Der Rollout ist in einer Intune-verwalteten Umgebung in unter einer Stunde erledigt. Der Aufwand steht in keinem Verhältnis zum Sicherheitsgewinn.

Sofort starten:

# Status prüfen: Hat LAPS auf diesem Gerät schon geschrieben?
Get-LapsStatistics

# Wenn leer: Richtlinienverarbeitung anstoßen
Invoke-LapsPolicyProcessing

Wenn Get-LapsStatistics ein Passwort und einen Ablaufzeitpunkt zurückliefert, läuft LAPS. Wenn nicht – hier anfangen.


Fragen oder eigene LAPS-Setups? Schreib mir: info@westmeier.cloud