Veröffentlicht:

BitLocker in Ninja One automatisieren – PowerShell-Skript für Verschlüsselung & Reporting

.

BitLocker in Ninja One automatisieren – PowerShell-Skript für Verschlüsselung & Reporting Photo by Marco Griep

Geschrieben von Marco Griep


Die Verschlüsselung von Workstations ist ein zentraler Baustein der IT-Sicherheit – besonders in Unternehmen mit sensiblen Daten. BitLocker von Microsoft bietet hier als Windows Boardmittel eine robuste Lösung, doch die manuelle Aktivierung für jede Workstation ist zeitaufwendig. Besonders wenn dies nachträglich und Unternehmensweit sein soll. In diesem Artikel zeige ich dir, wie du BitLocker mit PowerShell und Ninja One automatisierst – inkl. Key-Reporting und Status-Tracking für maximale Kontrolle.

Wann dieser Artikel für dich eventuell relevant ist:

  • Du nutzt Ninja One für dein IT-Management.
  • Du willst BitLocker zentral aktivieren, ohne jeden Rechner manuell zu konfigurieren.
  • Du möchtest die Sicherheit erhöhen, ohne stunden lange an jedem Gerät herumzuschrauben.
  • Du willst den Überblick über den Verschlüsselungsstatus und die Recovery-Keys behalten.
  • Du brauchst automatisierte Reports über den Verschlüsselungsstatus.

Du möchtest den Artikel lieber als Video schauen?

Dann findest du die Anleitung auch auf Youtube


1. Voraussetzungen & Vorbereitung

Bevor du startest, benötigst du:

  • Ninja One-Konto mit Admin-Rechten
  • PowerShell 5.1 oder höher auf den Ziel-Workstations
  • BitLocker-fähige Hardware (TPM 2.0 empfohlen)


2. Benutzerdefinierte Felder in Ninja One einrichten

Erstelle in Ninja One folgende Custom Fields. Diese sind notwendig damit das PowerShell-Skript die BitLocker-Statusinformationen korrekt in Ninja One speichern kann:

Sätmliche Felder sind unter Geräte -> Benutzerdefinierte Felder des Gerätes zu konfigurieren.

Ninja One Custom Fields für BitLocker

Übersicht der benutzerdefinierten Felder:

Benutzerdefinierte Felder
FeldnameTypBeschreibung
bitlockerisactiveKontrollkästenWenn "True", ist BitLocker aktiviert
bitlockerRecoveryKeyTextSpeichert den Recovery-Key

🔹 Tipp:
Nutze Ninja One-Automations, um bei Statusänderungen (z. B. "Deaktiviert"). Benachrichtigungen an dein IT-Team zu senden. Später erstellen wir eine bedingte Automatisierung um alle Geräte zu verschlüsseln, die noch nicht verschlüsselt sind.

3. PowerShell-Skript zur BitLocker-Überprüfung

Das folgende PowerShell-Skript prüft ob Bitlocker aktiviert und die Festplatte auch verschlüsselt ist. Dies ist unser Kontrollmechanismus und Steuerungsmöglichkeit für die bedingte Automatisierung.

Erstellen Sie dieses Skript in Ninja One als neues Skript und weisen Sie es einer bedingten Automatisierung zu, die auf Workstations abzielt, bei denen das benutzerdefinierte Feld bitlockerisactive auf "False" gesetzt ist.

PowerShell-Skript: BitLocker-Status überprüfen (Bitlocker is Active Query)

Ninja One PowerShell Skript für BitLocker is Active Query

$MountPoint = "C:"
$CustomField = "bitlockerisactive"
$NinjaCliPath = "C:\ProgramData\NinjaRMMAgent\ninjarmm-cli.exe"

function Log($msg) {
    Write-Output "$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") - $msg"
}
Log "Starte BitLocker Überprüfung für Laufwerk $MountPoint"
# BitLocker Status prüfen
$BL = Get-BitLockerVolume -MountPoint $MountPoint

