Запустите сценарий PowerShell с PsExec и соберите выходные объекты - PullRequest
0 голосов
/ 17 июня 2019

Из удаленного PowerShell мне нужно запустить сценарий PowerShell «GUI» в интерактивном сеансе пользователя.Единственное решение, которое я нашел, - это использование PsExec (с параметром -i).Это работает (я вижу всплывающее окно PowerShell).

Но мне нужно передать выходные данные этого сценария "GUI" на хост моего удаленного сценария.В идеале это должно происходить асинхронно во время выполнения сценария «GUI» (т.е. без ожидания его завершения).

Существует ли способ перенаправить потоки вывода / ошибок сценария из нового процесса powershell ввызывающий процесс PowerShell?


КОД:

Удаленный сценарий, возвращающий выходные данные на хост C # асинхронно (через конвейер):

Write-Output "Starting remote script..." # this string is transmitted to host
# Run interactiveScript.ps1 in other session using PsExec:
$EncodedCommand = [System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes('& "interactiveScript.ps1" -myArg1 "abc"'))
$CommandString = "-accepteula -nobanner -i 1 -u admin -p admin -h \\localhost cmd /c `"echo . | powershell.exe -ExecutionPolicy Bypass -EncodedCommand $EncodedCommand`"
$Result = Start-Process -FilePath $PsExecExecutable -ArgumentList $CommandString -Wait -NoNewWindow -PassThru -RedirectStandardOutput $TempFileNameSTDOUT -RedirectStandardError $TempFileNameSTDERR -ErrorAction Continue"

Интерактивный скрипт interactiveScript.ps1, который должен перенаправить все свои выводы / ошибки на вызывающий скрипт, который асинхронно передает их на хост C #:

param
(
    [Parameter(Mandatory=$true)]
    [string]$myArg1
)
Write-Output "Starting interactive script..." # this string must be transmitted to host
Write-Error "This is an error" # this error must be transmitted to host
Sleep 1 # Here the user interacts with the script
[System.Drawing.Bitmap]$img = ... # Here the script takes a screenshot of a window
Write-Output ([string](MyImageSerialization($img)) # this string must be transmitted to host

Примечание : я не могу передать объект напрямуюнапример, [System.Drawing.Bitmap] для хоста, потому что это ссылка, поэтому я буду сериализовать его в строку.Поэтому допустимо, если решение работает только для строковых выводов и ошибок.


ВОЗМОЖНЫЙ КЛЮЧ:

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

...