
En s’appuyant sur PowerShell DSC 3.0, le gestionnaire de paquets WinGet est capable de déployer des applications sur Windows. Il peut également définir la configuration de la machine à l’aide d’un simple fichier YAML. Voici un exemple pratique d’utilisation de WinGet DSC.
Comme son nom l’indique, WinGet DSC repose sur deux composants de Windows :
WinGet, le gestionnaire de paquets permettant de gérer les applications directement en ligne de commande. Par exemple, la commande winget install permet d’installer une application.
PowerShell DSC 3.0, l’outil de gestion de configuration de Microsoft, intégré à Windows et qui permet de définir un état attendu pour une machine Windows (dans le même esprit qu’Ansible). DSC signifie Desired State Configuration.
L’idée est la suivante : définir la configuration attendue dans un fichier YAML et l’appliquer directement par l’intermédiaire de WinGet. La commande à utiliser sera alors winget configure . Mais comment créer ce fichier ? Que peut-on définir comme directive ? C’est ce que nous verrons dans la suite de ce tutoriel.
Les fonctionnalités de WinGet DSC
Le fichier de configuration exécuté par l’intermédiaire de WinGet DSC est capable d’agir sur plusieurs composantes du système d’exploitation Windows. On peut notamment citer :
Paquets : installer des logiciels par l’intermédiaire des dépôts WinGet / Microsoft Store.
Registre : configurer une clé ou une valeur de Registre.
Environnement : gérer une variable d’environnement.
Système : configurer des fonctionnalités de Windows, y compris pour pousser des configurations de logiciels.
Script : exécuter des blocs de script PowerShell.
Service : gérer un service Windows.
Fonctionnalités Windows : activer, désactiver et configurer certaines fonctionnalités Windows.
La structure du fichier WinGet DSC
Un fichier de configuration WinGet doit utiliser une convention de nommage très simple : il suffit de préciser l’extension .yaml (ou .yml). Dans la suite de cet article, nous créerons le fichier suivant : winget-dsc-windows11.yaml. Dans sa documentation, Microsoft évoque aussi l’extension .winget.
Ce fichier doit commencer par une ligne précisant le schéma de configuration utilisé. Soit cette ligne :
# yaml-language-server: $schema=https://aka.ms/configuration-dsc-schema/0.2
Ensuite, un fichier de configuration WinGet est séparé en deux sections principales :
Assertions : les conditions préalables requises pour exécuter la configuration. Par exemple, une version de Windows minimale.
Ressources : les actions à effectuer en s’appuyant sur des ressources DSC. C’est dans cette section qu’il faudra déclarer la liste des logiciels à installer, les options à configurer sur Windows ou encore les scripts à exécuter.
Dans la suite de cet article, nous verrons un exemple concret.
Exemple d’utilisation de WinGet DSC sur Windows 11
Activer les fonctionnalités avancées de WinGet
Commencez par ouvrir une console sur votre machine Windows. La première étape à effectuer qu’une seule fois consiste à activer les fonctionnalités étendues de WinGet grâce à la commande suivante :
winget configure –enable
Enabling extended features. Requires store access.
██████████████████████████████ 100%
Cette étape préparatoire débloque les fonctionnalités de la commande winget configure que nous utiliserons par la suite pour appliquer la configuration.
Construire le fichier de configuration WinGet
Désormais, nous allons construire le fichier winget-dsc-windows11.yaml de façon à exécuter les actions suivantes :
Installer l’application VLC Media Player via WinGet
Installer l’application 7-Zip via WinGet
Installer l’application Mozilla Firefox ESR via WinGet
Installer l’application PowerToys via Microsoft Store
Configurer la valeur de Registre EnablePeriodicBackup pour activer la sauvegarde automatique du Registre
Personnaliser la configuration de l’Explorateur de fichiers Windows (afficher les extensions de fichiers, masquer les fichiers cachés)
Personnaliser la configuration de la Barre des tâches de Windows (alignement à gauche, masquer le bouton des widgets, etc.)
Créer le dossier C:\sources à l’aide de PowerShell (surtout pour montrer un exemple d’exécution de code PowerShell)
Dans le cas où vous souhaitez installer des applications, comme c’est mon cas ici, vous devez identifier le nom des paquets. Pour cela, utilisez WinGet en ligne de commande. Prenons l’exemple du paquet PowerToys.
La recherche s’effectue de cette façon :
winget search
winget search powertoys
Vous devez ensuite repérer la valeur de la colonne ID correspondante à l’application à installer. Ici, ce serait la première ligne avec l’ID est XP89DCGQ3K6VLD et la source est msstore. Nous allons réutiliser ces informations dans le fichier de configuration.
Voici la configuration complète pour dérouler les actions évoquées ci-dessus, en commençant par une vérification de la version minimale de Windows. La configuration est facilement lisible. Sachez que dans la section resources, l’identifiant de chaque bloc (id) est une valeur personnalisable.
# yaml-language-server: $schema=https://aka.ms/configuration-dsc-schema/0.2
properties:
assertions:
– resource: Microsoft.Windows.Developer/OsVersion
directives:
description: Verify min OS version requirement (Windows 11 24H2)
allowPrerelease: true
settings:
MinVersion: ‘10.0.26100’
resources:
– resource: Microsoft.WinGet.DSC/WinGetPackage
id: Package.VLC
directives:
description: Installation de Media Player
securityContext: elevated
settings:
id: VideoLAN.VLC
source: winget
– resource: Microsoft.WinGet.DSC/WinGetPackage
id: Package.7Zip
directives:
description: Installation de 7-Zip
securityContext: elevated
settings:
id: 7zip.7zip
source: winget
– resource: Microsoft.WinGet.DSC/WinGetPackage
id: Package.Firefox
directives:
description: Installation de Mozilla Firefox ESR
securityContext: current
settings:
id: Mozilla.Firefox.ESR.fr
source: winget
– resource: Microsoft.WinGet.DSC/WinGetPackage
id: Package.PowerToys
directives:
description: Installation de PowerToys
securityContext: current
settings:
id: XP89DCGQ3K6VLD
source: msstore
– resource: PSDscResources/Registry
id: Registry.RegBackup
directives:
description: Activation de la sauvegarde automatique du Registre
securityContext: elevated
settings:
Key: ‘HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Configuration Manager’
ValueName: ‘EnablePeriodicBackup’
ValueData: 1
ValueType: Dword
Ensure: Present
Force: true
– resource: Microsoft.Windows.Developer/WindowsExplorer
directives:
description: Modify Windows Explorer settings
allowPrerelease: true
settings:
FileExtensions: Show
HiddenFiles: Hide
RestartExplorer: True
– resource: Microsoft.Windows.Developer/Taskbar
directives:
description: Modify taskbar settings
allowPrerelease: true
settings:
Alignment: Left
SearchBoxMode: ShowIconAndLabel
TaskViewButton: Show
WidgetsButton: Hide
– resource: PSDscResources/Script
id: PowerShell.SourcesFolder
directives:
description: Création du dossier C:\sources
securityContext: elevated
allowPrerelease: true
settings:
# GetScript : Retourne l’état actuel (Obligatoire, sinon la ressource retourne une erreur)
GetScript: |
$exist = Test-Path ‘C:\sources’
return @{ Result = if ($exist) { “Present” } else { “Absent” } }
# TestScript : Vérifie si le dossier existe déjà.
# Renvoie $true si le dossier est là (ne rien faire).
# Renvoie $false si le dossier manque (lancer le SetScript).
TestScript: |
return (Test-Path ‘C:\sources’)
# SetScript : La commande de création (exécutée uniquement si TestScript = $false)
SetScript: |
New-Item -Path ‘C:\sources’ -ItemType Directory -Force
configurationVersion: 0.2.0
Il y a des directives communes, notamment :
description : utile pour documenter votre configuration et faciliter l’interprétation.
securityContext: elevated : pour lancer l’action avec des privilèges administrateur, ce qui est essentiel pour certaines installations de logiciels ou configuration.
allowPrerelease: true : autoriser ou non la configuration à utiliser des modules en préversion. Nécessaire actuellement pour certains modules.
À la fin, la ligne configurationVersion: 0.2.0 indique la version à utiliser pour lire la configuration.
Valider la configuration WinGet
La commande winget configure contient plusieurs sous-commandes (voir cette page), dont celle nommée validate permettant de valider la syntaxe d’un fichier de configuration. Cette étape me semble essentielle avant d’appliquer une configuration sur une machine.
Voici un exemple d’utilisation sur le fichier actuel :
winget configure validate
winget configure validate winget-dsc-windows11.yaml
La validation n’a détecté aucun problème.
Il y a des erreurs importantes signalées par cette commande. Alors que, parfois, c’est plus des avertissements, notamment pour vous forcer à respecter les bonnes pratiques. Par exemple, si vous indiquez Registry comme nom de ressource à la place de PSDscResources/Registry, il y aura un avertissement. La raison : le nom est trop vague, et plusieurs modules peuvent contenir une ressource avec ce nom, ce qui peut porter à confusion.
Appliquer la configuration WinGet
Quand vous serez prêts, appliquez la configuration sur la machine Windows 11 avec la commande suivante :
winget configure –file winget-dsc-windows11.yaml –accept-configuration-agreements
Patientez pendant l’opération. Un suivi s’affiche dans la console au fur et à mesure. Quand il y a un bouclier sur une ligne, c’est parce que l’action est effectuée avec des privilèges élevés. La configuration est effectuée en temps réel, donc vous verrez directement les changements.
Conclusion
WinGet DSC est une approche moderne pour le déploiement des applications sur Windows et pour appliquer une configuration. C’est une approche aussi plus standardisée et structurée qu’un script PowerShell maison, car on se rapproche plus du style d’un outil comme Ansible grâce à l’utilisation de PowerShell DSC.
Pour préparer une machine rapidement, y compris un environnement de développement, WinGet DSC est efficace. Vous écrivez la configuration une fois et vous l’appliquez autant de fois que vous le souhaitez. Surtout, si vous relancez la même configuration sur la même machine plusieurs fois, tout sera vérifié et seules les étapes nécessaires (par exemple un logiciel manquant) seront appliquées.
Des informations supplémentaires sont disponibles dans la documentation :
Ingénieur système et réseau, cofondateur d’IT-Connect et Microsoft MVP “Cloud and Datacenter Management”. Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
