Créer des paquets WAPT de mises à jour Windows avec des .msu

Indice

Pré-requis : pour construire des paquets WAPT, l’environnement de développement WAPT doit être installé ;

Entre les sorties de Patch Tuesday, Microsoft peut publier des KB supplémentaires ou des mises à jour critiques qui devront être rapidement poussées sur les machines.

À cette fin, le WAPT fournit un modèle de paquet pour les fichiers *.msu.

Dans cet exemple, nous utilisons la KB4522355 téléchargée du site officiel Microsoft.

Créer un modèle de paquet MSU à partir de la console WAPT

  • créer un modèle de paquet WAPT à partir du fichier MSU téléchargé ;

    Dans la console WAPT, cliquez sur Outils ‣ Assistant de paquets ;

    Pyscripter - WAPT console window for creating a package template

    Pyscripter - Fenêtre de la console WAPT pour créer un modèle de paquet

  • sélectionnez le paquet MSU téléchargé et remplissez les champs requis ;

    Informations required for creating the package

    Informations requises pour la création du paquet MSU

  • cliquer sur Créer et éditer …. (recommandé) pour lancer la personnalisation du paquet ;

  • L’éditeur de code intégré se lance en utilisant le code source du modèle MSU prédéfini.

  • comme d’habitude avec les paquets WAPT, tester - assembler - signer - charger sur le dépôt - affecter aux hôtes et c’est fait !!

  • si le KB est groupé avec le Patch Tuesday suivant, vous pourrez sélectionner les hôtes sur lesquels le paquet a été appliqué et oublier le paquet KB sur les hôtes ;

Créer un modèle de paquet MSU en ligne de commande

  • lancer un utilitaire en ligne de commande Windows cmd.exe en tant qu”Administrateur Local ;

    Windows Command Line utility launched as Local Administrator

    Lancement de l’utilitaire de ligne de commande Windows en tant qu’administrateur local

  • instancier un paquet à partir du modèle MSU prédéfini ;

    wapt-get make-template c:\download\file.msu <yourprefix>-kb4522355
    
  • exemple avec KB4522355 :

    C:\WINDOWS\system32>wapt-get make-template C:\windows10.0-kb4522355-x64_af588d16a8fbb572b70c3b3bb34edee42d6a460b.msu tis-kb4522355
    Using config file: C:\Users\user-adm\AppData\Local\waptconsole\waptconsole.ini
    
    Template created. You can build the WAPT package by launching
      C:\Program Files (x86)\wapt\wapt-get.exe build-package c:\waptdev\tis-kb4522355-wapt
    
    You can build and upload the WAPT package by launching
      C:\Program Files (x86)\wapt\wapt-get.exe build-upload c:\waptdev\tis-kb4522355-wapt
    
  • L’IDE configuré dans votre console se lance, voici un exemple de code source du modèle MSU prédéfini:

    # -*- coding: utf-8 -*-
    from setuphelpers import *
    import re
    
    uninstallkey = []
    
    def is_kb_installed(hotfixid):
        installed_update = installed_windows_updates()
        if [kb for kb in installed_update if kb['HotFixID' ].upper() == hotfixid.upper()]:
            return True
        return False
    
    def waiting_for_reboot():
        # Query WUAU from the registry
        if reg_key_exists(HKEY_LOCAL_MACHINE,r"SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired") or \
            reg_key_exists(HKEY_LOCAL_MACHINE,r"SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending") or \
            reg_key_exists(HKEY_LOCAL_MACHINE,r'SOFTWARE\Microsoft\Updates\UpdateExeVolatile'):
            return True
        return False
    
    def install():
        kb_files = [
            'windows10.0-kb4522355-x64_af588d16a8fbb572b70c3b3bb34edee42d6a460b.msu',
            ]
        with EnsureWUAUServRunning():
          for kb_file in kb_files:
              kb_guess = re.findall(r'^.*-(KB.*)-',kb_file)
              if not kb_guess or not is_kb_installed(kb_guess[0]):
                  print('Installing {}'.format(kb_file))
                  run('wusa.exe "{}" /quiet /norestart'.format(kb_file),accept_returncodes=[0,3010,2359302,-2145124329],timeout=3600)
              else:
                  print('{} already installed'.format(kb_file))
    
          if waiting_for_reboot():
              print('A reboot is needed!')