Page 1 sur 1

[RESOLU] Partage paquet mise à jour Definition Microsoft Defender Zero Touch

Posté : 30 janv. 2025 - 16:41
par olaplanche
Bonjour,

Il existe déjà un paquet sur le store wapt, mais je l'ai modifié afin que la mise à jour se fasse de manière totalement autonome grâce à la fonction audit (pas besoin de la fonction update_package du coup). L'objectif étant de déployer la mise à jour le plus rapidement possible et sans intervention humaine.
Le code est sans doute cracra, c'est une première pour moi la manipulation de date/heure :lol:

Prérequis :

Chaque agent WAPT va chercher le binaire mpam-fe.exe sur son repo WAPT pour ne pas saturer le lien internet.
Sur le serveur WAPT, il faut donc ajouter par exemple la ligne suivante à crontab :
00 20 * * * wget --user-agent="Mozilla" -O /var/www/waptwua/mpam-fe.exe 'https://go.microsoft.com/fwlink/?LinkID=121721&arch=x64'
Petit résumé de ce que fait l'audit du paquet:

Il vérifie en comparant la date du binaire dispo sur le dépôt et le binaire en cache dans c:\windows\temp\mpam-fe.xe si il y a une nouvelle version du binaire disponible.
Si le binaire n'existe pas encore dans "c:\windows\temp\mpam-fe.exe", il fake la date afin de forcer le téléchargement.
Si la date est différente il télécharge le nouveau binaire puis vérifie la signature du binaire (elle doit être de 'Microsoft Corporation').
Puis il installe le nouveau binaire.

Y plus qu'à paramétrer la fréquence de l'audit ;)

setup.py :

Code : Tout sélectionner

# -*- 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')
Merci à Simon pour l'aide à la réalisation de ce paquet.

Re: Partage paquet mise à jour Definition Microsoft Defender Zero Touch

Posté : 07 févr. 2025 - 12:28
par dcardon
Bonjour Olivier,

merci pour le partage :-) . Pour info, nous sommes entrain de travailler sur un l'intégration du protocole SOAP MS-WUSP de communication entre l'agent Windows Update et un serveur WSUS dans l'agent et le serveur WAPT. Microsoft a fournit une implémentation de référence [1] en dotnet qui implémente ce protocole. Ca prend en compte la mise à jour des définitions Windows Defender. Donc il y a peut être des nouvelles choses intéressantes qui vont arriver bientôt :-)

Je passe le topic en RESOLU pour l'instant.

Cordialement,

Denis

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