Удаленное подключение к компьютерам через PowerShell Remoting в рабочей группе (без домена)

11.01.2022

itpro

PowerShell, Windows 10, Windows Server 2019

комментариев 5
PowerShell Remoting отличный инструмент, который позволяет подключаться и выполнять команды на удаленных компьютерах через WinRM. Если компьютеры находятся в одном домене Active Directory, то PSRemoting использует Kerberos для аутентификации на удалённых хостах. Однако, если ваши компьютеры находятся в рабочей группе, то для аутентификации придется использовать NTLM (TrustedHosts) или SSL сертификаты. В этой статье мы рассмотрим, как настроить PSRemoting для удаленного подключения к компьютеру в рабочей группе.
В нашем примере в локальной сети на базе рабочей группы Windows есть два хоста:
-
Рабочая станция администратора — 192.168.13.100
Наша задача – удаленно подключиться к компьютеру пользователя через PowerShell Remoting.
Прежде всего нужно включить и настроить WinRM на удаленном компьютере. Включить WinRM на удаленном компьютере придется локально или удаленно (например, через RDP или psexec).
Проверьте, что на компьютере запущена служба WinRM:
Get-Service -Name «*WinRM*» | select status
Если служба не запущена, запустите ее:
WinRM has been updated to receive requests. WinRM service type changed successfully. WinRM service started. WinRM has been updated for remote management. WinRM firewall exception enabled. Configured LocalAccountTokenFilterPolicy to grant administrative rights remotely to local users.

Как вы видите, автоматически включен параметр UAC LocalAccountTokenFilterPolicy, разрешающий удаленный доступ под учетной записью с правами администратора.
Если для сетевого подключения на компьютере установлен тип сети Public (общедоступная), то при включении WinRM появится ошибка:
Set-WSManQuickConfig : . WinRM firewall exception will not work since one of the network connection types on this machine is set to Public. Change the network connection type to either Domain or Private and try again.
Вам нужно изменить тип сети на частную (private) ( Set-NetConnectionProfile -NetworkCategory Private ), или использовать команду:
Откройте порт (TCP 5985) для подключения к WinRM в Windows Defender Firewall. Проще всего открыть порт с помощью PowerShell. В этом примере мы откроем удаленный доступ только для IP адреса компьютера администратора (безопаснее), но можно открыть и для всех (укажите Any вместо IP адреса):
Set-NetFirewallRule -DisplayName «Windows Remote Management (HTTP-In)» -RemoteAddress 192.168.13.100
Enable-NetFirewallRule -DisplayName «Windows Remote Management (HTTP-In)»
С компьютера администратора проверьте, что компьютер пользователя теперь разрешает принимать удаленные подключения через PSRemoting:
Test-NetConnection 192.168.13.222 –Port 5985
Test-WsMan 192.168.13.222

Однако, если попытаться удаленно подключиться к компьютеру пользователя с помощью команд Invoke-Command или Enter-PSSession, появится ошибка:
Enter-PSSession : Connecting to remote server 192.168.13.222 failed with the following error message: The WinRM client cannot process the request. If the authentication scheme is different from Kerberos, or if the client computer is not joined to a domain, then HTTPS transport must be used or the destination machine must be added to the TrustedHosts configuration setting. Use winrm.cmd to configure TrustedHosts. Note that computers in the TrustedHosts list might not be authenticated. PSRemotingTransportException.
HTTP Listener WinRM на удаленном компьютере разрешает подключение только через Kerberos аутентификацию.
Get-ChildItem -Path WSMan:\localhost\Service\Auth\

Чтобы работала Negotiate аутентификация через NTLM ваш компьютер должны доверять удаленному компьютеру. В домене это достигается с помощью Kerberos, а в рабочей группе придется добавить IP адреса компьютера в TrustedHosts.
Добавьте компьютер пользователя в TrustedHosts на компьютере администратора (можно добавить по IP адресу или FQDN):
Set-Item wsman:\localhost\client\TrustedHosts -Value 192.168.13.222 -Force
Вывести список компьютеров в TrustedHosts:
Чтобы очистить список TrustedHosts:
Set-Item WSMan:\localhost\Client\TrustedHosts -Value «» –Force
Чтобы добавить новый компьютер в список TrustedHosts, используйте параметр -Concatenate:
Set-Item WSMan:\localhost\Client\TrustedHosts -Value 192.168.13.200 -Concatenate
Также вы можете разрешить удаленное подключение ко все компьютерам (обычно не рекомендуется, т.к. один из главных недостатков NTLM в том, что он не осуществляет проверку подлинности).
Set-Item wsman:\localhost\Client\TrustedHosts -value *
Попробуйте теперь подключиться к удаленному компьютеру через PSRemoting:
Enter-PSSession -ComputerName 192.168.13.222 -Credential 192.168.13.222\root
Введите пароль администратора удаленного компьютера и убедитесь, что подключение успешно установлено (в строке приглашения PowerShell теперь отображается имя или IP удаленного компьютера).

