Kurznotiz: Defender Updates via Taskplaner

Je nach Richtlinie und Konfiguration der Umgebung kann es erforderlich sein, Defender-Updates schneller zu verteilen. Im Moment habe ich für eine Serverlandschaft und einen Terminalserver leider WSUS an der Backe, um ein Problem mit TiWorker.exe zu lösen. Dessen Richtlinien kollidieren mit der automatischen Bereitstellung von Signaturupdates.

Sollte die Richtlinie „Keine Verbindung mit Windows Update-Internetadressen herstellen“ nicht gesetzt sein, kannst Du mit nachfolgendem Script Deine Defender-Updates schnell über den Task-Scheduler ausrollen. Ausserdem bekommst Du eine Mail-Benachrichtigung, sofern dies erfolgreich oder eben nicht erfolgreich gewesen ist.

Anbei mein Vorschlag:

# --- Konfiguration ---
$SMTPServer = "mx.domain.tld"      # SMTP-Server
$SMTPPort   = 587
$MailFrom   = "Absender.email@domain.tld"
$MailTo     = "report.email@domain.tld"
$MailUser   = "smtpuser"            # dein Mail-Login
$MailPass   = "smtppass"            # dein Mail-Kennwort (ggf. mit pscredentials erweitern)

# --- Funktion: Mailversand ---
function Send-UpdateReportMail {
    param (
        [string]$Subject,
        [string]$Body
    )

    try {
        $securePass = ConvertTo-SecureString $MailPass -AsPlainText -Force
        $cred = New-Object System.Management.Automation.PSCredential ($MailUser, $securePass)

        Send-MailMessage -SmtpServer $SMTPServer -Port $SMTPPort `
            -UseSsl -Credential $cred -From $MailFrom -To $MailTo `
            -Subject $Subject -Body $Body -ErrorAction Stop
    }
    catch {
        Write-Error "Fehler beim Senden der E-Mail: $($_.Exception.Message)"
    }
}

# --- Rechnername erfassen ---
$hostname = $env:COMPUTERNAME

# --- Update-Vorgang ---
try {
    # 1. Defender-Status VOR dem Update erfassen
    Write-Host "Erfasse Defender-Status vor dem Update..."
    $defenderStatusBefore = Get-MpComputerStatus | Select-Object AMEngineVersion, AMProductVersion, AMServiceVersion, AntispywareSignatureVersion, AntivirusSignatureVersion

    # 2. Defender Signaturen direkt von Microsoft aktualisieren
    Write-Host "Starte Update der Defender-Signaturen von Microsoft-Servern..."
    Update-MpSignature -UpdateSource MicrosoftUpdateServer -ErrorAction Stop
    Write-Host "Update-Befehl ausgeführt."

    # 3. Defender-Status NACH dem Update erfassen
    Write-Host "Erfasse Defender-Status nach dem Update..."
    $defenderStatusAfter = Get-MpComputerStatus | Select-Object AMEngineVersion, AMProductVersion, AMServiceVersion, AntispywareSignatureVersion, AntivirusSignatureVersion

    # 4. E-Mail-Bericht erstellen und vergleichen
    $bodyLines = @()
    $bodyLines += "[{0}]`n" -f (Get-Date -Format 'yyyy-MM-dd HH:mm:ss')
    $bodyLines += "Ergebnis des Microsoft Defender Update-Vorgangs:`n"

    $propertiesToCompare = 'AMEngineVersion', 'AMProductVersion', 'AMServiceVersion', 'AntispywareSignatureVersion', 'AntivirusSignatureVersion'
    $updateDetected = $false

    foreach ($prop in $propertiesToCompare) {
        $beforeValue = $defenderStatusBefore.$prop
        $afterValue = $defenderStatusAfter.$prop

        if ($beforeValue -ne $afterValue) {
            $bodyLines += "- $prop`: $beforeValue --> $afterValue (Neu)"
            $updateDetected = $true
        } else {
            # *** HIER IST DIE ÄNDERUNG ***
            $bodyLines += "- $prop`: $beforeValue (Unveraendert)"
        }
    }
    
    $body = $bodyLines -join "`r`n"

    if ($updateDetected) {
        $subject = "$hostname - Defender: Signaturen erfolgreich aktualisiert"
    } else {
        $subject = "$hostname - Defender: Signaturen waren bereits aktuell"
    }

    # 5. E-Mail senden
    Write-Host "Sende E-Mail-Bericht..."
    Send-UpdateReportMail -Subject $subject -Body $body
}
catch {
    $err = $_.Exception.Message
    $subjectErr = "$hostname - Defender: FEHLER beim Update"
    $bodyErr = "[{0}]`n`nBeim Versuch, die Defender-Signaturen zu aktualisieren, ist ein Fehler aufgetreten:`n`n{1}" -f (Get-Date -Format 'yyyy-MM-dd HH:mm:ss'), $err
    
    Write-Host "Ein Fehler ist aufgetreten. Sende Fehlerbericht..."
    Send-UpdateReportMail -Subject $subjectErr -Body $bodyErr
}

Write-Host "Skriptausführung beendet."