Powershell удаление программ на удаленном компьютере

Обновлено: 04.07.2024

Существует довольно много методов для работы с удаленными компьютерами. Есть Windows Management Instrumentation (WMI), широко используемый в VBScript. Есть различные утилиты, которые позволяют осуществлять удаленное управление, типа PSExec от Sysinternals. Даже многие командлеты PowerShell имеют параметр ComputerName для выполнения на удаленных компьютерах.

В отличие от утилит, использующих различные программные интерфейсы, PS Remoting работает следующим образом: команды, вводимые на локальном компьютере, передаются на удаленный компьютер и там выполняются, затем результат передается обратно. Поскольку все команды выполняются локально, нет необходимости заботится о совместимости. Кроме того, для работы PS Remoting нужен всего один открытый порт на брандмауэре.

Есть несколько способов управления с помощью PowerShell Remoting.

Управление «один к одному»

Enter-PSSession -ComputerName SRV4
Restart-Service -Name spooler

Посмотрим состояние сервиса и закроем удаленную сессию:

Get-Service -Name spooler
Exit-PSSession

интерактивная сессия в PowerShell

Интерактивная работа подходит для решения несложных задач удаленного администрирования. Если же надо автоматизировать процесс, то лучше воспользоваться командлетом Invoke-Command . Вот так с его помощью можно сделать то же самое действие:

Invoke-Command -ScriptBlock -ComputerName SRV4

Эта команда откроет удаленную сессию на SRV4, выполнит блок команд, указанный в параметре -ScriptBlock , и закроет сессию. А чтобы задание выполнялось в фоновом режиме, дополнительно можно указать параметр -AsJob .

выполнение команды на удаленном компьютере

Cледует помнить о том, что при работе в фоновом режиме PowerShell не возвращает результат. Для его получения придется воспользоваться командлетом Receive-Job .

выполнение команды на удаленном компьютере в фоновом режиме

Для того, чтобы выполнить не пару-тройку команд, а какой либо скрипт, у Invoke-Command есть параметр –FilePath , который можно использовать вместо –ScriptBlock для определения файла сценария. Для примера я создал скрипт, который выводит список остановленных служб и запустил его на удаленной машине SRV4:

Invoke-Command -FilePath .\script.ps1 -ComputerName SRV4

запуск скрипта PowerShell на удаленном компьютере

Управление «один ко многим»

Довольно часть возникает необходимость параллельно выполнить одну задачу на нескольких компьютерах. Это довольно легко можно сделать с помощью того же Invoke-Command . Например, имена компьютеров можно просто перечислить через запятую:

Invoke-Command -ScriptBlock -ComputerName SRV4,SRV5

Поместить в переменную:

$servers = @(″SRV1″,″SRV2″,″SRV3″)
Invoke-Command -ScriptBlock -ComputerName $servers

Или взять из файла:

Invoke-Command -ScriptBlock -ComputerName`
(Get-Content .\servers.txt)

одновременное выполнение команды на нескольких компьютерах

Примечание: у Invoke-Command есть параметр ThrottleLimit , ограничивающий максимальное количество компьютеров, которыми можно управлять одновременно. По умолчанию этот параметр равен 32. При необходимости его можно изменить, но учтите, что повышение этого параметра увеличит нагрузку на процессор и память вашего компьютера, поэтому эту операцию нужно выполнять с большой осторожностью.

Сессии

Каждый раз при выполнении Invoke-Command создается новая сессия, на создание которой тратится время и ресурсы. Чтобы этого избежать мы можем открыть одну сессию, в которой и выполнять все команды. Например, откроем сессию с именем SRV4 на компьютер SRV4 и поместим ее в переменную $session, а затем этой сессии выполним нашу задачу (остановим многострадальный spooler):

$session = New-PSSession -ComputerName SRV4 -Name SRV4
Invoke-Command -ScriptBlock `
-Session $session

открытие удаленной сессии в PowerShell

А теперь несколько интересных возможностей, появившихся в PowerShell 3.0. Если раньше при выходе из сессии или закрытии консоли сессия удалялась, то в PS 3.0 при закрытии сессия переходит в состояние disconnected. Мы можем открыть новый сеанс на этом же (или любом другом) компьютере и выполнить команду прямо в этой отключенной сессии. В качестве примера стартуем на компьютере SRV4 сервис печати, остановленный в прошлый раз:

