none
Скрипты в PowerShell не видит все программы из установки и удаления RRS feed

  • Вопрос

  • подскажите как нужно прописать чтобы PowerShell видел не только Msi установленные программы. Видел что можно вытащить запись как то из реестра, но как ее вставить в скрипт.
    22 июня 2016 г. 6:51

Ответы

  • я у себя удалял sccm-ом. использовал батник:

    @echo off
    setlocal EnableDelayedExpansion
    set sw=HKLM\SOFTWARE
    set u=Microsoft\Windows\CurrentVersion\Uninstall
    set k=WinRAR archiver
    if not "%ProgramFiles(x86)%"=="" (
    :x64
    reg query "%sw%\%u%\%k%" > nul 2>&1
    if !errorlevel!==0 (
    "%programfiles%\WinRAR\Uninstall.exe" /S
    :x64key64
    reg query "%sw%\%u%\%k%" > nul 2>&1
    if !errorlevel!==0 (
    "%~dp0sleep.exe" 1
    goto x64key64
    )
    rd "%programfiles%\WinRAR" /Q /S
    )
    reg query "%sw%\Wow6432Node\%u%\%k%" > nul 2>&1
    if !errorlevel!==0 (
    "%programfiles(x86)%\WinRAR\Uninstall.exe" /S
    :x64key86
    reg query "%sw%\Wow6432Node\%u%\%k%" > nul 2>&1
    if !errorlevel!==0 (
    "%~dp0sleep.exe" 1
    goto x64key86
    )
    rd "%programfiles(x86)%\WinRAR" /Q /S
    )
    goto exit
    )
    :x86
    reg query "%sw%\%u%\%k%" > nul 2>&1
    if !errorlevel!==0 (
    "%programfiles%\WinRAR\Uninstall.exe" /S
    :CheckUninstallKey
    reg query "%sw%\%u%\%k%" > nul 2>&1
    if !errorlevel!==0 (
    "%~dp0sleep.exe" 1
    goto CheckUninstallKey
    )
    rd "%programfiles%\WinRAR" /Q /S
    )
    :exit
    endlocal

    Сделайте апликейшн и распространите на коллекцию.

    Ну или в принципе можно в логон скрипте через GPO.

    • Помечено в качестве ответа Dragonid 28 июня 2016 г. 9:36
    24 июня 2016 г. 9:44

Все ответы

  • Скрипт - Get-RemoteProgram Get list of installed programs on remote or local computer - https://gallery.technet.microsoft.com/scriptcenter/Get-RemoteProgram-Get-list-de9fd2b4

    Можно добавить свои ключи, через запятую:

    $RegistryLocation = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\',
                                'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\'

    22 июня 2016 г. 7:02
    Отвечающий
  • я только начинающий разбираться в этих скрипах. Так что для меня это все впервые.

     

    $pc = "Isaev"
    #$nameprog = "Libre%"
    #$nameprog = "Microsoft%"

    Get-WMIObject -ComputerName $pc -class win32_product  | Select-Object -Property Name 

    $pc =   "Romanova-NG"
    $prog = "Архиватор WinRAR"
    (Get-WmiObject -ComputerName $pc Win32_Product -Filter "Name = '$prog'").Uninstall()

    Вот есть 2 срипты, мне нужно заменить в первом скрипте -class win32_product на предложенные вами?

    $RegistryLocation = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\',
                                'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\'

    22 июня 2016 г. 7:18
  • Так научитесь читать тогда, переходите по ссылке и используйте скрипт.

    Для получения:

    Get-RemoteProgram -Property UninstallString | fl *

    Для удаления:

    Get-RemoteProgram -Property UninstallString | Where {$_.ProgramName -match "Skype"} | Foreach {& $_.UninstallString}

    • Изменено KazunEditor 22 июня 2016 г. 7:35
    • Помечено в качестве ответа Dragonid 22 июня 2016 г. 8:53
    • Снята пометка об ответе Dragonid 23 июня 2016 г. 9:16
    22 июня 2016 г. 7:25
    Отвечающий
  • cпасибо, буду разбираться. 

    • Изменено Dragonid 22 июня 2016 г. 9:49
    22 июня 2016 г. 8:53
  • скрипт на удаление не удаляет программу.
    22 июня 2016 г. 9:53
  • скрипт на удаление не удаляет программу.
    Где скрин с ошибкой? Где строка Uninstallstring которая выполняется? Где пример вывода?
    22 июня 2016 г. 10:04
    Отвечающий
  • Вот выполняю 1 скрипт нашел на удаленном компьютере программы.

    Теперь хочу удалить WinRAR, версия 5.00 и выдает вот ошибку

    23 июня 2016 г. 6:25
  • вы скрипт запускаете на машине romanova-ng? WinRar вы нашли на ПК romanova-ng а удаляете локально

    проверьте что на ПК где запускается скрипт есть путь указанный на ошибке


    The opinion expressed by me is not an official position of Microsoft

    23 июня 2016 г. 6:47
    Модератор
  • Нет, я запускаю под администратором со своего компьютера. Включил удаленный доступ к реестру на другом компьютере, и после полученной информации хочу удалить, но вот выдает ошибку. Путь правильный.  он и в реестре записан так же
    23 июня 2016 г. 7:08
  • И вот второй вопрос, из-за чего после того как закрыл  PowerShell и заново открыл. При написание того же скрипта выдается вот такая ошибка 
    23 июня 2016 г. 7:12
  • Нет, я запускаю под администратором со своего компьютера. Включил удаленный доступ к реестру на другом компьютере, и после полученной информации хочу удалить, но вот выдает ошибку. Путь правильный.  он и в реестре записан так же

    на вашем компьютере есть данный путь? вы запускаете удаление у себя, а не на удаленном компьютере

    На бытовом уровне вы спросили у друга что из еды есть на кухне, находясь при этом в комнате, друг сообщил что есть хлеб и яблоки, вы подумали что хотите пол яблока взяли нож и наткнулись на проблему - яблока нет в комнате, как следствие вам нужно или на кухню сходить или завести яблоки в комнате (например попросить принести)


    The opinion expressed by me is not an official position of Microsoft


    23 июня 2016 г. 7:15
    Модератор
  • И вот второй вопрос, из-за чего после того как закрыл  PowerShell и заново открыл. При написание того же скрипта выдается вот такая ошибка 

    Вы используете нестандартную функцию, которой нет в стандартных расположениях, как следствие пош ничего о ней не знает, о чем вам и пишет в ошибке

    если вы хотите использовать нестандартную функцию вам нужно ее импортировать (применимо для обычной консоли и исе) через

    import-module .\desktop\func.ps1

    или выполнить код функции в исе


    The opinion expressed by me is not an official position of Microsoft


    23 июня 2016 г. 7:34
    Модератор
  • для удаления приложения на удаленной машине вы можете подключиться через winrm и запустить команду на выполнение

    .... Foreach {
       Invoke-Command -ComputerName $_.ComputerName -ScriptBlock {& $Args[0]} -ArgumentList $_.UninstallString
    }

    как сконфигурировать winrm есть пошаговые инструкции


    The opinion expressed by me is not an official position of Microsoft



    23 июня 2016 г. 7:39
    Модератор
  • Да имеется данный путь. 
    23 июня 2016 г. 7:46
  • Да имеется данный путь. 

    попробуйте 

    .... Foreach {
       $_.UninstallString
       test-path $_.UninstallString
       test-path $($_.UninstallString -replace '"')
    }
    Покажите вывод


    The opinion expressed by me is not an official position of Microsoft

    23 июня 2016 г. 7:55
    Модератор
  • спасиб, сейчас с импортом разобрался. Все работает и обновился до 4 версии. сейчас попробую скинуть 
    23 июня 2016 г. 8:42
  • при скайпе 

    а при Winrare вот это получилось

    23 июня 2016 г. 8:47
  • посл настройки winrm 
    23 июня 2016 г. 9:15
  • В таком случае в invoke-command поменяйте 

     -ArgumentList $_.UninstallString

    На

    -argumentlist $($_.UninstallString -replace '"')


    The opinion expressed by me is not an official position of Microsoft

    23 июня 2016 г. 10:12
    Модератор
  • Invoke-Command -ComputerName $_.ComputerName -ScriptBlock { 
    	param($app)
    	
    	if ($app[0] -eq '"') {
    		Invoke-Expression "& $app"
    	}
    	else {
    		Invoke-Expression $app
    	}
    } -ArgumentList $_.UninstallString

    Ps. -replace заменит все " и в пути с пробелом возникнет проблема.
    • Изменено KazunEditor 23 июня 2016 г. 16:18
    23 июня 2016 г. 14:16
    Отвечающий
  • пишет выполнено, но программа не удалена
    24 июня 2016 г. 6:10
  • так же никаких действий
    24 июня 2016 г. 6:21
  • Вы пробовали выполнить строку uninstall на своем ПК или любом другом?

    У каждой софтины свой установщик и у него свои ключи. Например если вы запускаете удаление винрара, скорее всего запуститься окно с вопросом что вы хотите сделать, скрипт по умолчанию не умеет взаимодействовать с окнами

    Вы запустили програму (и она где то там висит на удаленной машине), и скрипт отработал. Для запуска удаления в тихом режиме как правило используются ключи /s или /q но могут быть и другие

    Все ключи нужно гуглить под конкретную программу, иногда даже под конкретную версию программы

    Судя по форуму для винрара используется ключ /s 

    как итог

    -argumentlist "$($_.UninstallString -replace '"') /s"

    PS Пишите код кодом, а не картинками, в таком случае есть больше шансов что кто то не поленится и поправит пол строчки кода (уже готового написаного) и все заведется, а компоновать куски или тем более перенабирать с картинки никто не будет

    Так же не плодите одинаковые темы


    The opinion expressed by me is not an official position of Microsoft


    24 июня 2016 г. 7:48
    Модератор
  • Не все приложения можно удалить автоматически. Конкретно для WinRAR требуется добавлять ключ /s:

    Invoke-Command -ComputerName $_.ComputerName -ScriptBlock { 
    	param($app)
    	
    	if ($app[0] -eq '"') {
    		Invoke-Expression "& $app /s"
    	}
    	else {
    		&"$app" /s
    	}
    } -ArgumentList $_.UninstallString

    24 июня 2016 г. 7:52
    Отвечающий
  • Извиняюсь за это, 

    Get-RemoteProgram -ComputerName "Romanova-NG" -Property UninstallString | Where {$_.ProgramName -match "WinRAR, версия 5.00"} | Foreach {
       Invoke-Command -ComputerName $_.ComputerName -ScriptBlock {& $Args[0]} -ArgumentList "$($_.UninstallString -replace '"') /s"
    }

    Имя "C:\Program Files\WinRAR\unins000.exe /s" не распознано как имя командлета, функции, файла скрипта или выполняемой программы. Проверьте правильность написания имени,
     а также наличие и правильность пути, после чего повторите попытку.
        + CategoryInfo          : ObjectNotFound: (C:\Program Files\WinRAR\unins000.exe /s:String) [], CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException
        + PSComputerName        : Romanova-NG

    Ну при удаление выдается окно, уверенны ли  вы что хотите удалить WinRAR

    24 июня 2016 г. 8:17
  • Скопируйте команду мою выше, если не хватает знаний правильно указать /s.
    24 июня 2016 г. 8:21
    Отвечающий
  • Пишет выполнено, но программа находиться все так же установленна


    Get-RemoteProgram -ComputerName "Romanova-NG" -Property UninstallString | Where {$_.ProgramName -match "WinRAR, версия 5.00"} | Foreach {
    Invoke-Command -ComputerName $_.ComputerName -ScriptBlock { 
    param($app)
    
    if ($app[0] -eq '"') {
    Invoke-Expression "& $app /s"
    }
    else {
    &"$app" /s
    }
    } -ArgumentList $_.UninstallString
    }



    • Изменено Vector BCOModerator 24 июня 2016 г. 9:39 Оформил скрипт блок
    24 июня 2016 г. 8:29
  • скажите а Вам обязательно на PoSh нужно? можно в принципе батник слепить и им продеинсталировать
    24 июня 2016 г. 9:14
  • Выложите упакованную папку WinRAR или установщик, т.к. с официального сайта проблем с удалением - нет.

    PS > Get-RemoteProgram -Computer 192.168.0.2 -Property UninstallString | fl
    
    ProgramName     : WinRAR 5.00 (64-bit)
    UninstallString : C:\Program Files\WinRAR\uninstall.exe
    
    ProgramName     : WinRAR 5.00 (32-bit)
    UninstallString : C:\Program Files (x86)\WinRAR\uninstall.exe
    
    PS > Get-RemoteProgram -Computer 192.168.0.2 -Property UninstallString | Foreach {
    	Invoke-Command -ComputerName 192.168.0.2 -credential "Contoso\Administrator" -ScriptBlock { 
    		param($app)
    		
    		if ($app[0] -eq '"') {
    			Invoke-Expression "& $app /s"
    		}
    		else {
    			&"$app" /s
    		}
    	} -ArgumentList $_.UninstallString
    }
    
    PS > Get-RemoteProgram -Computer 192.168.0.2 -Property UninstallString | fl


    Возможно попробовать ключ silent,вместо s:

    Invoke-Command -ComputerName $_.ComputerName -ScriptBlock { 
    	param($app)
    	
    	if ($app[0] -eq '"') {
    		Invoke-Expression "& $app /silent"
    	}
    	else {
    		&"$app" /silent
    	}
    } -ArgumentList $_.UninstallString

    • Изменено KazunEditor 24 июня 2016 г. 9:24
    24 июня 2016 г. 9:20
    Отвечающий
  • мне на чем угодно можно, главное чтоб удалилась программа на удаленном компьютере без участия пользователя
    24 июня 2016 г. 9:23
  • а теперь подробнее про Вашу инфраструктуру:

    -есть ли у Вас домен? компьютеры члены домена?

    -есть ли у Вас SCCM?

    24 июня 2016 г. 9:25
  • https://yadi.sk/d/uyLQg1zrskyJC

    Мой яндекс диск если что, а у меня выдает при выборке в реестре 

    ProgramName     : WinRAR, версия 5.00
    ComputerName    : Romanova-NG
    UninstallString : "C:\Program Files\WinRAR\unins000.exe"
    24 июня 2016 г. 9:26
  • С ключом /silent отрабатывает:

    Invoke-Command -ComputerName $_.ComputerName -ScriptBlock { 
    	param($app)
    	
    	if ($app[0] -eq '"') {
    		Invoke-Expression "& $app /silent"
    	}
    	else {
    		&"$app" /silent
    	}
    } -ArgumentList $_.UninstallString

    24 июня 2016 г. 9:29
    Отвечающий
  • а зачем Вы выложили установщик? я Вас про домен спрашивал. у Вас компьютеры члены домена или рабочей группы?
    24 июня 2016 г. 9:31
  • Выложите упакованную папку WinRAR или установщик, т.к. с официального сайта проблем с удалением - нет.

    я это прочитал.

    извиняюсь

    в домене

    Да  SCCM есть

    24 июня 2016 г. 9:37
  • С ключом /silent отрабатывает:

    Invoke-Command -ComputerName $_.ComputerName -ScriptBlock { 
    	param($app)
    	
    	if ($app[0] -eq '"') {
    		Invoke-Expression "& $app /silent"
    	}
    	else {
    		&"$app" /silent
    	}
    } -ArgumentList $_.UninstallString
    Просто не хочет реагировать удаленный компьютер..
    24 июня 2016 г. 9:43
  • я у себя удалял sccm-ом. использовал батник:

    @echo off
    setlocal EnableDelayedExpansion
    set sw=HKLM\SOFTWARE
    set u=Microsoft\Windows\CurrentVersion\Uninstall
    set k=WinRAR archiver
    if not "%ProgramFiles(x86)%"=="" (
    :x64
    reg query "%sw%\%u%\%k%" > nul 2>&1
    if !errorlevel!==0 (
    "%programfiles%\WinRAR\Uninstall.exe" /S
    :x64key64
    reg query "%sw%\%u%\%k%" > nul 2>&1
    if !errorlevel!==0 (
    "%~dp0sleep.exe" 1
    goto x64key64
    )
    rd "%programfiles%\WinRAR" /Q /S
    )
    reg query "%sw%\Wow6432Node\%u%\%k%" > nul 2>&1
    if !errorlevel!==0 (
    "%programfiles(x86)%\WinRAR\Uninstall.exe" /S
    :x64key86
    reg query "%sw%\Wow6432Node\%u%\%k%" > nul 2>&1
    if !errorlevel!==0 (
    "%~dp0sleep.exe" 1
    goto x64key86
    )
    rd "%programfiles(x86)%\WinRAR" /Q /S
    )
    goto exit
    )
    :x86
    reg query "%sw%\%u%\%k%" > nul 2>&1
    if !errorlevel!==0 (
    "%programfiles%\WinRAR\Uninstall.exe" /S
    :CheckUninstallKey
    reg query "%sw%\%u%\%k%" > nul 2>&1
    if !errorlevel!==0 (
    "%~dp0sleep.exe" 1
    goto CheckUninstallKey
    )
    rd "%programfiles%\WinRAR" /Q /S
    )
    :exit
    endlocal

    Сделайте апликейшн и распространите на коллекцию.

    Ну или в принципе можно в логон скрипте через GPO.

    • Помечено в качестве ответа Dragonid 28 июня 2016 г. 9:36
    24 июня 2016 г. 9:44
  • спасибо попробую, у меня еще 1 идея возникла перезаписи программы на готовый msi пакет
    24 июня 2016 г. 9:52