С помощью Invoke-Command вы можете выполнять команды на удаленных компьютерах. Например, выполнить удалённую перезагрузку компьютера:
Invoke-Command -ComputerName 192.168.13.222 -Credential 192.168.13.222\root –ScriptBlock
Или выполнить PowerShell скрипт:
Invoke-Command -ComputerName 192.168.13.222 -Credential 192.168.13.222\root -FilePath c:\PS\Scripts\GetComputerInfo.ps1
Также вы можете использовать в WinRM протокол HTTPS для подключения к удаленным компьютерам. Для этого нужно выпустить SSL сертификат на удаленном компьютере и импортировать его на компьютер администратора. В этом случае не нужно добавлять адрес удаленного компьютера в TrustedHosts. Подробнее о настройке PowerShell Remoting через WinRM HTTPS.
Обратите внимание, что для аутентификации на удаленном компьютере нужно указывать пароль пользователя для подключения с помощью опции –Credential. Если в вашей сети много компьютеров и на каждом из них используется свой пароль локального администратора, удобно хранить пароли подключения в хранилище. Это может быть как локальное хранилище паролей Windows Credential Manager или внешнее хранилище KeePass, LastPass, HashiCorp Vault, Azure Key Vault, Bitwarden.
Для доступа к сохраненным паролям в таком хранилище можно использовать модуль PowerShell Secret Management. Теперь для подключения к удаленному компьютеру через PSRemoting вам достаточно:
- Сохранить пароль для подключения, например в Credential Manager: cmdkey /add:192.168.13.222 /user:root /pass:Password
- Получить имя и пароль из хранилища с помощью модуля CredentialManager: $psCred = Get-StoredCredential -Target «192.168.13.222»
- Подключиться к удаленному компьютеру через PSRemoting с сохраненным паролем: Enter-PSSession -ComputerName 192.168.13.222 -Credential $psCred
Если вы храните пароли в другом типе хранилища, используйте модуль Microsoft.PowerShell.SecretManagement для получения сохранённых учетных данных.
В новых версиях PowerShell(v6 и v7) вы можете использовать протокола Secure Shell (SSH) для подключения к удаленному компьютеру через PowerShell Remoting. Для этого в Windows должен быть включен встроенный SSH сервер. Можно даже аутентифицироваться по SSH с помощью RSA ключа:
Enter-PSSession -HostName [email protected]:22 -KeyFilePath c:\PS\your_rsa_key
По умолчанию WinRM разрешает удаленное подключение только для администраторов. Однако вы можете разрешить удаленный доступ через PSRemoting и для обычных пользователей.
Предыдущая статья Следующая статья
Что такое Windows PowerShell и с чем его едят? Часть 1: основные возможности
Windows PowerShell позволяет системным администраторам автоматизировать большинство рутинных задач. С ее помощью можно менять настройки, останавливать и запускать сервисы, а также производить обслуживание большинства установленных приложений. Воспринимать синее окошко как еще один интерпретатор команд было бы неправильно. Такой подход не отражает сути предложенных корпорацией Microsoft инноваций. На самом деле возможности Windows PowerShell гораздо шире: в небольшом цикле статей мы попробуем разобраться, чем решение Microsoft отличается от более привычных нам средств.
Основные возможности
Разумеется Windows PowerShell — это в первую очередь командная оболочка с языком сценариев, изначально созданная на основе платформы .NET Framework, а позднее — на .NET Core. В отличие от принимающих и возвращающих текстовые данные оболочек, Windows PowerShell работает с классами .NET, у которых есть свойства и методы. PowerShell позволяет выполнять обычные команды, а также дает доступ к объектам COM, WMI и ADSI. В ней используются различные хранилища, вроде файловой системы или реестра Windows, для доступа к которым созданы т.н. поставщики (providers). Стоит отметить возможность встраивания исполняемых компонентов PowerShell в другие приложения для реализации различных операций, в т.ч. через графический интерфейс. Верно и обратное: многие приложения для Windows предоставляют доступ к своим интерфейсам управления через PowerShell.
Windows PowerShell позволяет:
- Менять настройки операционной системы;
- Управлять службами и процессами;
- Настраивать роли и компоненты сервера;
- Устанавливать программное обеспечение;
- Управлять установленным ПО через специальные интерфейсы;
- Встраивать исполняемые компоненты в сторонние программы;
- Создавать сценарии для автоматизации задач администрирования;
- Работать с файловой системой, реестром Windows, хранилищем сертификатов и т.д.
Оболочка и среда разработки
Существует Windows PowerShell в двух ипостасях: помимо эмулятора консоли с командной оболочкой есть интегрированная среда сценариев (Integrated Scripting Environment — ISE). Чтобы получить доступ к интерфейсу командной строки достаточно выбрать соответствующий ярлык в меню Windows или запустить powershell.exe из меню «Выполнить». На экране появится синее окошко, заметно отличающееся по возможностям от допотопного cmd.exe. Там есть автодополнение и другие фишки, привычные пользователям командных оболочек для Unix-систем.