# 1) Wenn BitLocker bereits geschützt ist
if ($BL.ProtectionStatus -eq "On" -and $BL.VolumeStatus -eq "FullyEncrypted") {
    Log "BitLocker ist bereits geschützt (ProtectionStatus = On)."

    & $NinjaCliPath set $CustomField "true"
}
else {
    Log "BitLocker ist nicht geschützt."
    & $NinjaCliPath set $CustomField "false"
}

Log "Script erfolgreich abgeschlossen."
exit 0

4. PowerShell-Skript zur BitLocker-Verschlüsslung

Das folgende PowerShell-Skript aktiviert BitLocker auf dem C-Laufwerk und speichert den Recovery-Key in einem benutzerdefinierten Feld.

PowerShell-Skript: BitLocker aktivieren und Recovery-Key speichern


$MountPoint = "C:"
$CustomField = "bitlockerRecoveryKey"
$NinjaCliPath = "C:\ProgramData\NinjaRMMAgent\ninjarmm-cli.exe"

function Log($msg) {
    Write-Output "$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") - $msg"
}

$hasError = $false

# BitLocker Status prüfen
$BL = Get-BitLockerVolume -MountPoint $MountPoint

# Funktion: RecoveryKey auslesen
function Get-RecoveryKey {
    param($BLVolume)

    return $BLVolume.KeyProtector |
        Where-Object { $_.KeyProtectorType -eq "RecoveryPassword" } |
        Select-Object -ExpandProperty RecoveryPassword
}

# 1) Wenn BitLocker bereits geschützt ist
if ($BL.ProtectionStatus -eq "On") {
    Log "BitLocker ist bereits geschützt (ProtectionStatus = On)."
}

# 2) Wenn Volume verschlüsselt, aber Schutz OFF
elseif ($BL.VolumeStatus -eq "FullyEncrypted" -and $BL.ProtectionStatus -eq "Off") {
    Log "Volume ist bereits verschlüsselt, ProtectionStatus ist OFF."

    # Prüfe KeyProtectors
    $hasTpm = $BL.KeyProtector | Where-Object { $_.KeyProtectorType -eq "Tpm" }
    $hasRecovery = $BL.KeyProtector | Where-Object { $_.KeyProtectorType -eq "RecoveryPassword" }

    try {
        # Wenn TPM fehlt, hinzufügen
        if (-not $hasTpm) {
            Log "TPM Protector fehlt. Füge TPM Protector hinzu..."
            Add-BitLockerKeyProtector -MountPoint $MountPoint -TpmProtector -ErrorAction Stop
        } else {
            Log "TPM Protector ist bereits vorhanden."
        }

        # Wenn Recovery fehlt, hinzufügen
        if (-not $hasRecovery) {
            Log "RecoveryPassword Protector fehlt. Füge RecoveryPassword hinzu..."
            Add-BitLockerKeyProtector -MountPoint $MountPoint -RecoveryPasswordProtector -ErrorAction Stop
        } else {
            Log "RecoveryPassword Protector ist bereits vorhanden."
        }
    }
    catch {
        Log "Fehler beim Hinzufügen von Key Protectors: $_"
        $hasError = $true
    }

    # Status neu laden
    $BL = Get-BitLockerVolume -MountPoint $MountPoint

    # 2a) Versuch Resume
    if (-not $hasError) {
        try {
            Log "Versuche Resume-BitLocker..."
            Resume-BitLocker -MountPoint $MountPoint -ErrorAction Stop

            Start-Sleep -Seconds 10
            $BL = Get-BitLockerVolume -MountPoint $MountPoint -ErrorAction Stop

            if ($BL.ProtectionStatus -eq "On") {
                Log "BitLocker Schutz erfolgreich aktiviert (Resume)."
            }
            else {
                throw "Resume hat ProtectionStatus nicht auf On gesetzt."
            }
        }
        catch {
            Log "Resume fehlgeschlagen: $_"
            $hasError = $true
        }
    }

    # 2b) Wenn Resume fehlschlägt, Versuch Enable (nur wenn nicht geschützt)
    if ($hasError -and $BL.ProtectionStatus -ne "On") {
        try {
            Log "Versuche Enable-BitLocker als Fallback..."
            Enable-BitLocker -MountPoint $MountPoint -ErrorAction Stop

            Start-Sleep -Seconds 10
            $BL = Get-BitLockerVolume -MountPoint $MountPoint -ErrorAction Stop

            if ($BL.ProtectionStatus -eq "On") {
                Log "BitLocker Schutz erfolgreich aktiviert (Enable Fallback)."
                $hasError = $false
            }
            else {
                throw "Enable hat ProtectionStatus nicht auf On gesetzt."
            }
        }
        catch {
            Log "Enable fehlgeschlagen: $_"
            $hasError = $true
        }
    }
}