Invoke-Command -ScriptBlock `
-ComputerName SRV4 -Disconnected

выполнение команды в разъединенной удаленной сессии

$session = New-PSSession -ComputerName SRV4 -Name LongJob
Invoke-Command -Session $session -ScriptBlock`
> -AsJob

Посмотрим, как выполняется задача и закроем сессию:

Receive-Job -Name Job2
Disconnect-PSSession $session

запуск задания в удаленной сессии

Идем на другой компьютер и открываем консоль, Подключаемся к сессии LongJob и с помощью командлета Receive-PSSession получаем результат выполнения задания:

Connect-PSSession -Name LongJob -ComputerName SRV4
Receive-PSSession -Name LongJob

подключение к удаленной сессии

Или еще вариант, без явного подключения к сессии с помощью Connect-PSSession :

$session = Get-PSSession -Name LongJob -ComputerName SRV4
$job = Receive-PSSession $session -OutTarget Job
Receive-Job $job

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

Примечание: для того, чтобы результат остался в системе, Receive-Job надо использовать с параметром -Keep .

Неявное удаленное управление

Для примера берем обычную рабочую станцию, без установленных средств удаленного администрирования. Создаем удаленную сессию с контроллером домена SRV4 и импортируем в эту сессию модуль Active Directory:

$session = New-PSSession -ComputerName SRV4
Invoke-Command -Session $session

Затем экспортируем из удаленной сессии командлеты Active Directory и помещаем их в локальный модуль RemoteAD:

