Frage

Gibt es eine einfache Art und Weise in die Standard-hook ‚ Programme hinzufügen oder entfernen ‘ -Funktionalität mit Powershell deinstallieren eine bestehende Anwendung ? Oder zu überprüfen, ob die Anwendung installiert ist?

War es hilfreich?

Lösung

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

$app.Uninstall()

Edit: Rob fand einen anderen Weg, um es mit den Filter-Parameter zu tun:

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

Andere Tipps

EDIT: Im Laufe der Jahre hat sich diese Antwort schon einige upvotes bekommen. Ich möchte einige Kommentare hinzufügen. Ich habe nicht verwendet Powershell da, aber ich erinnere mich, einige Probleme zu beobachten:

  1. Wenn es mehr Übereinstimmungen als 1 für die unten Skript, funktioniert es nicht und Sie müssen die Powershell-Filter hängen Sie die Ergebnisse auf 1 begrenzt Ich glaube, es ist -First 1 aber ich bin nicht sicher. Fühlen Sie sich frei zu bearbeiten.
  2. Wenn die Anwendung nicht von MSI installiert ist, funktioniert nicht. Der Grund ist es wie unten geschrieben wurde, weil er die MSI modifiziert, ohne Intervention zu deinstallieren, was nicht immer der Standardfall ist, wenn die native UninstallString verwenden.

Mit dem Objekt WMI dauert ewig. Dies ist sehr schnell, wenn Sie nur den Namen des Programms kennen Sie deinstallieren möchten.

$uninstall32 = gci "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match "SOFTWARE NAME" } | select UninstallString
$uninstall64 = gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match "SOFTWARE NAME" } | select UninstallString

if ($uninstall64) {
$uninstall64 = $uninstall64.UninstallString -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X",""
$uninstall64 = $uninstall64.Trim()
Write "Uninstalling..."
start-process "msiexec.exe" -arg "/X $uninstall64 /qb" -Wait}
if ($uninstall32) {
$uninstall32 = $uninstall32.UninstallString -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X",""
$uninstall32 = $uninstall32.Trim()
Write "Uninstalling..."
start-process "msiexec.exe" -arg "/X $uninstall32 /qb" -Wait}

Um die zweite Methode in Jeff Hillman Post zu beheben, können Sie entweder tun ein:

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

oder

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

Um ein wenig zu diesem Beitrag hinzufügen, ich musste in der Lage sein, Software entfernen von mehreren Servern. Ich habe Jeffs Antwort mich dazu führen:

Zuerst bekam ich eine Liste von Servern, benutzen ich eine AD Abfrage, aber Sie können stellt die Anordnung von Computernamen, wie Sie wollen:

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

Dann habe ich durch sie geschlungen und fügte hinzu, die -Computer Parameter an die gwmi Abfrage:

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

habe ich die IdentifyingNumber Eigenschaft gegen statt Namen übereinstimmen, nur um sicher zu sein ich die richtige Anwendung wurde deinstallieren.

Ich werde meinen eigenen kleinen Beitrag leisten. Ich brauchte eine Liste von Paketen aus dem gleichen Computer zu entfernen. Dies ist das Skript, das ich kam mit.

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

Ich hoffe, dies erweist sich als nützlich sein.

Beachten Sie, dass ich David Stetler den Kredit für dieses Skript zu verdanken, da es basiert auf seinem.

Hier wird der Powershell-Skript mit msiexec:

echo "Getting product code"
$ProductCode = Get-WmiObject win32_product -Filter "Name='Name of my Software in Add Remove Program Window'" | Select-Object -Expand IdentifyingNumber
echo "removing Product"
# Out-Null argument is just for keeping the power shell command window waiting for msiexec command to finish else it moves to execute the next echo command
& msiexec /x $ProductCode | Out-Null
echo "uninstallation finished"

Eine Codezeile:

get-package *notepad* |% { & $_.Meta.Attributes["UninstallString"]}

Verwendung:

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}"

Es ist nicht vollständig getestet, aber es lief unter Powershell 4.

Ich habe die PS1-Datei ausführen, da es hier zu sehen ist. Lassen sie abrufen alle Systeme aus dem AD und versuchen, mehrere Anwendungen auf allen Systemen zu deinstallieren.

Ich habe die IdentifyingNumber verwendet für die Software Ursache von David Stetlers Eingang zu suchen.

Nicht getestet:

  1. Nicht-IDs auf den Aufruf der Funktion im Skript hinzufügen, anstatt das Skript mit dem Parameter-IDs beginnend
  2. Das Skript wird mit mehr als 1 Computernamen nicht automatisch von der Funktion abgerufen
  3. Abrufen von Daten aus dem Rohr
  4. Verwenden von IP-Adressen in dem System
  5. verbinden

Was es nicht:

  1. Es spielt keine Auskunft geben, ob die Software tatsächlich auf einem bestimmten System gefunden wurde.
  2. Sie geben keine Auskunft über Erfolg oder Misserfolg der Deinstallation.

Ich war nicht in der Lage zu deinstallieren () zu verwenden. Der Versuch, dass ich einen Fehler habe mir zu sagen, dass ein Verfahren für einen Ausdruck Aufruf, der einen Wert von NULL hat nicht möglich ist. Stattdessen benutzte ich Remove-WmiObject, die das gleiche zu erreichen scheint.

ACHTUNG: . Ohne einen Computernamen gegeben entfernt es die Software von Alle Systeme im Active Directory

Die meisten meiner Programme die Skripte in diesem Beitrag hat den Job. Aber ich hatte ein Vermächtnis Programm Gesicht, dass ich nicht mit msiexec.exe oder Win32_Product Klasse entfernen konnte. (Aus irgendeinem Grund habe ich exit 0, aber das Programm war immer noch da)

Meine Lösung war Win32_Process Klasse zu verwenden:

mit Hilfe von nickdnk dieser Befehl ist die Deinstallation exe-Datei Pfad zu bekommen:

64bit:

[array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match $programName } | select UninstallString

32bit:

 [array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match $programName } | select UninstallString

Sie werden das Ergebnis Zeichenfolge reinigen haben:

$uninstallPath = $unInstallPathReg[0].UninstallString
$uninstallPath = $uninstallPath -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X",""
$uninstallPath = $uninstallPath .Trim()

jetzt, wenn Sie den entsprechenden Programm deinstallieren exe Dateipfad Sie diesen Befehl verwenden können:

$uninstallResult = (Get-WMIObject -List -Verbose | Where-Object {$_.Name -eq "Win32_Process"}).InvokeMethod("Create","$unInstallPath")
  

$ uninstallResult - wird die Exit-Code haben. 0 Erfolg

die oben genannten Befehle auch aus der Ferne ausgeführt werden kann - ich habe es Befehl aufrufen, aber ich glaube, dass das Argument, das Hinzufügen -computername arbeiten

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top