Для работы с оболочкой нужно запомнить некоторые сочетания клавиш:
- Стрелки вверх и вниз прокручивают историю для повтора ранее набранных команд;
- Стрелка вправо в конце строки перенабирает предыдущую команду посимвольно;
- Ctrl+Home удаляет набранный текст от позиции курсора до начала строки;
- Ctrl+End удаляет текст от курсора до конца строки.

Windows PowerShell ISE является полноценной средой разработки с поддерживающим вкладки и подсветку синтаксиса редактором кода, конструктором команд, встроенным отладчиком и другими программистскими радостями. Если в редакторе среды разработки после имени команды написать знак дефис, вы получите в выпадающем списке все доступные параметры с указанием типа. Запустить PowerShell ISE можно либо через ярлык из системного меню, либо с помощью исполняемого файла powershell_ise.exe.

Командлеты
В Windows PowerShell появились т.н. командлеты (cmdlets). Это специализированные классы .NET, в которые заложена разнообразная функциональность. Именуются они по принципу «Действие-Объект» (или «Глагол-Существительное, если вам так больше нравится), а разделенная дефисом связка напоминает сказуемое и подлежащее в предложениях естественных языков. Например, Get-Help буквально означает «Получить-Помощь» или в контексте PowerShell: «Показать-Справку». По сути это аналог команды man в Unix-системах и мануалы в PowerShell нужно запрашивать именно так, а не вызывая командлеты с ключом —help или /. Не стоит забывать и об онлайн-документации по PowerShell: у Microsoft она достаточно подробная.
Помимо Get в командлетах для обозначения действий используются и другие глаголы (и не только глаголы, строго говоря). В списке ниже мы приведем несколько примеров:
Add — добавить;
Clear — очистить;
Enable — включить;
Disable — выключить;
New — создать;
Remove — удалить;
Set — задать;
Start — запустить;
Stop — остановить;
Export — экспортировать;
Import — импортировать.
Есть системные, пользовательские и опциональные командлеты: в результате выполнения все они возвращают объект или массив объектов. К регистру они не чувствительны, т.е. с точки зрения интерпретатора команд нет разницы между Get-Help и get-help. Для разделения используется символ ‘;’, но ставить его обязательно только если в одной строке выполняется несколько командлетов.
Командлеты Windows PowerShell группируются в модули (NetTCPIP, Hyper-V и т.д.), а для поиска по объекту и действию существует командлет Get-Command. Показать справку по нему можно так:
Get-Help Get-Command

