139 votes

Comment désinstaller une application à l'aide de PowerShell ?

Existe-t-il un moyen simple de se connecter à la norme ' Ajout ou suppression de programmes à l'aide de PowerShell pour désinstaller une application existante ? Ou pour vérifier si l'application est installée ?

168voto

Jeff Hillman Points 3333
$app = Get-WmiObject -Class Win32_Product | Where-Object { 
    $_.Name -match "Software Name" 
}

$app.Uninstall()

Edit : Rob a trouvé un autre moyen de le faire avec le paramètre Filter :

$app = Get-WmiObject -Class Win32_Product `
                     -Filter "Name = 'Software Name'"

1 votes

C'est à peu près tout, je dirais qu'il est peut-être préférable d'utiliser le numéro d'identification plutôt que le nom, juste au cas où.

6 votes

Après quelques recherches, vous pouvez également utiliser la clause -filter de Get-WmiObject : $app = Get-WmiObject -Class Win32_Product -filter "select * from Win32_Product WHERE name = 'Software Name'".

8 votes

Notez que l'examen de WMI ne fonctionnera que pour les produits qui ont été installés via un MSI.

34voto

Robert Wagner Points 7904

Pour corriger la deuxième méthode du post de Jeff Hillman, vous pouvez soit faire un :

$app = Get-WmiObject 
            -Query "SELECT * FROM Win32_Product WHERE Name = 'Software Name'"

Ou

$app = Get-WmiObject -Class Win32_Product `
                     -Filter "Name = 'Software Name'"

0 votes

Juste une mise au point... J'ai découvert que l'utilisation de l'option "-Query" au lieu de "-Filter" ne renvoyait pas un WmiObject, et qu'il n'y avait donc pas de méthode de "désinstallation".

0 votes

Cette solution ne permet pas d'obtenir les programmes installés via exe, mais msi. Pour cette raison, elle ne fonctionne que pour les programmes qui ont été installés via le microsoft installer (msi).

7voto

David Stetler Points 1085

Pour ajouter un peu à ce post, j'avais besoin de pouvoir supprimer un logiciel de plusieurs serveurs. J'ai utilisé la réponse de Jeff pour me conduire à cela :

D'abord j'ai obtenu une liste de serveurs, j'ai utilisé une AD mais vous pouvez fournir le tableau des noms d'ordinateurs comme vous le souhaitez :

$computers = @("computer1", "computer2", "computer3")

Puis je les ai parcourus en boucle, en ajoutant le paramètre -computer à la requête gwmi :

foreach($server in $computers){
    $app = Get-WmiObject -Class Win32_Product -computer $server | Where-Object {
        $_.IdentifyingNumber -match "5A5F312145AE-0252130-432C34-9D89-1"
    }
    $app.Uninstall()
}

J'ai utilisé la propriété IdentifyingNumber pour établir une correspondance au lieu du nom, juste pour être sûr de désinstaller la bonne application.

0 votes

Cette solution est tout simplement charmante

3voto

Ben Key Points 388

Je vais apporter ma petite contribution. J'avais besoin de supprimer une liste de paquets sur le même ordinateur. Voici le script que j'ai trouvé.

$packages = @("package1", "package2", "package3")
foreach($package in $packages){
  $app = Get-WmiObject -Class Win32_Product | Where-Object {
    $_.Name -match "$package"
  }
  $app.Uninstall()
}

J'espère que cela s'avérera utile.

Notez que je dois à David Stetler le crédit pour ce script puisqu'il est basé sur le sien.

0voto

user3410872 Points 1

Utilisez :

function remove-HSsoftware{
[cmdletbinding()]
param(
[parameter(Mandatory=$true,
ValuefromPipeline = $true,
HelpMessage="IdentifyingNumber can be retrieved with `"get-wmiobject -class win32_product`"")]
[ValidatePattern('{[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}}')]
[string[]]$ids,
[parameter(Mandatory=$false,
            ValuefromPipeline=$true,
            ValueFromPipelineByPropertyName=$true,
            HelpMessage="Computer name or IP adress to query via WMI")]
[Alias('hostname,CN,computername')]
[string[]]$computers
)
begin {}
process{
    if($computers -eq $null){
    $computers = Get-ADComputer -Filter * | Select dnshostname |%{$_.dnshostname}
    }
    foreach($computer in $computers){
        foreach($id in $ids){
            write-host "Trying to uninstall sofware with ID ", "$id", "from computer ", "$computer"
            $app = Get-WmiObject -class Win32_Product -Computername "$computer" -Filter "IdentifyingNumber = '$id'"
            $app | Remove-WmiObject

        }
    }
}
end{}}
 remove-hssoftware -ids "{8C299CF3-E529-414E-AKD8-68C23BA4CBE8}","{5A9C53A5-FF48-497D-AB86-1F6418B569B9}","{62092246-CFA2-4452-BEDB-62AC4BCE6C26}"

Il n'a pas été entièrement testé, mais il a fonctionné sous PowerShell 4.

J'ai exécuté le fichier PS1 tel qu'il est présenté ici. Je l'ai laissé récupérer tous les systèmes de la base de données de l'entreprise. AD et j'essaie de désinstaller plusieurs applications sur tous les systèmes.

J'ai utilisé l'IdentifyingNumber pour rechercher la cause logicielle de l'entrée de David Stetlers.

Non testé :

  1. Ne pas ajouter les ids à l'appel de la fonction dans le script, au lieu de commencer le script avec les IDs des paramètres.
  2. Appeler le script avec plus d'un nom d'ordinateur pas automatiquement récupéré à partir de la fonction
  3. Récupération des données du tuyau
  4. Utilisation des adresses IP pour se connecter au système

Ce qu'il ne fait pas :

  1. Il ne donne aucune information si le logiciel a effectivement été trouvé sur un système donné.
  2. Il ne donne aucune information sur l'échec ou le succès de la désinstallation.

Je n'ai pas pu utiliser uninstall(). En essayant cela, j'ai obtenu une erreur me disant que l'appel d'une méthode pour une expression qui a une valeur de NULL n'est pas possible. À la place, j'ai utilisé Remove-WmiObject, qui semble accomplir la même chose.

ATTENTION : Si le nom de l'ordinateur n'est pas indiqué, le logiciel est supprimé de l'ordinateur. TOUTES dans l'Active Directory.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X