Les applications conçues de façon à utiliser Windows Installer sont accessibles via la classe WMI Win32_Product, mais toutes les applications en usage aujourd'hui n'utilisent pas Windows Installer. Parce que Windows Installer fournit le plus large éventail de techniques standard pour utiliser des applications installables, nous nous concentrerons essentiellement sur ces applications. Les applications qui utilisent d'autres routines d'installation ne seront généralement pas gérées par Windows Installer. Les techniques spécifiques pour utiliser ces applications dépendront du programme d'installation et les décisions prises par le développeur de telle ou telle application.

Remarque :

Les applications installées par copie des fichiers d'application sur l'ordinateur ne peuvent généralement pas être gérées à l'aide des techniques présentées ici. Vous pouvez gérer ces applications en tant que fichiers et dossiers en utilisant les techniques présentées dans la section « Utilisation des fichiers et dossiers ».

Listage des applications Windows Installer

Pour répertorier les applications installées avec Windows Installer sur un système local ou distant, utilisez la requête WMI simple suivante :

PS> Get-WmiObject -Class Win32_Product -ComputerName .
IdentifyingNumber : {7131646D-CD3C-40F4-97B9-CD9E4E6262EF}
Name              : Microsoft .NET Framework 2.0
Vendor            : Microsoft Corporation
Version           : 2.0.50727
Caption           : Microsoft .NET Framework 2.0

Pour afficher toutes les propriétés de l'objet Win32_Product à l'affichage, utilisez le paramètre Properties des applets de commande de mise en forme, telles que l'applet de commande Format-List, avec la valeur * (tout).

PS> Get-WmiObject -Class Win32_Product -ComputerName . | Where-Object -FilterScript {$_.Name -eq "Microsoft .NET Framework 2.0"} | Format-List -Property *
Name              : Microsoft .NET Framework 2.0
Version           : 2.0.50727
InstallState      : 5
Caption           : Microsoft .NET Framework 2.0
Description       : Microsoft .NET Framework 2.0
IdentifyingNumber : {7131646D-CD3C-40F4-97B9-CD9E4E6262EF}
InstallDate       : 20060506
InstallDate2      : 20060506000000.000000-000
InstallLocation   :
PackageCache      : C:\WINDOWS\Installer\619ab2.msi
SKUNumber         :
Vendor            : Microsoft Corporation

Vous pouvez également utiliser le paramètre Get-WmiObject Filter pour sélectionner uniquement le Microsoft .NET Framework 2.0. Étant donné que le filtre utilisé dans cette commande est un filtre WMI, il utilise le langage de requête WMI (WQL) et pas la syntaxe Windows PowerShell. À la place :

Get-WmiObject -Class Win32_Product -ComputerName . -Filter "Name='Microsoft .NET Framework 2.0'"| Format-List -Property *