Export-PSSession -Session $session -CommandName *-AD* -OutputModule RemoteAD`
-AllowClobber

Эта команда создаст в папке WindowsPowerShell\Modules\RemoteAD новый модуль PowerShell. Загружены будут только командлеты с именами, соответствующими шаблону *-AD*. При этом сами командлеты не копируются на локальный компьютер. Локальный модуль служит своего рода ярлыком, а сами команды будут выполняться на удаленном контроллере домена.

После создания модуля удаленную сессию можно закрыть, она больше не понадобится.

импорт удаленного модуля PowerShell

Импортируем новый модуль в текущий сеанс (в PS 3.0 можно этот шаг пропустить):

New-ADUser -Name BillGates -Company Microsoft
Get-ADUser BillGates

При этом будет восстановлено удаленное подключение к контроллеру домена, после чего команда будет передана на контроллер домена и там выполнена. Результат выполнения будет сериализован в XML и передан по сети на локальный компьютер, где будет выполнена десериализация в объекты, с которыми может работать PowerShell.

Удаленный сеанс будет активным до тех пор, пока вы не закроете консоль или не удалите модуль RemoteAD.

неявное удаленное управление в PowerShell

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

В заключение скажу, что на данный момент PowerShell Remoting является основным инструментом для удаленного управления операционными системами Windows. Поэтому знать о его возможностях и уметь ими пользоваться просто необходимо любому Windows-администратору.

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

Отключить антивирус удаленно на примере KAV

psexec \ \ ComputerName "C:\Program Files (x86)\Kaspersky Lab\Kaspersky Endpoint Security 10 for Windows SP2\avp.com" exit / login = KLAdmin / password = < Pass >

Отключение встроенного брандмауэра для всех профилей (только локально)

powershell - command "Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False"

Для удаленного отключения брандмауэра должен быть доступен Сервер RPC. Доступ к которому блокирует включенный брандмауэр 😂🤣 Такая рекурсия.

Поэтому, как всегда, пойдем обходным путем:

psexec \ \ CompName netsh - c advfirewall set allprofiles state off

Команда на включение брандмауэра, соответственно, будет state on

Удаление программы
wmic / node : CompName process where "ExecutablePath like '%7-zip%'" get Description / format : list wmic / node : CompName process where "ExecutablePath like '%7-zip%'" delete wmic / node : CompName product where "name like '%7-zip%'" list brief wmic / node : CompName product where "name like '%7-zip%'" call uninstall / nointeractive


Установка программы

Тихая установка с предварительным копированием программы на удаленный хост

copy "C:\Distr\7z1900-x64.msi" "\\CompName\C$\Share\7z1900-x64.msi" psexec \ \ CompName cmd / c "msiexec.exe /i C:\7z1900-x64.msi /quiet /norestart"

Установка с сетевого ресурса

psexec \ \ CompName - s cmd / c "msiexec /i \\CompName\Share\7z1900-x64.msi /quiet /norestart"


Получить список программ

Получать список установленных в системе программ лучше из реестра, нежели средствами WMI. Этот метод работает намного быстрее, чем при использовании
Get-WmiObject -Class Win32_Product

В PowerShell доступно множество различных способов выполнения команд на удаленных компьютерах. В последней главе вы узнали, как удаленно запрашивать WMI с помощью командлетов CIM. PowerShell также содержит несколько командлетов со встроенным параметром ComputerName.

Как показано в следующем примере, Get-Command можно использовать с параметром ParameterName, чтобы определить, какие команды имеют параметр ComputerName.

Параметр ComputerName есть у команд Get-Process и Get-Hotfix . Следует отметить, что для корпорации Майкрософт это не то долгосрочное направление, которого следует придерживаться для выполнения команд на удаленных компьютерах. Даже если вы нашли команду с параметром ComputerName, скорее всего, вам потребуется указать альтернативные учетные данные и у команды не будет параметра Credential. Если вы решили запустить PowerShell из учетной записи с повышенными привилегиями, брандмауэр между вами и удаленным компьютером может заблокировать запрос.

Чтобы использовать команды удаленного взаимодействия PowerShell, которые демонстрируются в этой главе, необходимо включить удаленное взаимодействие PowerShell на удаленном компьютере. Это можно сделать с помощью командлета Enable-PSRemoting .

Удаленное взаимодействие "один к одному"

Если вы хотите, чтобы удаленный сеанс был интерактивным, то в этом случае подойдет удаленное взаимодействие "один к одному". Этот тип удаленного взаимодействия предоставляется с помощью командлета Enter-PSSession .

В последней главе учетные данные администратора домена были сохранены в переменной с именем $Cred . Если вы еще не сделали этого, сохраните учетные данные администратора домена в переменной $Cred .

После этого вы сможете ввести учетные данные один раз и использовать их для каждой команды в активном текущем сеансе PowerShell.

Создайте сеанс удаленного взаимодействия PowerShell "один к одному" с контроллером домена DC01.

Обратите внимание, что в предыдущем примере перед запросом PowerShell стоит [dc01] . Это означает, что вы находитесь в интерактивном сеансе PowerShell с удаленным компьютером dc01. Все запускаемые команды выполняются на компьютере dc01, а не на локальном компьютере. Кроме того, помните, что у вас есть доступ только к командам PowerShell, которые существуют на удаленном, а не на локальном компьютере. Иными словами, если на компьютере установлены дополнительные модули, они недоступны на удаленном компьютере.

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

Завершив работу на удаленном компьютере, выйдите из сеанса удаленного взаимодействия "один к одному" с помощью командлета Exit-PSSession .

<a name="one-to-many-remoting">Удаленное взаимодействие "один ко многим"

Иногда может потребоваться выполнить задачу в интерактивном режиме на удаленном компьютере. Удаленное взаимодействие гораздо более эффективно при выполнении задачи на нескольких удаленных компьютерах одновременно. С помощью командлета Invoke-Command выполните команду на одном удаленном компьютере или нескольких одновременно.

В предыдущем примере на три сервера были отправлены запросы состояния службы времени Windows. Командлет Get-Service был помещен в блок сценария Invoke-Command . На самом деле сценарий Get-Service выполняется на удаленном компьютере и результаты возвращаются на локальный компьютер в виде десериализованных объектов.

Передача предыдущей команды в Get-Member подтверждает, что результаты действительно десериализованы.

Обратите внимание, что в десериализованных объектах отсутствует большинство методов. Это значит, что они не являются активными объектами, они инертны. Нельзя запускать или останавливать службу с помощью десериализованного объекта, так как он является моментальным снимком состояния этого объекта на момент выполнения команды на удаленном компьютере.

Это не значит, что вы не можете запускать или прекращать работу службы с помощью метода Invoke-Command . Это просто значит, что метод должен быть вызван в удаленном сеансе.

Чтобы доказать это, далее я остановлю службу времени Windows на всех трех удаленных серверах с помощью метода Stop() .

Как отмечалось в предыдущей главе, если для выполнения задачи существует командлет, рекомендуется использовать его, а не метод. В предыдущем сценарии вместо метода остановки советую выполнить командлет Stop-Service . Чтобы доказать свою точку зрения, я решил использовать метод Stop() , так как многие люди ошибочно полагают, что в рамках удаленного взаимодействия PowerShell вызывать методы невозможно. Их нельзя вызывать в возвращаемом объекте, потому что он десериализован, но можно вызывать в самом удаленном сеансе.

Сеансы PowerShell

В последнем примере в предыдущем разделе выполнялись две команды с помощью командлета Invoke-Command . Это означает, что для их запуска прошлось бы настроить два отдельных сеанса.

Подобно сеансам CIM, обсуждаемым в главе 7, сеанс PowerShell на удаленном компьютере можно использовать для запуска нескольких команд на удаленном компьютере без дополнительных затрат на создание нового сеанса для каждой отдельной команды.

Создайте сеанс PowerShell с каждым из трех компьютеров, с которыми мы работали в этой главе, — DC01, SQL02 и WEB01.

С помощью переменной $Session запустите службу времени Windows с использованием метода и проверьте состояние службы.

После создания сеанса с использованием альтернативных учетных данных указывать учетные данные при каждом выполнении команды не требуется.

Завершив работу с сеансами, не забудьте удалить их.

Сводка

В этой главе вы узнали об удаленном взаимодействии PowerShell, научились выполнять команды в интерактивном сеансе с одним удаленным компьютером и поняли, как выполнять команды на нескольких компьютерах с помощью удаленного взаимодействия "один ко многим". Вы также узнали о преимуществах использования сеанса PowerShell при выполнении нескольких команд на одном удаленном компьютере.

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

Естественно, что этого недостаточно для выполнения многих видов деятельности на компьютере. Чтобы решить эту проблему, на ПК устанавливается дополнительное программное обеспечение.

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

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

Чтобы удалить программу с компьютера можно воспользоваться системными средствами Windows или сторонним программным обеспечением. Можно использовать любой из этих способов. Сторонние приложения-деинсталляторы имеют дополнительный функционал, это позволяет им более тщательно подчищать следы от удаленных программ на компьютере.

В этом руководстве мы рассмотрим один из способов деинсталляции ненужных приложений: удаление программы через командную строку и удаление программ через PowerShell.

Большей части пользователей удобнее использовать графический интерфейс средства удаления программ Windows или программы-деинсталлятора. Но, есть и другой метод решить эту задачу: удалить программу из PowerShell или из командной строки.

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

В этих случаях, можно воспользоваться консолью или более мощным инструментом — Windows PowerShell. Удаление программ через командную строку Windows выполняется одинаково в разных версиях операционной системы: Windows 10, Windows 8.1 (Windows 8), Windows 7.

Необходимо учитывать, что в окнах консоли отображаются не все установленные программы, а только те, которые для инсталляции на ПК использовали установщик Windows (установочные пакеты «.msi» приложений Win32).

Сначала мы посмотрим, как удалить программу с помощью командной строки, а затем сделаем тоже самое в Windows PowerShell.

Как удалить программу через командную строку

В Windows удаление программы из командной строки занимает не так много времени, и это — не сложная операция даже для неопытных пользователей. Необходимо выполнить лишь пару команд.

Запуск удаления программ из командной строки выполняется следующим способом:

    .
  1. В окне интерпретатора командной строки введите команду, а затем нажмите на клавишу «Enter»:

ввод команды

  1. Через некоторое время, в окне консоли появится список установленных приложений.

список программ

  1. Чтобы запустить удаление программ из командной строки, необходимо выполнить следующую команду:

удаление программы

  1. После завершения удаления приложения в окне интерпретатора командной строки отобразится информация о завершении этой операции.

Windows PowerShell — удаление программ

Помимо командной строки, в операционную систему Windows встроен более мощный инструмент — PowerShell. Выполнение задачи по деинсталляции происходит подобным образом при помощи других команд.

Пройдите следующие шаги:

    .
  1. В окне системного средства выполните команду:

список программ

  1. После выполнения команды, в окне оболочки отобразятся установленные на ПК приложения.

список программ

  1. Выполните следующую команду:
  1. Дождитесь завершения операции по удалению программы.

программа удалена

Выводы статьи

Обычно, на компьютере установлено довольно много программ, с помощью которых пользователь решает свои задачи. С течением времени, не все приложения становятся нужными или актуальными для использования в работе. Поэтому имеется смысл в деинсталляции ненужных программ с ПК.

Существует несколько способов для удаления программ в операционной системе Windows. Один из вариантов решения проблемы — деинсталляция приложений из командной строки или из Windows PowerShell.

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

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

для разрешения подключаться ко всем

Если вы открываете доступ для всех указав * то WinRM будет подключаться ко ВСЕМ машинам без проверки. Помните, что вы открываете самого себя для потенциального взлома из локальной сети. Лучше указывать адреса хостов куда вам нужно подключится, тогда WinRM будет отклонять все остальные адреса или имена. Если машина с которой ведется управление находится в домене она будет доверять всем машинам этого домена. Если она не в домене, или в другом домене, то нужно указать в TrustedHosts адрес или имя машины на которую мы будем подключаться. Добавлять себя на машине к которой мы подключаемся не нужно.

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

он проверяет на есть ли такая запись, если нет то добавляет в список. Вызывать можно из командной строки указав адрес или имя.

Есть разница указывать имя или адрес. Если в TrustedHosts будет только адрес то открыть сессию по имени не получится, и наоборот — если указать имя то прицепится по адресу не получится. Учитывайте это.

Часто встречается ссылка на команду

это не тоже самое что Enable-PSRemoting

Enable-PSRemoting делает больше действий чем «winrm quickconfig». Командлет Set-WSManQuickConfig делает точно такие же действия как «winrm quickconfig». Enable-PSRemoting запускает Set-WSManQuickConfig когда ведет настройку системы


Удаленные подключения
1. Сессии 1-to-1
открываются командой

Вы получите оболочку на удаленной машине. Подключится можно к самому себе указав localhost. Альтернативные кредиталы указываются с параметром -Credential, выход происходит командлетом Exit-PSSession

  • нельзя сделать второй прыжок — только 1 сессия, внутри сессии подключиться дальше нельзя
  • вы не можете использовать команды имеющие графический интерфейс. Если вы это сделаете оболочка повиснет, нажмите Ctrl+C чтобы отвисло
  • вы не можете запускать команды имеющие свой собственый шел, например nslookup, netsh
  • вы можете запускать скрипты если политика запуска на удаленной машине позволяет их запускать
  • нельзя прицепится к интерактивной сессии, вы заходите как «network logon», как будто прицепились к сетевому диску. Поэтому не запустятся логон скрипты, и вы можете не получить домашнюю папку на удаленной машине (лишний довод чтобы не мапать хом фолдеры логон скриптами)
  • вы не сможете взаимодействовать с юзером на удаленной машине даже если он туда залогинен. Не получится показать ему окошко или попечатать чтонибудь ему.
Комментарий.
объекты переданные по сети обрезаются и перестают быть живыми. У них удаляются методы, свойства остаются. Вытащить объект на свою машину, поколдовать и засунуть обратно не получится. Если нужно больше пишите, допишу отдельно.

2. Сессии 1-to-many

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

передаем на удаленные машины Test1 и Test2

за раз можно забросить на 32 машины. Если альтернативные кредиталы то используем параметр -Credential

Запомним что на той стороне будет новый скоп, так что ваш скрипт не получит значений из вашей консоли, а переменные скрипта могут оказаться на той стороне пустыми. Поэтому передавайте сразу целиком готовые инструкции и скрипты с параметрами.

kuda78
В статье пропущен очень важный момент — передача параметров в скрипт на удаленной машине.

Invoke-Command -Session $session -ScriptBlock $deployRemote -ArgumentList ($targetEnvName, $targetUsername)

Да действительно пропущен. Сделал сознательно чтобы не загромождать обзор параметрами и описаниями. Спасибо. Параметр -ArgumentList работает как со скрипт блоками так и со сценариями

3. Сессии
Это когда с той стороны создается копия пошика постоянно висящая в памяти, и в нее отправляются команды. Как результат к ней можно переподключится, ченить долгое запустить на исполнение, цепляться из разных скриптов или разными юзерами. Например у вас есть набор скриптов решающих одну задачу по частям, каждый из них поочереди может подключатся к одной удаленной сессии, видеть результаты работы предыдущих команд, иметь одни загруженные модули, общие переменные, общее окружение, до тех пор пока сессия не будет принудительно закрыта.

Создание сессии происходит командлетом New-PSSession, результат можно поместить в переменную

использовать можно такие же параметры подключения как в Invoke-Command

Как использовать:
если 1-to-1

посмотреть какие сессии открыты можно с помощью Get-PSSession, закрыть Remove-PSSession
закрыть вообще все сессии

прицепится к сессии можно с помощью Connect-PSSession, отключиться через Disconnect-PSSession

Invoke-Command может создать сразу disconnected сессию, он отправляет команды на исполнение и отключатся, позже можно подключится и сгрузить результаты работы. Делается это параметром -Disconnected. Получение результатов через командлет Recieve-PSSession.

Сессии имеют очень много настроек, возможно даже создание сессий с обрезаным набором команд, модулей и т.п. Называется custom endpoints

Читайте также: