3.1.2.1. Vérifier l’existence d’une clé de registre¶
Commande registry_readstring vérifie si la clé de registre {8A69D345-D564-463c-AFF1-A69D9E530F96} existe dans le chemin de registre SOFTWARE\Google\Update\Clients of HKEY_LOCAL_MACHINE.
3.1.2.2. Afficher la valeur d’une clé de registre¶
Commande registry_readstring lit la valeur {8A69D345-D564-463c-AFF1-A69D9E530F96} stockée dans le chemin du registre SOFTWARE\Google\Update\Clients of HKEY_LOCAL_MACHINE.
3.1.2.3. Modifier la valeur d’une clé de registre¶
Commande registry_setstring modifie la valeur de la clé de registre TOUVersion stockée dans le chemin d’accès au registre SOFTWARE\Microsoft\WindowsLive of HKEY_CURRENT_USER.
Avec WAPT setuphelper, il est possible de créer différents types de raccourcis.
3.1.3.1. Création d’un raccourci sur le bureau pour tous les utilisateurs¶
La commande create_desktop_shortcut crée le raccourci WAPT Console Management dans le répertoire C:NUsersNPublic pointant vers C:\Users\Public directory pointing to C:\ProgramFiles(x86)\wapt\waptconsole.exe; le raccourci est disponible pour tous les utilisateurs.
3.1.3.2. Suppression d’un raccourci sur le bureau pour tous les utilisateurs¶
Commande remove_desktop_shortcut supprime le raccourci WAPT Console Management du dossier C:\Users\Public ; le raccourci est supprimé pour tous les utilisateurs.
Si vous redémarrez l’installation à partir de PyScripter, vous remarquerez que le raccourci « tous les utilisateurs » a disparu.
3.1.3.3. Créer un raccourci de menu pour une application¶
La commande create_programs_menu_shortcut crée le raccourci WAPT Console Management dans le menu de démarrage pointant vers C:\ProgramFiles(x86)\wapt\waptconsole.exe; le raccourci est disponible pour tous les utilisateurs.
3.1.3.5. Création d’un raccourci sur le bureau pour un utilisateur connecté¶
Indication
Ces fonctions sont utilisées dans le contexte session_setup.
La commande create_user_desktop_shortcut crée le raccourci WAPT Console Management sur le bureau de l’utilisateur, pointant vers C:\ProgramFiles(x86)\wapt\waptconsole.exe.
3.1.3.7. Création d’un raccourci de menu vers une application pour un utilisateur spécifique¶
Indication
Ces fonctions sont utilisées dans le contexte session_setup.
La commande create_user_programs_menu_shortcut crée le raccourci WAPT Console Management dans le menu de démarrage de l’utilisateur pointant vers C:\ProgramFiles(x86)\wapt\waptconsole.exe.
La commande iswin64 vérifie que l’architecture du système est de 64bits.
ifiswin64():print('Pc x64')else:print('Pc not x64')
3.1.5.4. Vérification de la variable Program Files¶
programfiles;
print(programfiles())
programfiles32;
print(programfiles32())
programfiles64;
print(programfiles64())
Chaque commande renvoie un emplacement ProgramFiles différent.
Par exemple, la commande programfiles64 renvoie le répertoire Program Files natif, par exemple C:\ProgramFiles(x86) sur l’architecture win64 ou win32 et programfiles() renvoie le chemin du répertoire Program Files 32bit, par exemple ProgramsFiles(x86) sur l’architecture win64, et ProgramsFiles sur l’architecture win32.
Pour chaque élément de la liste retournée par installed_softwares contenant le mot-clé winscp.
Si la version est inférieure à la valeur de control.get_software_version.
Un message s’affiche pour indiquer quel logiciel et quelle version sont en train d’être désinstallés.
killalltasks(ensure_list(control.impacted_process)) arrête tous les processus associés au logiciel avant la désinstallation. Cela permet de s’assurer que le logiciel n’est pas utilisé.
run(uninstall_cmd(to_uninstall[“key”])) exécute la commande de désinstallation du logiciel. la fonction wait_uninstallkey_absent est utilisée pour s’assurer que la clé est complètement désinstallée pour s’assurer que le logiciel est désinstallé.
Commande print(control['version'].split('-',1)[0]) affiche le numéro de version du logiciel sans le numéro de version du WAPT à partir du fichier control.
3.1.7.2. Obtenir les noms des titres des logiciels¶
3.1.8. Gérer un paquet WAPT avec un autre paquet WAPT¶
La commande forget_packages informe l’agent WAPT d’oublier un paquet WAPT sur l’ordinateur sélectionné.
Indication
Si le résultat souhaité est de supprimer tis-scratch, vous devez soit réinstaller le paquet (wapt-getinstall«tis-scratch») puis le supprimer (wapt-get remove « tis-scratch »), soit le supprimer manuellement à partir du menu du Panneau de configuration Ajouter/supprimer des programmes.
Lorsque vous avez généré votre fichier policies.json, placez-le dans c:\waptdev\prefix-firefox-esr-wapt\policies.json.
Le dossier distribution à la racine de Firefox peut ne pas exister, nous allons donc tester son existence et le créer avec la commande mkdirs s’il n’existe pas :
Il n’est pas nécessaire d’indiquer le chemin complet du fichier source puisque le fichier policies.json est à la racine du paquetage WAPT, nous utilisons donc le chemin relatif.
Votre paquet est maintenant prêt à appliquer une configuration. Vous pouvez lancer une installation avec PyScripter et valider que le paquet fonctionne selon votre objectif.
Enfin, lancez votre Firefox pour vérifier qu’il fonctionne pour vos utilisateurs.
Pour rechercher une version indésirable de Firefox, nous utiliserons la fonction installed_softwares. Cette fonction renvoie une liste de dictionnaires contenant les propriétés des logiciels :
# -*- coding: utf-8 -*-fromsetuphelpersimport*uninstallkey=[]definstall():#Install firefox if necessaryinstall_exe_if_needed("Firefox Setup 45.5.0esr.exe",silentflags="-ms",key='Mozilla Firefox 45.5.0 ESR (x64 fr)',min_version="45.5.0")#Removal of the firefox shortcut on the all user desktopremove_desktop_shortcut('Firefox')#Creation of the distribution folder if it does not existifnotisdir(r'C:\Program Files\Mozilla Firefox\distribution'):mkdirs(r'C:\Program Files\Mozilla Firefox\distribution')#Copy of the policies.json file found at the root of the package in the destination of the distribution folderfilecopyto('policies.json',r'C:\Program Files\Mozilla Firefox\distribution')#For each Mozilla Firefox installedforuninstallininstalled_softwares('Mozilla Firefox'):#If the software does not have the word ESR in the nameifnot'ESR'inuninstall['name']:print(uninstall['name'])print('Uninstall '+uninstall['key'])#Looking for how we can uninstall it silentlysilent_uninstall=uninstall_cmd(uninstall['key'])print('Run '+silent_uninstall)#We launch the previous command.run(silent_uninstall)#Uninstalling mozilla maintenance serviceforuninstallininstalled_softwares('MozillaMaintenanceService'):run(uninstall_cmd(uninstall['key']))
Votre code gère maintenant la désinstallation des versions indésirables de Firefox.
3.2.3. Amélioration de setup.py pour utiliser des variables¶
Le dernier exemple est le meilleur, mais cette opération ne fonctionne qu’avec Python3.
Nous pouvons maintenant utiliser des variables dans notre setup.py :
# -*- coding: utf-8 -*-fromsetuphelpersimport*uninstallkey=[]definstall():version_firefox="45.5.0"#Install firefox if necessaryinstall_exe_if_needed("Firefox Setup %sesr.exe"%version_firefox,silentflags="-ms",key='Mozilla Firefox %s ESR (x64 fr)'%version_firefox,min_version=version_firefox)#Removal of the firefox shortcut on the all user desktopremove_desktop_shortcut('Firefox')distribution_folder=r'C:\Program Files\Mozilla Firefox\distribution'#Creation of the distribution folder if it does not existifnotisdir(distribution_folder):mkdirs(distribution_folder)...Therestofthecodedoesnotchange...
Indication
Vous pouvez récupérer le numéro de version indiqué dans le fichier control comme suit :
version_firefox=control.get_software_version()
3.2.4. Personnaliser l’environnement de l’utilisateur¶
Il est parfois nécessaire de personnaliser un logiciel dans le contexte de l’utilisateur pour définir des paramètres spécifiques ou pour se conformer aux règles et préférences de l’Organisation :
Création d’un raccourci vers le bureau de l’utilisateur avec des arguments spécifiques.
Modifier les clés du registre Windows de l’utilisateur.
Modifier les fichiers, les paramètres du navigateur de l’utilisateur.
Configurer des raccourcis vers l’ensemble des modèles de documents, de feuilles de calcul ou de présentations de l’organisation dans les suites Office afin d’encourager ou de garantir le respect des lignes directrices éditoriales et graphiques.
Configuration du courrier électronique ou de la messagerie instantanée de l’utilisateur à partir du principal référentiel de données utilisateur de l’organisation (annuaire LDAP, base de données, etc.).
Personnalisation d’une suite bureautique ou d’un logiciel d’entreprise sur la base du principal référentiel de données utilisateur de l’organisation (annuaire LDAP, base de données, etc.).
La fonction session_setup bénéficie de la puissance de python pour atteindre un haut niveau d’automatisation.
Avec session_setup, il n’est pas possible d’appeler les fichiers contenus dans le paquet WAPT.
Pour appeler des fichiers externes lors de la désinstallation, copiez et collez les fichiers nécessaires dans un dossier externe pendant le processus d’installation du paquet (exemple : c:Ncachefile).
3.2.4.3. Exemple : création d’un raccourci personnalisé sur le bureau¶
L’une des possibilités offertes par Setuphelpers est d’ajouter des raccourcis personnalisés sur les bureaux des utilisateurs, au lieu d’un raccourci commun à tous les utilisateurs.
Pour cela, nous utiliserons la fonction create_user_desktop_shortcut() pour créer des raccourcis contenant le nom d’utilisateur et passant un site web comme argument à Firefox.
Lancez maintenant la session-setup directement depuis PyScripter.
PyScripter - Exécution de l’installation de la session¶
Enfin, vérifiez que l’icône est bien présente sur le bureau.
3.2.5. Utilisation des fonctions d’audit pour la conformité¶
Note
Cette fonctionnalité est disponible dans la version Enterprise.
La fonction d’audit permet d’effectuer des contrôles réguliers des configurations des postes de travail et de centraliser les résultats de ces contrôles dans la console WAPT. Cette fonction vous permet de vous assurer que votre base installée d’hôtes correspond à votre ensemble de règles de conformité au fil du temps.
Par exemple, vous pouvez :
Vérifier régulièrement la liste des administrateurs locaux sur les ordinateurs de bureau.
S’assurer au fil du temps de la bonne configuration d’un logiciel critique.
Vérifier régulièrement la présence de la bonne version d’un logiciel.
Vérifier les paramètres de sécurité d’un poste de travail.
La fonction audit bénéficie de la profondeur et de l’étendue des bibliothèques python pour des niveaux inégalés de précision et de finesse pour vos besoins d’audit.
Les tâches audit sont lancées une fois après chaque wapt-get upgrade, puis régulièrement comme défini par l’attribut audit_schedule.
Pour lancer manuellement un contrôle d’audit, vous pouvez également utiliser la commande suivante :
wapt-getaudit
Note
Par défaut, la fonction audit ne sera pas lancée si l’audit n’est pas nécessaire.
Pour forcer l’exécution, vous pouvez lancer la commande suivante :
wapt-getaudit-f
Le script audit est défini dans le setup.py du paquet avec une fonction defaudit() :
Dans cet exemple, nous améliorons le paquet Firefox étudié précédemment dans cette documentation.
Ajoutez la fonction audit dans le setup.py.
defaudit():ifisfile(r'C:\Program Files\Mozilla Firefox\distribution\policies.json'):print('File policies.json found')return"OK"else:print('File policies.json not found')return"ERROR"
Lancez l’audit à partir de PyScripter.
Testez avec le fichier puis supprimez le fichier C:\ProgramFiles\MozillaFirefox\distribution\policies.json et testez à nouveau avec PyScripter.
Vous pouvez voir directement le statut de l’audit dans la console WAPT (Cliquez sur le paquet puis sur la colonne audit) :
Vérification du statut d’un audit dans la console WAPT¶
La fonction d’audit renvoie l’une de ces trois valeurs :
OK;
WARNING;
ERROR.
Attention
Avec la fonction audit, il n’est pas possible d’utiliser les fichiers contenus dans les paquets WAPT.
Pour utiliser les fichiers intégrés dans le paquet WAPT qui seront utilisés pour un audit, vous DEVEZ donner l’instruction de copier le(s) fichier(s) dans un dossier temporaire lors de l’installation du paquet WAPT.
Les tâches audit sont lancées une fois après chaque mise à jour, puis régulièrement comme défini avec la valeur audit_schedule.
La valeur est contenue dans le fichier control du paquet WAPT.
Par défaut, si audit_schedule est vide, la tâche d’audit peut être lancée manuellement depuis la console WAPT ou automatiquement si vous avez défini l’option waptaudit_task_period dans le wapt-get.ini de l’agent WAPT. Pour plus d’informations sur cette dernière méthode, veuillez consulter cette documentation.
Dans le cas contraire, la périodicité peut être indiquée de plusieurs manières :
Un nombre entier (en minutes).
Un nombre entier suivi d’une lettre (m = minutes, h = heures, d = jours, w = semaines).
3.2.5.3. Comportement par défaut de la fonction d’audit¶
Par défaut, la seule fonction d’audit vérifie la présence de UninstallKey pour son paquet WAPT.
De cette manière, WAPT s’assure que le logiciel est toujours présent sur l’hôte, conformément à la configuration de l’hôte.
3.2.6. L’audit des configurations pour assurer la conformité¶
Note
Cette fonctionnalité est disponible dans la version Enterprise.
La fonction audit_data permet d’effectuer des vérifications régulières des configurations de bureau et de centraliser les résultats de ces vérifications dans la console WAPT. Il y a une historisation et vous pouvez crypter vos données et les décrypter avec votre certificat WAPT.
Par exemple, vous pouvez :
Modifier le mot de passe d’un administrateur, crypter des informations et les afficher sur la console WAPT.
Vérifiez régulièrement les modifications dont votre ordinateur a besoin, comme l’inventaire CVE ou GLPI.
Vérifier les paramètres de sécurité d’un poste de travail et faire l’historique des problèmes.
La fonction audit_data n’est utilisable que dans la fonction audit.
Les fonctions audit_data sont lancées si elles sont définies dans la section defaudit() du fichier setup.py.
On the server side, audit data is stored in the HostAuditData table.
The content of the table can be queried using the Reporting tab in the WAPT Console.
The Data is automatically purged according to expiration date.
When WAPT host update_status() is launched, the newer audit data is sent to the WAPT Server.
Côté client, les données d’audit sont stockées dans la base de données hôte avec une date d’expiration (date_expiration) et le nombre maximum (max_count) des données stockées est défini dans le code.
Dans cet exemple, nous vérifions l’IP publique de l’ordinateur.
Ajoutez la fonction audit_data à l’intérieur de la fonction audit dans le setup.py.
defaudit():ip=wgets('https://api.ipify.org',verify_cert=False)print(f'My public IP address is: {ip}')WAPT.write_audit_data_if_changed('Public IP','log for %s'%get_computername(),ip,max_count=5)return'OK'
Voici les fonctions liées à audit_data :
defwrite_audit_data_if_changed(self,section,key,value,ptype=None,value_date=None,expiration_date=None,max_count=2,keep_days=None):"""Write data only if different from last one"""defwrite_audit_data(self,section,key,value,ptype=None,value_date=None,expiration_date=None,max_count=2,keep_days=None):"""Stores in database a metrics, removes expired ones Args: section (str) key (str) value (any) value_date expiration_date (str) : expiration date of the new value max_count (int) : keep at most max_count value. remove oldest one. keep_days (int) : set the expiration date to now + keep_days days. override expiration_date arg if not None Returns: None"""defread_audit_data(self,section,key,default=None,ptype=None):"""Retrieve the latest value associated with section/key from database"""defread_audit_data_set(self,section,key):"""Retrieve all the values associated with section/key from database"""defdelete_audit_data(self,section,key):defread_audit_data_since(self,last_query_date=None):"""Retrieve all the values since a date from database"""
Cette partie de la documentation s’adresse aux utilisateurs avancés de WAPT.
Les fonctions update_package sont très pratiques, elles permettent de gagner beaucoup de temps lorsqu’il s’agit de mettre à jour un paquet WAPT avec la version la plus récente d’un logiciel.
Télécharger la dernière version des binaires du logiciel.
Supprimer les anciennes versions des binaires du logiciel.
Mettez à jour le numéro de version du logiciel dans le fichier control.
Si vous basez votre fonction install sur le numéro de version contenu dans le fichier control, alors vous n’avez même pas besoin de modifier votre fichier setup.py.
Vous n’avez qu’à faire vos tests habituels d’assurance qualité avant de build-upload votre nouveau paquet.
Voici le script update_package pour firefox-esr comme exemple :
defupdate_package():importre,requests,glob#Retrieving the last file nameurl=requests.head('https://download.mozilla.org/?product=firefox-esr-latest&os=win64',proxies={}).headers['Location']filename=url.rsplit('/',1)[1].replace('%20',' ')#download of it if is not in the packageifnotisfile(filename):print('Downloading %s from %s'%(filename,url))wget(url,filename)#removing old exe with wrong nameforfninglob.glob('*.exe'):iffn!=filename:remove_file(fn)# updates control version from filename, increment package version.control.version='%s-0'%(re.findall('Firefox Setup (.*)esr\.exe',filename)[0])control.save_control_to_wapt()
Vous pouvez lancer le update_package dans PyScripter :
PyScripter - Exécuter une mise à jour du paquet-source¶
Vous trouverez de nombreux exemples inspirants de scripts update_package dans les paquets hébergés dans le Tranquil IT store.
Le fichier C:\waptdev\tis-adwcleaner-wapt sont créés.
Vous trouverez ici un exemple de paquet portable qui reprend presque toutes les fonctions WAPT d’un setup.py :
fromsetuphelpersimport*uninstallkey=[]exe_name='AdwCleaner.exe'path_adw=makepath(programfiles,'AdwCleaner')path_exe=makepath(path_adw,exe_name)nameshortcut='AdwCleaner'definstall():mkdirs(path_adw)filecopyto(exe_name,path_exe)create_desktop_shortcut(nameshortcut,path_exe)defuninstall():remove_tree(path_adw)remove_desktop_shortcut(nameshortcut,path_exe)defaudit():ifnotisfile(path_exe):print('File not found')return"OK"else:print('File Found')return"ERROR"defupdate_package():wget('https://downloads.malwarebytes.com/file/AdwCleaner',exe_name)control.version=get_file_properties(exe_name)['FileVersion']+'-0'control.save_control_to_wapt()
3.2.9. Ensemble des paquets .msu de Windows Update¶
Entre les versions du Patch Tuesday, Microsoft peut publier des KB supplémentaires ou des mises à jour critiques qui devront être transmises rapidement aux hôtes.
À cette fin, WAPT fournit un modèle de paquet pour les fichiers .msu.
Dans cet exemple, nous utilisons la KB4522355 téléchargée depuis le site web du catalogue Microsoft.
Create a WAPT package template from the downloaded .msu file.
In the WAPT Console, click on Tools ‣ Package Wizard.
PyScripter - Fenêtre de la console WAPT pour la création d’un modèle de paquetage¶
Sélectionnez le paquet .msu téléchargé et remplissez les champs requis.
Informations nécessaires à la création du paquet MSU¶
Cliquez sur Make and edit (recommandé) pour lancer la personnalisation du paquet.
L’IDE du paquet WAPT est lancé en utilisant le code source du modèle prédéfini .msu.
Comme d’habitude avec les paquets WAPT, testez, puis construisez, puis signez, puis téléchargez et enfin affectez les paquets WAPT souhaités à vos hôtes sélectionnés et c’est fait !
Si le KB est inclus dans le Patch Tuesday suivant, vous pouvez sélectionner les hôtes sur lesquels le package a été appliqué et oublier le package KB sur les hôtes.
Tous les paquets WAPT sont stockés dans le home de linuxuser (home de l’utilisateur actuellement connecté).
VSCode se charge et ouvre le projet de paquetage WAPT.
Ouverture de VSCode avec focus sur le fichier setup¶
Vérifier le contenu du fichier control.
Vous devez donner un description au paquet WAPT, définir le os_target et le version du paquet WAPT.
Indication
os_target pour unix est linux.
Avertissement
Le numéro de version du logiciel dans votre fichier controlDOIT commencer à 0, et non le numéro de version du titre du logiciel, car le numéro de version peut ne pas être le même que celui affiché dans le dépôt DEB / YUM.
Il convient de noter qu’une sous-version -1 a été ajoutée. Il s’agit de la version d’emballage du paquet WAPT.
Il permet au développeur du paquet WAPT de publier plusieurs versions du même logiciel, ce qui est très utile pour un développement rapide et itératif.
Modifiez le code dans le fichier setup.py en conséquence.
Modifier le fichier setup.py lors d’une désinstallation.
defuninstall():apt_remove('vlc')
Lancer un remove à partir du VSCode Run Configurations.
Après la désinstallation, le logiciel est correctement supprimé¶
Vérifiez que le logiciel a été correctement supprimé.
dpkg-l|grepvlc
Indication
Dans la fonction uninstall(), il n’est pas possible d’appeler les fichiers inclus dans le paquet WAPT. Pour appeler les fichiers du paquetage, il est nécessaire de copier/coller les fichiers dans un répertoire temporaire lors de l’installation du paquetage.
3.2.10.3. Gestion de la configuration de la session¶
Modifier le fichier setup.py avec un session-setup ;
Dans cet exemple, nous allons créer un fichier vlcrc par défaut dans le profil de l’utilisateur.
3.2.11. Cryptage des données sensibles contenues dans un paquet WAPT¶
Note
Cette partie de la documentation s’adresse aux utilisateurs avancés de WAPT.
Cette fonction n’est disponible que dans la version Enterprise.
3.2.11.1. Quel est l’objectif de cette démarche ?¶
Avec WAPT, l’intégrité du paquet est assurée. Un paquet dont le contenu a été modifié sans être re-signé sera systématiquement refusé par le client WAPT.
En revanche, le contenu d’un paquet WAPT n’est pas crypté et sera lisible par tous. Ce modèle technique de transparence apporte néanmoins de nombreux avantages.
Cela peut être gênant dans le cas d’un paquet contenant un mot de passe, une clé de licence ou toute autre donnée sensible ou confidentielle.
Vous trouverez ici un exemple de paquet WAPT dans lequel nous cryptons une chaîne de texte dans une fonction update_package et décryptons ensuite ce texte dans la fonction install.
Dans cet exemple, la fonction update_package nous permet de parcourir la base de données du serveur WAPT pour récupérer le certificat de chaque hôte, puis de crypter le texte sensible avec ce certificat.
Le texte crypté pour chaque hôte est alors stocké dans un fichier encrypt-txt.json à la racine du paquetage WAPT.
Lorsque le paquet WAPT est installé, l’agent WAPT prend le texte crypté et le déchiffre à l’aide de sa propre clé privée.
Vous pouvez le tester par vous-même en téléchargeant le paquet d’exemple tis-encrypt-sample.
Attention
La sortie python (journal d’installation du paquet WAPT) est lisible par les utilisateurs sur l’hôte, donc vous ne devriez pas afficher le texte déchiffré avec une impression pendant l’installation.