Я пытаюсь удаленно выполнить сценарий PowerShell, используя PSEXEC
. Сценарий PowerShell вызывается через .cmd
командный файл. Причина, по которой мы это делаем, заключается в том, чтобы изменить политику выполнения, запустить сценарий PowerShell, а затем снова сбросить политику выполнения:
На удаленном сервере do-tasks.cmd
выглядит как:
powershell -command "&{ set-executionpolicy unrestricted}"
powershell DoTasks.ps1
powershell -command "&{ set-executionpolicy restricted}"
Скрипт PowerShell DoTasks.ps1
просто делает это сейчас:
Write-Output "Hello World!"
Оба этих скрипта живут в c:\windows\system32
(пока) просто так, что они находятся в ПУТИ.
На исходном сервере я делаю следующее:
psexec \\web1928 -u administrator -p "adminpassword" do-tasks.cmd
Когда это запускается, я получаю следующий ответ в командной строке:
c:\Windows\system32>powershell -command "&{ set-executionpolicy unrestricted}"
и сценарий больше не запускается.
Я не могу нажать Ctrl-C, чтобы сломать сценарий, и я просто вижу символы ^ C, я могу вводить ввод с клавиатуры, и символы выводятся на консоль.
На удаленном сервере я вижу, что PowerShell.exe и CMD.exe запущены на вкладке «Процесс» диспетчера задач. Если я завершу эти процессы, управление вернется в командную строку на исходном сервере.
Я пробовал это с помощью простого .cmd
командный файл с @echo hello world
и он отлично работает.
Бег do-tasks.cmd
на удаленном сервере через сеанс RDP тоже работает нормально.
Исходный сервер работает под управлением Windows 2003 SP2, удаленный сервер работает под управлением Windows 2008 SP2.
Почему мой удаленный командный файл зависает при выполнении через PSEXEC
?
Это обычная проблема с POSH. Проблема в stdin
зависает. Попробуй это:
c:\Windows\system32>powershell -command "&{ set-executionpolicy unrestricted}" < NUL
Большинство ответов на форумах решают эту проблему с помощью обходного пути, такого как эхо и конвейер, чтобы Powershell получал некоторые данные от STDIN.
Но в PowerShell есть решение. Просто запустите powershell с параметром -inputformat none like:
powershell -inputformat none -command ...
Это решает проблему зависания с помощью psexec для Win2003 и Win2008.
Поскольку сервер работает под управлением 2k8, я подозреваю, что UAC вызывает проблемы. Я бы также предложил использовать winrm вместо psexec. Удаленное взаимодействие Powershell было одной из лучших новых функций powershell 2.0