По умолчанию команда отображает краткую справку, но в командлеты при необходимости передаются параметры (аргументы). С их помощью можно, например, получить детальную (параметр -Detailed) или полную (параметр -Full) справку, а также вывести на экран примеры (параметр -Examples):
Get-Help Get-Command -Examples
Справка в Windows PowerShell обновляется командлетом Update-Help. Если строка команд получается слишком длинной, аргументы командлета можно перенести на следующую, написав служебный символ ‘`’ и нажав Enter — просто закончить писать команду на одной строке и продолжить на другой не получится.
Ниже приведем несколько примеров распространенных командлетов:
Get-Process — показать запущенные в системе процессы;
Get-Service — показать службы и их статус;
Get-Content — вывести содержимое файла.
Для часто используемых командлетов и внешних утилит в Windows PowerShell есть короткие синонимы — алиасы (от англ. Alias). Например, dir — алиас Get-ChildItem. Есть в списке синонимов и аналоги команд из Unix-систем (ls, ps и т.д.), а командлет Get-Help вызывается командой help. Полный список синонимов можно посмотреть с помощью командлета Get-Alias:

Сценарии, функции, модули и язык PowerShell
Скрипты Windows PowerShell хранятся в виде обычных текстовых файлов с расширением .ps1. Запустить их двойным кликом нельзя: нужно правой кнопкой мыши вызвать контекстное меню и выбрать пункт «Запустить в PowerShell». Из консоли придется либо указать полный путь к скрипту, либо перейти в соответствующий каталог и написать имя файла. Запуск сценариев также ограничен системной политикой, а для проверки текущих настроек можно использовать командлет Get-ExecutionPolicy, который выдаст одно из следующих значений:
Restricted — запуск сценариев запрещен (по умолчанию);
AllSigned — разрешен только запуск подписанных доверенным разработчиком сценариев;
RemoteSigned — разрешен запуск подписанных и собственных сценариев;
Unrestricted — разрешен запуск любых сценариев.
У администратора есть два варианта действий. Наиболее безопасный предполагает подписание скриптов, но это довольно серьезное колдунство — мы будем разбираться с ним в следующих статьях. Сейчас пойдем по пути наименьшего сопротивления и поменяем политику:
Set-ExecutionPolicy RemoteSigned

PowerShell для этого придется запустить от имени администратора, хотя с помощью специального параметра можно изменить политику и для текущего пользователя.
Пишутся скрипты на объектно-ориентированном языке программирования, команды которого именуются по тому же принципу, что и рассмотренные ранее командлеты: «Действие-Объект» («Глагол-Существительное»). Основное его предназначение — автоматизация задач администрирования, но это полноценный интерпретируемый язык, в котором есть все необходимые конструкции: условный переход, циклы, переменные, массивы, объекты, обработка ошибок и т.д. Для написания сценариев годится любой текстовый редактор, но удобнее всего запустить Windows PowerShell ISE.
В скрипт можно передавать параметры, делать их обязательными, а также задавать значения по умолчанию. Кроме того Windows PowerShell позволяет создать функции и вызывать их точно так же, как и командлеты: для этого используется конструкция Function и фигурные скобки. Сценарий с функциями называется модулем и имеет расширение .psm1. Модули должны храниться в каталогах, определенных в переменных окружения PowerShell. Посмотреть их можно при помощи следующей команды:
Get-ChildItem Env:\PSModulePath | Format-Table -AutoSize
Конвейеры
В последнем примере мы применили знакомую пользователям оболочек для Unix-систем конструкцию. В Windows PowerShell вертикальная черта также позволяет передать выход одной команды на вход другой, но в реализации конвейера есть и существенная разница: речь здесь идет уже не о наборе символов или каком-то тексте. Встроенные командлеты или пользовательские функции возвращают объекты или массивы объектов, а также могут получать их на входе. Как в Bourne shell и его многочисленных последователях, в PowerShell с помощью конвейера упрощается выполнение сложных задач.
Простейший пример конвейера выглядит так:
Get-Service | Sort-Object -property Status

Сначала выполняется командлет Get-Service, а потом все полученные им службы передаются на сортировку по свойству Status командлету Sort-Object. В какой именно аргумент передается результат работы предыдущего участка конвейера, зависит от его типа — обычно это InputObject. Подробнее этот вопрос будет рассматриваться в посвященной языку программирования PowerShell статье.
При желании цепочку можно продолжить и передать результат работы Sort-Object еще одному командлету (выполняться они будут слева направо). Кстати, пользователям Windows доступна и привычная всем юниксоидам конструкция для постраничного вывода:
Get-Service | Sort-Object -property Status | more
Запуск задач в фоновом режиме
Довольно часто бывает нужно запустить некую команду в фоне, чтобы не дожидаться результата ее выполнения в сессии оболочки. В Windows PowerShell есть несколько командлетов на такой случай:
Start-Job — запуск фоновой задачи;
Stop-Job — остановка фоновой задачи;
Get-Job — просмотр списка фоновых задач;
Receive-Job — просмотр результата выполнения фоновой задачи;
Remove-Job — удаление фоновой задачи;
Wait-Job — перевод фоновой задачи обратно в консоль.
Для запуска фоновой задачи мы используем командлет Start-Job и в фигурных скобках указываем команду или набор команд:
Start-Job

Фоновыми задачами в Windows PowerShell можно манипулировать, зная их имена. Для начала научимся их отображать:
Get-Job

Теперь покажем результат работы задания Job1:
Receive-Job Job1 | more

Всё довольно просто.
Удаленное выполнение команд
Windows PowerShell позволяет выполнять команды и сценарии не только на локальном, но и на удаленном компьютере и даже на целой группе машин. Для этого существует несколько способов:
- У многих командлетов есть параметр -ComputerName , но таким способом не получится, например, создать конвейер;
- Командлет Enter-PSSession позволяет создать на удаленной машине интерактивный сеанс;
- С помощью командлета Invoke-Command можно выполнять команды или сценарии на одном или нескольких удаленных компьютерах.
Версии PowerShell
С момента первого релиза в 2006 году PowerShell серьезно изменился. Инструмент доступен для множества систем, работающих на разных аппаратных платформах (x86, x86-64, Itanium, ARM): Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008/2008 R2, Windows 7, Windows 8, Windows 8.1, Windows RT, Windows RT 8.1, Windows Server 2012/2012 R2, Windows 10, Windows Server 2016, GNU/Linux и OS X. Последний релиз 6.2 выпущен 10 января 2018 года. Написанные для более ранних версий скрипты с высокой вероятностью будут работать в более поздних, а вот с обратным переносом могут возникнуть проблемы, поскольку за годы развития в PowerShell появилось большое количество новых командлетов. Узнать версию установленной на компьютере командной оболочки можно с помощью свойства PSVersion встроенной переменной $PSVersionTable:
$PSVersionTable.PSVersion

Также можно воспользоваться командлетом:
Get-Variable -Name PSVersionTable –ValueOnly

То же самое делается и с помощью командлета Get-Host. На самом деле вариантов множество, но для их применения нужно изучить язык программирования PowerShell, чем мы и займемся в следующей статье.
Итоги
Корпорации Microsoft удалось создать действительно мощную командную оболочку с удобной интегрированной средой для разработки скриптов. От привычных нам по миру Unix средств ее отличает глубокая интеграция с операционными системами семейства Windows, а также с программным обеспечением для них и платформой .NET Core. PowerShell можно назвать объектно ориентированной оболочкой, потому что командлеты и пользовательские функции возвращают объекты или массивы объектов и могут получать их на входе. Думаем, этим инструментом должны владеть все администраторы серверов на Windows: прошло время, когда они могли обойтись без командной строки. Продвинутая консольная оболочка особенно необходима на наших недорогих VPS, работающих под управлением Windows Server Core, но это уже совсем другая история.
Как запустить Windows PowerShell

Многие инструкции на этом сайте в качестве одного из первых шагов предлагают запустить PowerShell, обычно от имени администратора. Иногда в комментариях появляется от начинающих пользователей вопрос о том, как это сделать.
Запуск Windows PowerShell с помощью поиска
Моя первая рекомендация на тему запуска любой утилиты Windows, которую вы не знаете, как запустить — использовать поиск, он поможет почти всегда.
Кнопка поиска есть на панели задач Windows 10, в Windows 8 и 8.1 поле поиска можно открыть клавишами Win+S, а в Windows 7 найти в меню «Пуск». Шаги (на примере 10-ки) будут следующими.
- В поиск начните вводить PowerShell, пока не покажется необходимый результат.

- Если требуется запуск от имени администратора, нажмите по Windows PowerShell правой кнопкой мыши и выберите соответствующий пункт контекстного меню.

Как видите, очень просто и подходит для любой из последних версий Windows.
Как открыть PowerShell через контекстное меню кнопки «Пуск» в Windows 10
Если на вашем компьютере установлена Windows 10, то, пожалуй, ещё более быстрый способ открыть PowerShell — нажать правой кнопкой мыши по кнопке «Пуск» и выбрать нужный пункт меню (там присутствует сразу два пункта — для простого запуска и от имени администратора). Это же меню можно вызвать, нажав клавиши Win+X на клавиатуре.

Примечание: если в этом меню вместо Windows PowerShell у вас отображается командная строка, то заменить её на PowerShell вы, при желании, можете в Параметры — Персонализация — Панель задач, включив пункт «Заменить командную строку оболочкой Windows Powershell» (в последних версиях Windows 10 параметр включен по умолчанию).
Запуск PowerShell с помощью диалогового окна «Выполнить»
Еще один простой способ запуска PowerShell — использовать окно «Выполнить»:
- Нажмите клавиши Win+R на клавиатуре.
- Введите powershell и нажмите Enter или Ок.
При этом в Windows 7 можно установить отметку запуска от имени администратора, а в последней версии Windows 10, если при нажатии Enter или Ok удерживать клавиши Ctrl + Shift, то утилита также запуститься от имени администратора.
Видео инструкция
Другие способы открыть PowerShell
Выше перечислены далеко не все способы открытия Windows PowerShell, но, уверен, что их будет вполне достаточно. Если же нет, то:
- Можно найти PowerShell в меню пуск. Для запуска от администратора используйте контекстное меню.

- Можно запустить файл exe в папке C:\Windows\System32\WindowsPowerShell. Для прав администратора, аналогично, используем меню по правому щелчку мышью.

- Если ввести powershell в командной строке, также будет запущен нужный инструмент (но в интерфейсе командной строки). Если при этом командная строка была запущена от имени администратора, то и PowerShell будет работать от имени администратора.

Также, бывает, спрашивают, а что такое PowerShell ISE и PowerShell x86, которые находятся, например, при использовании первого способа. Отвечаю: PowerShell ISE — «Интегрированная среда сценариев PowerShell». По сути, с её помощью можно выполнять все те же команды, но, помимо этого, в ней присутствуют дополнительные возможности, облегчающие работу со скриптами PowerShell (справка, инструменты отладки, цветовая разметка, дополнительные горячие клавиши и т.п.). В свою очередь версии x86 нужны в случае, если вы работаете с 32-битными объектами или с удаленной системой x86.
А вдруг и это будет интересно:
- Лучшие бесплатные программы для Windows
- TakeOwnershipEx — получение полного доступа к папкам и файлам и восстановление прав по умолчанию
- Ошибка 0x8007000d в Windows 11 или 10 — как исправить?
- Chrome открывает поиск вместо сайта — решение
- Недопустимая конфигурация приложения в Steam — варианты решения
- Ошибка при запуске приложения 0xc0000006 — как исправить?
- Windows 11
- Windows 10
- Android
- Загрузочная флешка
- Лечение вирусов
- Восстановление данных
- Установка с флешки
- Настройка роутера
- Всё про Windows
- В контакте
- Одноклассники
-
Иван 21.07.2018 в 20:26
- Dmitry 04.07.2022 в 15:31
- Андрій 04.07.2022 в 15:41
- Dmitry 04.07.2022 в 15:45
Попробуйте reg-файл по первой ссылке Download на этой странице (ну и там же есть как вручную устроить):
https://www.tenforums.com/tutorials/60175-open-powershell-window-here-context-menu-add-windows-10-a.html
- Андрій 04.07.2022 в 17:02
- Живые обои на рабочий стол Windows 11 и Windows 10
- Лучшие бесплатные программы на каждый день
- Как скачать Windows 10 64-бит и 32-бит оригинальный ISO
- Как смотреть ТВ онлайн бесплатно
- Бесплатные программы для восстановления данных
- Лучшие бесплатные антивирусы
- Средства удаления вредоносных программ (которых не видит ваш антивирус)
- Встроенные системные утилиты Windows 10, 8 и 7, о которых многие не знают
- Бесплатные программы удаленного управления компьютером
- Запуск Windows 10 с флешки без установки
- Лучший антивирус для Windows 10
- Бесплатные программы для ремонта флешек
- Что делать, если сильно греется и выключается ноутбук
- Программы для очистки компьютера от ненужных файлов
- Лучший браузер для Windows
- Бесплатный офис для Windows
- Запуск Android игр и программ в Windows (Эмуляторы Android)
- Что делать, если компьютер не видит флешку
- Управление Android с компьютера
- TakeOwnershipEx — получение полного доступа к папкам и файлам и восстановление прав по умолчанию
- Ошибка 0x8007000d в Windows 11 или 10 — как исправить?
- Chrome открывает поиск вместо сайта — решение
- Недопустимая конфигурация приложения в Steam — варианты решения
- Ошибка при запуске приложения 0xc0000006 — как исправить?
- Как удалить драйвер в командной строке
- Экран iPhone может быть слишком близко — как отключить?
- Winget COM Server — что это и что делать, если он грузит процессор
- Как копировать текст с картинки в приложении «Ножницы»
- The AC power adapter wattage and type cannot be determined — причины и решение
- Слышу себя, говоря в микрофон — причины и решение
- Невозможно подключиться к службе RPC в Realtek Audio Console — как исправить?
- Ошибка Application load error 5:0000065434 при запуске игры Steam
- Контакты на случай ЧП на iPhone — как добавить и зачем?
- Secure Boot и загрузка с флешки Ventoy
- Windows
- Android
- iPhone, iPad и Mac
- Программы
- Загрузочная флешка
- Лечение вирусов
- Восстановление данных
- Ноутбуки
- Wi-Fi и настройка роутера
- Интернет и браузеры
- Для начинающих
- Безопасность
- Ремонт компьютеров
- Windows
- Android
- iPhone, iPad и Mac
- Программы
- Загрузочная флешка
- Лечение вирусов
- Восстановление данных
- Ноутбуки
- Wi-Fi и настройка роутера
- Интернет и браузеры
- Для начинающих
- Безопасность
- Ремонт компьютеров
Запуск программы из PowerShell
Задача запустить из PowerShell какой либо исполняемый файл (программу или утилиту командной строки) встречается достаточно часто. PowerShell предлагает для этого несколько различных способов, которые мы и рассмотрим далее в этой статье. Начнем с самого простого…
Прямой запуск
Самый простой способ запустить исполняемый файл в PowerShell — это перейти в директорию с файлом и стартовать его напрямую. Для примера возьмем простенькую программку, выводящую приветствие, и выполним ее командой:
Set-Location ″C:\Program Files″
.\Hello.exe

Обратите внимание, что даже находясь в нужном каталоге, требуется указывать относительный путь к исполняемому файлу. Исключение составляют файлы из директорий, перечисленных в переменной окружения (path). Например различные встроенные программы и утилиты (notepad, calc, ping и т.п.), находящиеся в директории Windows\System32, можно запускать без указания пути.

Оператор &
Если необходимо указать полный путь к исполняемому файлу, то можно воспользоваться оператором & (оператор вызова). Он позволяет выполнить строку текста, указанную в кавычках, как единую команду. Например:
![]()
Поскольку оператор & не анализирует передаваемую команду, то он не может интерпретировать ее параметры. Поэтому дополнительные параметры\аргументы передаются также в виде текста, в кавычках. Для примера возьмем предыдущую программу и немного изменим ее, так что она принимает нужный текст в виде аргумента:
& ′C:\Program Files\Hello.exe′ ′Hello, world′
При желании можно указать нескольких аргументов через запятую:
& ′C:\Program Files\Hello.exe′ ′Hello,′, ′ world′
Для удобства команду и аргументы можно поместить в переменные:
$exe = ′C:\Program Files\Hello.exe′
$arg1 = ′Hello′
$arg2 = ′world′
& $exe $arg1 $arg2

Ну и если аргументов много, то их можно объединить, воспользовавшись такой конструкцией:
$exe = ′C:\Program Files\Hello.exe′
$allargs = @(′Hello,′,′world′)
& $exe $allargs

Invoke-Expression
Командлет Invoke-Expression работает примерно так-же, как и оператор & — берет текстовую строку и выполняет ее в виде команды. Например:
Invoke-Expression -Command ′C:\Windows\Hello.exe′
Однако у него есть один большой недостаток, а именно — неумение работать с пробелами. К примеру, следующая команда вызовет ошибку:
Invoke-Expression -Command ′C:\Program Files\Hello.exe′
Эта особенность делает применение командлета крайне неудобным. Хотя при необходимости подобных ошибок можно избежать с помощью дополнительных кавычек, например так:
Invoke-Expression -Command ″C:\′Program Files′\Hello.exe″

Start-Process
Командлет Start-Process запускает указанный файл в виде процесса, используя метод Start .NET класса Process. Например:
Start-Process -FilePath ′C:\Program Files\Hello.exe′
По умолчанию процесс выполняется в отдельном окне, которое закрывается по окончании процесса. Изменить такое поведение можно с помощью параметров, так следующая команда запустится в текущем окне:
Start-Process -FilePath ′C:\Program Files\Hello.exe′ -NoNewWindow -Wait
Также Start-Process позволяет передать в процесс дополнительные аргументы:
Start-Process -FilePath ′C:\Program Files\Hello.exe′ -ArgumentList ′Hello, world′ -NoNewWindow -Wait

По умолчанию командлет ничего не возвращает, но с помощью параметра -PassThru можно заставить его вернуть объект процесса. Этот объект очень удобно поместить в переменную:
$process = Start-Process -FilePath ′C:\Program Files\Hello.exe′ -Wait -PassThru
из которой можно затем можно узнать многие полезные вещи, такие как статус:
или код выполнения:

.NET
В принципе .NET классом Process можно воспользоваться напрямую, без командлета Start-Process. К примеру, запустить процесс можно командой:

Такой способ достаточно неудобен и громоздок (на мой взгляд), но чуть более гибок в использовании. Для примера запустим нашу программу в текущем окне, передадим в нее аргументы и заберем результат выполнения:
$process = New-Object -TypeName System.Diagnostics.Process
$process.StartInfo.FileName = ″C:\Program Files\Hello.exe″
$process.StartInfo.Arguments = ″Hello,world″
$process.StartInfo.RedirectStandardOutput = $true
$process.StartInfo.UseShellExecute = $false
$process.Start()
$process.WaitForExit()
$process.StandatdOutput.ReadToEnd()

WMI
С помощью WMI можно сделать практически все, в том числе и запустить программу. Для этого вполне подойдет метод Create WMI-класса Win32_Process. Этот метод запускает процесс на локальном или удаленном компьютере через RPC. Например, для выполнения программы на локальном компьютере можно воспользоваться такой командой:
А для выполнения на удаленном компьютере команда будет выглядеть так:

Как вариант, можно воспользоваться командлетом Invoke-WmiMethod:
Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList ″C:\Program Files\Hello.exe″

Либо командлетом Invoke-CimMethod:
Invoke-CimMethod -ClassName Win32_Process -MethodName Create -Arguments @

WMI запускает процесс в отдельном окне и возвращает объект, содержащий идентификатор процесса (ProcessID) и результат выполнения (ReturnValue). ReturnValue может принимать следующие значения:
0 — Sucsessful Completiom
2 — Access Denied
3 — Insufficient Privilege
8 — Uncnown Failure
9 — Path Not Found
21 — Invalid Parameter
Invoke-Command
Командлет Invoke-Command умеет выполнять команды на локальном или удаленном компьютере, используя WinRM. Например, для запуска нашей программы на локальном компьютере используем команду:
При необходимости в программу можно передать аргументы:
Обратите внимание, что Invoke-Command не очень дружит с пробелами, поэтому во избежании ошибок приходится исхитряться с кавычками. Впрочем, подобных проблем можно избежать, например комбинируя использования командлета с оператором &:

В основном Invoke-Command применяется для удаленного управления, его главное достоинство — это возможность одновременного выполнения на нескольких компьютерах. Например:
Invoke-Command -ScriptBlock -ComputerName SRV1,SRV2,SRV3
$scriptblock =
$Computers = @(′SRV1′,′SRV2′,′SRV3′)
Invoke-Command -ScriptBlock $scriptblock -ComputerName $Computers
По умолчанию командлет возвращает результат выполнения программы, а если запустить его в фоновом режиме (параметр -AsJob), то возвращает объект Job:
Invoke-Command -ScriptBlock -ComputerName localhost -AsJob -JobName Hello

Invoke-Item
Командлет Invoke-Item предназначен для применения к файлу действия по умолчанию. Так запустить исполняемый файл можно командой:
Invoke-Item -Path ″C:\Program Files\Hello.exe″
Однако наиболее удобно использовать Invoke-Item для открытия определенного типа файлов. Например так мы откроем текстовый файл:
Invoke-Item -Path ″C:\Files\test.txt″
А так все текстовые файлы в папке:
Invoke-Item -Path ″C:\Files\*.txt″

CMD
Ну и в завершение еще один способ запуска программы из PowerShell — с помощью оболочки cmd. Способ достаточно ″непрямой″, но тем не менее работающий. Следующая команда запускает новый экземпляр cmd, выполняет в нем указанную программу, завершает работу cmd и возвращает результат:
cmd /c ″C:\Program Files\Hello.exe″
![]()
Такое вот изобилие способов запустить программу предоставляет PoSh. И каждый из них хорош для определенных ситуаций.
Кстати, статья написана по мотивам PowerShell: Deep Dive and Best Practice. Рекомендую почитать, там еще много интересного.