Запустите exe / bat на удаленном сервере с помощью PowerShell (не копируйте содержимое на мой сервер)
Я обнаружил в PowerShell командлет Invoke-Command , который предположительно вызывает команду на другом сервере, но это не совсем работает. Вместо этого я получаю распечатку файла bat / exe. Мой exe — это консольное приложение, а летучая мышь — это тест, который я провел, запускает exe с помощью start «» «myexe.exe» .
Это команда, которую я пытаюсь выполнить:
В обоих случаях вместо вызова команды на другом сервере я получаю печать на сервере, с которого звоню.
Я где-то пропустил спор? Я хочу запустить exe / bat на удаленном сервере, а не на сервере, на котором я нахожусь.
Как запустить скрипт PowerShell из командного файла
Я пытаюсь запустить этот скрипт в PowerShell. Я сохранил приведенный ниже скрипт как ps.ps1 на рабочем столе.
Я сделал пакетный скрипт для запуска этого скрипта PowerShell
Но я получаю эту ошибку:
Вам нужен -ExecutionPolicy параметр:
В противном случае PowerShell рассматривает аргументы линию для выполнения и в то время как Set-ExecutionPolicy это командлет, он не имеет -File параметра.
@joey, это сработало, спасибо..но после запуска файла bat я получил эту ошибку «Waring: column ‘command’ не вписывается в дисплей и был удален»
@Joey Ха-ха, настолько эффективно, что вы можете переопределить эту политику, не будучи администратором. Это проблема безопасности?
@KolobCanyon: Если вы в состоянии запустить PowerShell, вы также можете делать почти все остальное. Обратите внимание, что политика выполнения не означает, что PowerShell имеет больше привилегий, чем в противном случае. В некотором смысле это просто удобство, чтобы избежать случайного запуска вещей, которые вы, возможно, не захотите запускать. Подобно тому, как префикс команд в текущем каталоге ./ и с исполняемым флагом в Unix.
Я объясняю, почему вы хотите вызывать скрипт PowerShell из командного файла, и как это сделать в моем блоге здесь .
Это в основном то, что вы ищете:
И если вам нужно запустить скрипт PowerShell от имени администратора, используйте это:
Вместо того чтобы жестко программировать весь путь к сценарию PowerShell, я рекомендую поместить пакетный файл и файл сценария PowerShell в один каталог, как описано в моем сообщении в блоге.
Invoke-WebRequest работает нормально, когда я набираю командную строку в окне cmd, но возвращает 404 всякий раз, когда я запускаю его из командного файла. Я пытаюсь PowerShell -NoProfile -ExecutionPolicy Bypass -Command «&
Попробуйте использовать -ExecutionPolicy Unrestricted. Я предполагаю, что опция Bypass не дает доступ к сети PowerShell.
О проекте RemontCompa.ru
RemontCompa — сайт с огромнейшей базой материалов по работе с компьютером и операционной системой Windows. Наш проект создан в 2010 году, мы стояли у истоков современной истории Windows. У нас на сайте вы найдёте материалы по работе с Windows начиная с XP. Мы держим руку на пульсе событий в эволюции Windows, рассказываем о всех важных моментах в жизни операционной системы. Мы стабильно выпускаем мануалы по работе с Windows, делимся советами и секретами. Также у нас содержится множество материалов по аппаратной части работы с компьютером. И мы регулярно публикуем материалы о комплектации ПК, чтобы каждый смог сам собрать свой идеальный компьютер.
Наш сайт – прекрасная находка для тех, кто хочет основательно разобраться в компьютере и Windows, повысить свой уровень пользователя до опытного или профи.
Удаленное управление через Powershell
В Powershell есть несколько методов удаленного подключения. Это через:
Сегодня мы поговорим о PS remoting/WinRM. В его состав входит, в основном, два командлета — это:
Этот командлет устанавливает сессию c удаленным компьютером и мы сможем работать прям на нем. Если сравнивать с Linux, то это почти одно и то же:
И второй командлет, который нужен для удаленного выполнения команд как на одном, так и сотни компьютеров:
Где:
-ComputerName — имена компьютеров (или одного)
-Scriptblock — скрипт или командлет в скобках <>
Если опять же сравнить с Linux ssh, то это почти одно и то же:
Как настроить удаленное управление через Powershell?
Для того что бы суметь настроить нужно понять как это работает. Команды выше могут работать по протоколу HTTP (по порту 5985) и HTTPS (5986), за исключением версии Powershell 1.0, который работал в XP (там порт 80/443). По умолчанию у нас стоит HTTP, но и эти данные шифруются используя симметричный ключ AES-256. Сама аутентификация работает в 2 режимах NTLM и Kerberos(по умолчанию стоит он). Если у вас сеть с домен контроллером, т.е. есть Kerberos, то у вас должны работать команды выше. Если компьютеры в Workgroup, то они используют NTLM и для этого нужна дополнительная настройка. Кроме того, если вы вместо имен используете IP, то вы в любом случае используете NTLM и это по умолчанию не работает.
Если у вас не работают команды выше нужно проверить запущен ли сервис WinRM на том компьютере, к которому мы хотим подключиться:
Если не запушен:
В этом случае мы ставим запуск сервиса автоматически и настраиваем winrm в дефолтной конфигурации. Этот сервис дает возможность принимать команды Powershell и устанавливать сеансы.
Если вы работаете под профилем сети «Public» (не «Domain» или «Private»), то нужно выполнить еще один командлет, разрешающий работать в таких сетях:
Если мы выполним такую команду:
Получим ошибку:
Connecting to remote server 192.168.3.100 failed with the following error message : The WinRM client cannot process the request. Default authentication may be used with an IP address under the following conditions: the transport is HTTPS or the destination is in the TrustedHosts list, and explicit credentials are provided.
Которая говорит, что мы можем подключится по IP если используем HTTPS (для этого нужен сертификат) или добавить хост, к которому подключаемся в TrustedHost компьютера с которого хотим запустить команду. Для этого делаем:
После этого все будет работать, но команды должны исполняться с переменной, в которой будут лежать учетные данные пользователя. Т.е. так:
Где:
$cred — это переменная, куда мы сохраняем данные с формы Get-Credential
-Credential — сюда мы передаем переменную
Так же отмечу, что все команды, которые мы запускаем для удаленного выполнения через Poweshell, должны происходить от члена группы Администратора того хоста, к которому мы подключаемся.
Теперь мы можем устанавливать множество сессий с помощью командлета:
Получать ID этих сессий:
И подключаться по этим ID:
Или использовать с invoke существующую сессию, а командлет для удаленного компьютера запускать с файла:
А так же, т.к. WinRM настроен, выполнять командлеты где есть ключ -ComputerName, сразу на нескольких компьютерах. Этот командлет пропингует AD сразу с нескольких компьютеров:
Удаленное взаимодействие с Windows PowerShell без настройки
Многие командлеты Windows PowerShell имеют параметр ComputerName, который позволяет собирать данные и изменять параметры одного или нескольких удаленных компьютеров. Эти командлеты используют разные протоколы связи и работают во всех операционных системах Windows без специальной настройки.
В эти командлеты входят следующие:
Обычно командлеты, которые поддерживают удаленное взаимодействие без специальной настройки, имеют параметр ComputerName, но не имеют параметра Session. Чтобы найти эти командлеты в сеансе, введите:
2 ответа 2
WinRM уже настроен для получения запросов на этом компьютере.
WinRM уже настроен для удаленного управления на этом компьютере.
удалите этот winrm quickconfig из вашего скрипта. он хочет настроить службу WinRM, но он уже настроен, поэтому в этом нет необходимости. WinRM позволяет вам получить доступ к удаленному компьютеру через его службу, например, для invoke-command <> .
Copy-item: Не удается найти путь «C:OfficeDocumentfix.reg», так как он не существует.
Причина этого в том, что ваша переменная $newfile использует $servers вместо $server как и должно (потому что она находится внутри блока foreach() ), поэтому $servers равен $null . это причина ошибки.
если файл реестра, который вы используете, записывает в HKCU:, вам не нужно повышать уровень скрипта, если он записывает в HKLM: вам нужно. Только администраторы могут писать в HKLM. Высота это целая часть от начала до winrm quickconfig .
это должно дать вам следующий конечный продукт (я оставил высоту там):
пожалуйста, взгляните также на эту строку:
это еще не динамично. он всегда будет читать в test.reg вместо желаемого reg-файла.
вместо start-process вы также можете просто использовать regedit /s $regfile /f PowerShell может выполнять пакетные команды (но это подробно. Если это работает так, оставьте все как есть).