Notez que les requêtes WQL utilisent fréquemment des caractères, tels que des espaces ou des signes égal (=), qui ont une signification particulière dans Windows PowerShell. C'est pourquoi il est prudent de toujours faire figurer la valeur du paramètre Filter entre guillemets. Vous pouvez également utiliser le caractère d'échappement de Windows PowerShell, un backtick (`), même s'il ne favorise pas la lisibilité. La commande suivante est équivalente à la commande précédente et retourne les mêmes résultats, mais utilise le backtick pour ignorer les caractères spéciaux au lieu d'utiliser des guillemets pour encadrer toute la chaîne de filtrage.

Get-WmiObject -Class Win32_Product -ComputerName . -Filter Name`=`'Microsoft` .NET` Framework` 2.0`' | Format-List -Property *

Pour répertorier uniquement les propriétés qui vous intéressent, utilisez le paramètre Property des applets de commande de mise en forme pour lister les propriétés souhaitées.

Get-WmiObject -Class Win32_Product -ComputerName . | Format-List -Property Name,InstallDate,InstallLocation,PackageCache,Vendor,Version,IdentifyingNumber
...
Name              : HighMAT Extension to Microsoft Windows XP CD Writing Wizard
InstallDate       : 20051022
InstallLocation   : C:\Program Files\HighMAT CD Writing Wizard\
PackageCache      : C:\WINDOWS\Installer\113b54.msi
Vendor            : Microsoft Corporation
Version           : 1.1.1905.1
IdentifyingNumber : {FCE65C4E-B0E8-4FBD-AD16-EDCBE6CD591F}
...

Enfin, pour rechercher uniquement les noms des applications installées, une simple instruction Format-Wide simplifie la sortie :

Get-WmiObject -Class Win32_Product -ComputerName .  | Format-Wide -Column 1

Si nous disposons à présent de plusieurs moyens pour identifier les applications qui ont utilisé Windows Installer pour l'installation, nous n'avons pas considéré les autres applications. Parce que la plupart des applications standard inscrivent leur programme de désinstallation dans le Registre Windows, nous pouvons y rechercher ces programmes pour les utiliser localement.

Listage de toutes les applications pouvant être désinstallées

Bien qu'il n'existe aucun moyen absolument sûr de trouver toutes les applications d'un système, il est possible de rechercher tous les programmes qui figurent dans les listes affichées dans la boîte de dialogue Ajouter ou supprimer des programmes. La fonction Ajouter ou supprimer des programmes recherche ces applications dans la clé de Registre suivante :

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall.

Nous pouvons également examiner cette clé pour rechercher des applications. Pour simplifier la consultation de la clé Uninstall, nous pouvons mapper un lecteur Windows PowerShell à cet emplacement du Registre :

PS>    

Name       Provider      Root                                   CurrentLocation
----       --------      ----                                   ---------------
Uninstall  Registry      HKEY_LOCAL_MACHINE\SOFTWARE\Micr...
Remarque :

Le lecteur HKLM: est mappé à la racine de HKEY_LOCAL_MACHINE, aussi avons-nous utilisé ce lecteur dans le chemin d'accès à la clé Uninstall. Au lieu de HKLM:, nous aurions pu spécifier le chemin d'accès au Registre à l'aide de HKLM ou HKEY_LOCAL_MACHINE. L'avantage de l'utilisation d'un lecteur de Registre existant est que nous pouvons utiliser la saisie automatique par tabulation pour remplir les noms de clés et ainsi éviter de les taper.

Nous disposons à présent d'un lecteur nommé « Uninstall » qui peut être utilisé pour rechercher rapidement et facilement des installations d'applications. Nous pouvons déterminer le nombre d'applications installées en comptant le nombre de clés de Registre du lecteur Uninstall: de Windows PowerShell :

PS> (Get-ChildItem -Path Uninstall:).Count
459

Nous pouvons effectuer une recherche plus poussée dans cette liste d'applications en utilisant diverses techniques, à commencer par Get-ChildItem. Pour obtenir une liste d'applications et les enregistrer dans la variable $UninstallableApplications, utilisez la commande suivante :

$UninstallableApplications = Get-ChildItem -Path Uninstall:
Remarque :

Nous utilisons ici un nom de variable long pour des raisons de clarté. En pratique, il n'y a aucune raison d'utiliser des noms longs. Bien que vous puissiez utiliser la saisie automatique par tabulation pour les noms de variables, vous pouvez également utiliser des noms de 1 à 2 caractères pour gagner en vitesse. L'utilité de noms descriptifs plus longs se justifie lorsque vous développez du code en vue de sa réutilisation.

Pour afficher les valeurs des entrées du Registre dans les clés de Registre sous Uninstall, utilisez la méthode GetValue des clés de Registre. La valeur de la méthode est le nom de l'entrée de Registre.

Par exemple, pour rechercher les noms d'affichage des applications de la clé Uninstall, utilisez la commande suivante :

PS> Get-ChildItem -Path Uninstall: | ForEach-Object -Process { $_.GetValue("DisplayName") }

L'unicité de ces valeurs n'est pas garantie. Dans l'exemple suivant, deux éléments installés se présentent comme faisant partie de « Windows Media Encoder 9 Series » :

PS> Get-ChildItem -Path Uninstall: | Where-Object -FilterScript { $_.GetValue("DisplayName") -eq "Windows Media Encoder 9 Series"}


   Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Micros
oft\Windows\CurrentVersion\Uninstall

SKC  VC Name                           Property
---  -- ----                           --------
  0   3 Windows Media Encoder 9        {DisplayName, DisplayIcon, UninstallS...
  0  24 {E38C00D0-A68B-4318-A8A6-F7... {AuthorizedCDFPrefix, Comments, Conta...

Installation d'applications

Vous pouvez utiliser la classe Win32_Product pour installer des packages Windows Installer, à distance ou localement. Pour les installations distantes, utilisez un chemin d'accès conforme à la convention d'affectation des noms (UNC, Universal Naming Convention) pour spécifier le chemin d'accès au package .msi, car le sous-système WMI ne comprend pas les chemins d'accès Windows PowerShell. Par exemple, pour installer le package NewPackage.msi situé sur le partage réseau \\AppServ\dsp de l'ordinateur distant PC01, tapez ce qui suit à l'invite Windows PowerShell :

(Get-WMIObject -ComputerName PC01 -List | Where-Object -FilterScript {$_.Name -eq "Win32_Product"}).Install(\\AppSrv\dsp\NewPackage.msi)

Les applications qui n'utilisent pas la technologie Windows Installer peuvent disposer de méthodes propres à l'application en vue d'un déploiement automatisé. Pour déterminer l'existence d'une telle méthode, vérifiez la documentation de l'application en question ou consultez le système d'assistance de son éditeur. Dans certains cas, même si l'éditeur de l'application n'a pas conçu l'application spécifiquement en vue d'une installation automatisée, le fabricant du programme d'installation peut disposer de techniques d'automatisation.

Suppression d'applications

La suppression d'un package Windows Installer à l'aide de Windows PowerShell fonctionne à peu près de la même manière que l'installation d'un package. Voici un exemple qui sélectionne le package à désinstaller en fonction de son nom ; dans certains cas, il peut être plus facile de filtrer avec IdentifyingNumber :

(Get-WmiObject -Class Win32_Product -Filter "Name='ILMerge'" -ComputerName . ).Uninstall()

La suppression des autres applications n'est pas aussi simple, même en local. Nous pouvons trouver les chaînes de désinstallation par la ligne de commande de ces applications en extrayant la propriété UninstallString. Cette méthode fonctionne pour les applications Windows Installer et les programmes plus anciens qui apparaissent sous la clé Uninstall :

Get-ChildItem -Path Uninstall: | ForEach-Object -Process { $_.GetValue("UninstallString") }

Vous pouvez si vous le souhaitez filtrer la sortie par nom d'affichage :

Get-ChildItem -Path Uninstall: | Where-Object -FilterScript { $_.GetValue("DisplayName") -like "Win*"} | ForEach-Object -Process { $_.GetValue("UninstallString") }

Toutefois, il est possible que ces chaînes nécessitent quelques modifications pour être utilisables à partir de l'invite de Windows PowerShell.

Mise à niveau d'applications Windows Installer

Pour mettre à niveau une application, vous devez connaître son nom et le chemin d'accès au package de mise à niveau de l'application. Avec ces informations, vous pouvez mettre à niveau une application à l'aide d'une seule commande Windows PowerShell :

(Get-WmiObject -Class Win32_Product -ComputerName . -Filter "Name='OldAppName'").Upgrade(\\AppSrv\dsp\OldAppUpgrade.msi)




Table des matières