# 3) Wenn nicht verschlüsselt -> Enable
else {
    Log "BitLocker ist nicht verschlüsselt. Aktiviere BitLocker..."

    try {
        # Key Protectors hinzufügen (falls fehlen)
        $hasTpm = $BL.KeyProtector | Where-Object { $_.KeyProtectorType -eq "Tpm" }
        $hasRecovery = $BL.KeyProtector | Where-Object { $_.KeyProtectorType -eq "RecoveryPassword" }

        if (-not $hasTpm) {
            Log "TPM Protector fehlt. Füge TPM Protector hinzu..."
            Add-BitLockerKeyProtector -MountPoint $MountPoint -TpmProtector -ErrorAction Stop
        }

        if (-not $hasRecovery) {
            Log "RecoveryPassword Protector fehlt. Füge RecoveryPassword hinzu..."
            Add-BitLockerKeyProtector -MountPoint $MountPoint -RecoveryPasswordProtector -ErrorAction Stop
        }

        Enable-BitLocker -MountPoint $MountPoint `
            -EncryptionMethod XtsAes128 `
            -RecoveryPasswordProtector `
            -SkipHardwareTest `
            -ErrorAction Stop

        Start-Sleep -Seconds 10
        $BL = Get-BitLockerVolume -MountPoint $MountPoint -ErrorAction Stop

        if ($BL.ProtectionStatus -ne "On") {
            throw "Schutz konnte nicht aktiviert werden."
        }

        Log "BitLocker Schutz erfolgreich aktiviert (Enable)."
    }
    catch {
        Log "BitLocker Aktivierung fehlgeschlagen: $_"
        $hasError = $true
    }
}

# 4) Recovery Key auslesen (immer, wenn vorhanden)
$BL = Get-BitLockerVolume -MountPoint $MountPoint
$RecoveryKey = Get-RecoveryKey -BLVolume $BL

if (-not $RecoveryKey) {
    Log "Kein Recovery Key gefunden."
    $hasError = $true
} else {
    # 5) Custom Field schreiben
    try {
        & $NinjaCliPath set $CustomField $RecoveryKey
        Log "Recovery Key in Custom Field '$CustomField' geschrieben."
    }
    catch {
        Log "Custom Field nicht verfügbar oder Fehler beim Schreiben: $_"
        $hasError = $true
    }
}

# 6) Exit Code
if ($hasError) {
    Log "Script beendet mit Fehlern."
    exit 1
}

Log "Script erfolgreich abgeschlossen."

5. Häufige Fehler & Lösungen

Fehlerbehebung
FehlerUrsacheLösung
BitLocker lässt sich nicht aktivierenTPM nicht aktiviertTPM im BIOS aktivieren
Skript bricht mit API-Fehler abFalsche Berechtigungen.Im benutzerdefinierten fehlen Berechtigungen.
Recovery-Key wird nicht gespeichertCustom Field existiert nichtFeld in Ninja One anlegen

🔗 Weiterführende Links