Проблемы с запуском удаленных процессов демона (и не только) через PowerShell

Из моего сценария я хочу запустить некоторую команду в удаленном окне Windows. Итак, я немного погуглил и, похоже, самый популярный и в некотором роде стандартный способ сделать это — использовать командлет PowerShell Invoke-Command, который, похоже, использует тот же протокол, что и winrm и winrs. Итак, ниже приведены команды, которые я пытался вызвать из своего скрипта (на самом деле я также пробовал много других их модификаций, но IMO этого достаточно, чтобы проиллюстрировать проблему):

  1. PowerShell -Command "$encpass=ConvertTo-SecureString -AsPlainText mypass -Force;$cred = New-Object System.Management.Automation.PSCredential -ArgumentList myuser,$encpass; Invoke-Command -ComputerName REMOTE_COMPUTER_NAME -Credential $cred -ScriptBlock {<fullcommand>};"

  2. PowerShell -Command "$encpass=ConvertTo-SecureString -AsPlainText mypass -Force;$cred = New-Object System.Management.Automation.PSCredential -ArgumentList myuser,$encpass; Invoke-Command -ComputerName REMOTE_COMPUTER_NAME -Credential $cred -ScriptBlock {Start-Process -FilePath <fullexepath> -ArgumentList <arguments> -Wait -NoNewWindow};"

  3. PowerShell -Command "$encpass=ConvertTo-SecureString -AsPlainText mypass -Force;$cred = New-Object System.Management.Automation.PSCredential -ArgumentList myuser,$encpass;$session=new-PSSession -ComputerName "REMOTE_COMPUTER_NAME" -Credential $cred; Invoke-Command -Session $session -ScriptBlock {<fullcommand>};"

ПРИМЕЧАНИЕ: Скрипт написан на perl, но ИМО здесь язык скрипта не имеет значения, поэтому можно предположить, что я вызываю команду из batch скрипта, только учтите, что as команды должны запускаться из сценарий они не должны требовать каких-либо интерактивных действий.

Итак, у меня есть несколько проблем с этими командами, и мне нужна помощь, чтобы понять их. Они здесь:

  1. Не удается запустить процессы типа configure and run daemon. А именно, если я хочу запустить configure_server.pl на удаленном компьютере (<fullcommand> = "configure_server.pl <arguments>"), который должен что-то делать, затем запустить server.exe, это не сработает, потому что, как только configure_server.pl будет выполнено, полное удаленное задание будет уничтожено, включая server.exe, которое должно работать как демон. (относится к пунктам 1,2,3)
  2. Получить перенос (длина каждой строки меньше или равна 80 символов) стандартный вывод и стандартная ошибка. (относится к пункту 1,3)
  3. Не получайте стандартный вывод и стандартную ошибку. (относится к пункту 2)

person Mihran Hovsepyan    schedule 23.07.2013    source источник


Ответы (1)


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

1 . Перестаньте пытаться идти удаленным маршрутом. Я знаю, это кажется отличной идеей, но это не так. Единственный способ, которым вы можете заставить процесс сохраняться, — это оставить окно powershell открытым на главном компьютере. Как вы, наверное, заметили, вы можете прекрасно создавать процессы, но они являются дочерними элементами вашего powershell.exe и размещаются в процессе wsmprovhost.exe на клиентском компьютере. Как только родитель ушел, все дети убиты

Чтобы исправить это, я предлагаю использовать функцию командной строки: Schtasks.exe
schtasks.exe /create /sc ONCE /tn $taskName /tr $command /s $serverName /u $userName /p $pass /ru $userName /rp $pass /st $startTime

Эта команда создаст запланированную задачу для однократного запуска, а затем удалит себя. Он даже принимает имя компьютера, поэтому удаленный доступ не требуется. Вы также можете выполнить schtasks.exe /query и проверить «Статус» для запуска, прежде чем выполнять schtasks.exe /delete.

2 . Используйте ` (обратная галочка), чтобы указать перенос выполнения на следующую строку в powershell
3 . Я получаю стандартный вывод и ошибку с этой функцией, иногда не выводимую при выполнении в большом скрипте, но всегда могу использовать $? чтобы зафиксировать ошибку.

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

person Cole9350    schedule 23.07.2013