使用PsExec运行PowerShell脚本并收集输出对象

时间:2019-06-17 19:53:34

标签: powershell winrm

从远程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流。

0 个答案:

没有答案