Seite 1 von 1

[GELÖST] Updatedefinition für die Paketfreigabe: Microsoft Defender Zero Touch

Veröffentlicht: 30. Januar 2025 – 16:41 Uhr
von olaplanche
Guten Morgen,

Im Wapt-Store existiert bereits ein Paket, das ich jedoch so modifiziert habe, dass das Update dank der Audit-Funktion vollautomatisch erfolgt (wodurch die Funktion `update_package` überflüssig wird). Ziel ist es, das Update so schnell wie möglich und ohne menschliches Eingreifen bereitzustellen.
Der Code ist wahrscheinlich unübersichtlich; ich manipulte zum ersten Mal Datum und Uhrzeit :Lol:

Voraussetzungen:

Jeder WAPT-Agent sucht in seinem WAPT-Repository nach der Binärdatei mpam-fe.exe, um eine Überlastung der Internetverbindung zu vermeiden.
Auf dem WAPT-Server müssen Sie daher beispielsweise die folgende Zeile in die Crontab-Datei einfügen:
00 20 * * * wget --user-agent="Mozilla" -O /var/www/waptwua/mpam-fe.exe 'https://go.microsoft.com/fwlink/?LinkID=121721&arch=x64'
Eine kurze Zusammenfassung dessen, was die Paketprüfung umfasst:

Es prüft, ob eine neue Version der Binärdatei verfügbar ist, indem es das Datum der im Repository verfügbaren Binärdatei mit dem Datum der in c:\windows\temp\mpam-fe.xe zwischengespeicherten Binärdatei vergleicht.
Falls die Binärdatei noch nicht unter "c:\windows\temp\mpam-fe.exe" existiert, wird das Datum gefälscht, um den Download zu erzwingen.
Wenn das Datum abweicht, lädt es die neue Binärdatei herunter und überprüft dann die Signatur der Binärdatei (sie muss von der 'Microsoft Corporation' stammen).
Dann installiert er die neue Binärdatei.

Jetzt muss nur noch die Prüfhäufigkeit konfiguriert werden ;)

setup.py:

Code: Alle auswählen

# -*- coding: utf-8 -*-
from setuphelpers import *
import requests
import os
from datetime import datetime, timedelta
import time
import waptlicences

r"""
Usable WAPT package functions: install(), uninstall(), session_setup(), audit(), update_package()

"""
# Declaring global variables - Warnings: 1) WAPT context is only available in package functions; 2) Global variables are not persistent between calls


def install():
    pass

def audit():
    # Declaring local variables
    osversion = get_os_version()
    repo_url = [r for r in WAPT.repositories if r.name == 'wapt'][0].repo_url
    repo_headers = WAPT.waptserver.head('waptwua/mpam-fe.exe')
    repo_last_modified = repo_headers.get('last-modified')
    repo_last_modified_pattern = "%a, %d %b %Y %H:%M:%S %Z"
    repo_last_modified_date = datetime.strptime(repo_last_modified, repo_last_modified_pattern)
    repo_last_modified_date_loc = repo_last_modified_date + timedelta(hours=1)
    if isfile(r'c:\windows\temp\mpam-fe.exe') :
        file_modTimesinceEpoc = os.path.getmtime(r'c:\windows\temp\mpam-fe.exe')
    else :
        # fake modification time if no bin
        file_modTimesinceEpoc =  int(float('1002387810.4883926'))
    file_modificationTime_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(file_modTimesinceEpoc))
    file_modificationTime_date = datetime.strptime(file_modificationTime_str, '%Y-%m-%d %H:%M:%S')

    # Downloading new bin
    if repo_last_modified_date_loc != file_modificationTime_date :
        with WAPT.waptserver.get_requests_session() as session:
            wget("%swua/mpam-fe.exe" % repo_url, r'c:\windows\temp\mpam-fe.exe', requests_session=session)

    # Check signature bin
    expected_issuer = 'Microsoft Corporation'
    sign_name = waptlicences.check_msi_signature(r'c:\windows\temp\mpam-fe.exe')[0]
    if sign_name != expected_issuer:
        error('Bad issuer %s != %s ' % (sign_name,expected_issuer))

    # Installing bin
    versionfile = get_file_properties(r'c:\windows\temp\mpam-fe.exe')['ProductVersion']

    if get_windows_defender_version() < versionfile:
        run(r'c:\windows\temp\mpam-fe.exe /s')
    if get_windows_defender_version() < versionfile:
        error('AntivirusSignatureVersion not in %s' % versionfile)
    print(r'OK: Definition Version is %s' % versionfile)
    return "OK"
                
def get_windows_defender_version():
    for i in get_antivirus_info():
        if not i["name"] == "Windows Defender":
            continue
        return Version(i['AntivirusSignatureVersion'])
    return Version('0')
Vielen Dank an Simon für seine Hilfe bei der Zusammenstellung dieses Pakets.

Betreff: Teilen der Updatepaketdefinition Microsoft Defender Zero Touch

Veröffentlicht: 7. Februar 2025 - 12:28 Uhr
von dcardon
Hallo Olivier,

danke fürs Teilen :-) . Zur Information: Wir arbeiten aktuell an der Integration des SOAP-MS-WUSP-Kommunikationsprotokolls zwischen dem Windows Update-Agenten und einem WSUS-Server in den WAPT-Agenten und -Server. Microsoft hat eine Referenzimplementierung [1] in .NET bereitgestellt, die dieses Protokoll implementiert. Dabei wird die Aktualisierung der Windows Defender-Definitionen berücksichtigt. Es könnten also bald einige interessante neue Funktionen verfügbar sein. :-)

Ich markiere dieses Thema vorerst als „GELÖST“.

Viele Grüße,

Denis

[1] https://github.com/microsoft/update-server-server-sync/