Página 1 de 1

[RESUELTO] Definición de actualización de uso compartido de paquetes Microsoft Defender Zero Touch

Publicado: 30 de enero de 2025 - 16:41
por olaplanche
Buen día,

Ya existe un paquete en la tienda Wapt, pero lo modifiqué para que la actualización sea completamente automática gracias a la función de auditoría (eliminando así la necesidad de la función update_package). El objetivo es implementar la actualización lo más rápido posible y sin intervención humana.
El código probablemente esté desordenado; esta es la primera vez que manipulo fechas y horas :jajaja:

Prerrequisitos:

Cada agente WAPT buscará el binario mpam-fe.exe en su repositorio WAPT para evitar saturar el enlace de Internet.
En el servidor WAPT, deberá agregar, por ejemplo, la siguiente línea 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 resumen de lo que hace la auditoría de paquetes:

Se verifica comparando la fecha del binario disponible en el repositorio y el binario almacenado en caché en c:\windows\temp\mpam-fe.xe para ver si hay una nueva versión del binario disponible.
Si el binario aún no existe en "c:\windows\temp\mpam-fe.exe", falsifica la fecha para forzar la descarga.
Si la fecha es diferente, descarga el nuevo binario y luego verifica la firma del binario (debe ser de 'Microsoft Corporation').
Luego instala el nuevo binario.

Ahora solo queda configurar la frecuencia de la auditoría ;)

configuración.py:

Código: Seleccionar todo

# -*- 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')
Gracias a Simon por su ayuda para armar este paquete.

Re: Compartir la definición del paquete de actualización Microsoft Defender Zero Touch

Publicado: 7 de febrero de 2025 - 12:28 p. m.
por dcardon
Hola Olivier,

gracias por compartir :-) . Para tu información, actualmente estamos trabajando en la integración del protocolo de comunicación SOAP MS-WUSP entre el agente de Windows Update y un servidor WSUS en el agente y servidor WAPT. Microsoft ha proporcionado una implementación de referencia [1] en .NET que implementa este protocolo. Tiene en cuenta la actualización de las definiciones de Windows Defender. Así que es posible que pronto haya algunas características nuevas interesantes. :-)

Marco este tema como RESUELTO por ahora.

Saludos cordiales,

Denis

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