Pagina 1 di 1

[RISOLTO] Definizione di aggiornamento della condivisione dei pacchetti Microsoft Defender Zero Touch

Pubblicato: 30 gennaio 2025 - 16:41
di olaplanche
Buongiorno,

Un pacchetto esiste già sullo store Wapt, ma l'ho modificato in modo che l'aggiornamento sia completamente automatico grazie alla funzione di audit (eliminando la necessità della funzione update_package). L'obiettivo è distribuire l'aggiornamento il più rapidamente possibile e senza intervento umano.
Probabilmente il codice è confuso: è la prima volta che manipolo date e orari :lol:

Prerequisiti:

Ogni agente WAPT cercherà il binario mpam-fe.exe nel proprio repository WAPT per evitare di saturare il collegamento Internet.
Sul server WAPT, è quindi necessario aggiungere, ad esempio, la seguente riga a crontab:
00 20 * * * wget --user-agent="Mozilla" -O /var/www/waptwua/mpam-fe.exe 'https://go.microsoft.com/fwlink/?LinkID=121721&arch=x64'
Un breve riassunto di cosa fa l'audit del pacchetto:

Verifica confrontando la data del binario disponibile nel repository e il binario memorizzato nella cache in c:\windows\temp\mpam-fe.xe per vedere se è disponibile una nuova versione del binario.
Se il file binario non esiste ancora in "c:\windows\temp\mpam-fe.exe", falsifica la data per forzare il download.
Se la data è diversa, scarica il nuovo binario e poi controlla la firma del binario (deve provenire da 'Microsoft Corporation').
Quindi installa il nuovo binario.

Non resta che configurare la frequenza di controllo ;)

setup.py:

Codice: Seleziona tutto

# -*- 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')
Grazie a Simon per il suo aiuto nel mettere insieme questo pacchetto.

Re: Condivisione della definizione del pacchetto di aggiornamento Microsoft Defender Zero Touch

Pubblicato: 7 febbraio 2025 - 12:28
di dcardon
Ciao Olivier,

grazie per la condivisione :-) . Per tua informazione, stiamo attualmente lavorando all'integrazione del protocollo di comunicazione SOAP MS-WUSP tra l'agente di Windows Update e un server WSUS nell'agente e nel server WAPT. Microsoft ha fornito un'implementazione di riferimento [1] in .NET che implementa questo protocollo. Tiene conto dell'aggiornamento delle definizioni di Windows Defender. Quindi potrebbero esserci alcune nuove funzionalità interessanti in arrivo a breve. :-)

Per ora contrassegno questo argomento come RISOLTO.

Cordiali saluti,

Denis

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