Как я могу удалить приложение с помощью PowerShell? - PullRequest
117 голосов
/ 22 сентября 2008

Есть ли простой способ подключиться к стандартной функции Установка и удаление программ , используя PowerShell для удаления существующего приложения ? Или проверить, установлено ли приложение?

Ответы [ 12 ]

0 голосов
/ 26 июня 2017

Для большинства моих программ скрипты в этом посте сделали свою работу. Но мне пришлось столкнуться с устаревшей программой, которую я не мог удалить с помощью msiexec.exe или класса Win32_Product. (по какой-то причине я получил выход 0, но программа все еще была там)

Мое решение было использовать класс Win32_Process:

с помощью nickdnk эта команда для получения пути удаления файла exe:

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

вам придется очистить строку результата:

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

теперь, когда у вас есть программа удаления файла exe, путь к файлу вы можете использовать эту команду:

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

$ uninstallResult - будет иметь код выхода. 0 - успех

вышеприведенные команды также могут выполняться удаленно - я сделал это с помощью команды invoke, но я считаю, что добавление аргумента -computername может работать

0 голосов
/ 12 марта 2014

Использование:

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

Он не полностью протестирован, но работает под PowerShell 4.

Я запустил файл PS1, как показано здесь. Позволяет ему извлечь все системы из AD и пытается удалить несколько приложений во всех системах.

Я использовал IdentifyingNumber для поиска причины программного обеспечения ввода Дэвида Стетлерса.

Не тестировалось:

  1. Не добавлять идентификаторы к вызову функции в скрипте, вместо этого запускать скрипт с идентификаторами параметров
  2. Вызов сценария с более чем одним именем компьютера не , автоматически извлекаемый из функции
  3. Получение данных из канала
  4. Использование IP-адресов для подключения к системе

Чего нет:

  1. Он не дает никакой информации, если программное обеспечение действительно было найдено в какой-либо конкретной системе.
  2. Он не дает никакой информации о сбое или успешном завершении деинсталляции.

Я не смог использовать uninstall (). При попытке получить ошибку, сообщающую, что вызов метода для выражения со значением NULL невозможен. Вместо этого я использовал Remove-WmiObject, который, кажется, выполняет то же самое.

ВНИМАНИЕ : без указания имени компьютера оно удаляет программное обеспечение из ALL систем в Active Directory.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...