重定向 STDOUT\STDERR 到当前 shell 从 win32_process 在远程计算机上创建

Redirect STDOUT\STDERR to current shell from win32_process create on remote computer

我正在尝试从远程计算机上的 Powershell V2 中卸载应用程序。要调用卸载,我正在使用 [WMICLASS] 加速器,因为我们的域 ex:

不支持 PSRemoting
@([WMICLASS]"\$computerName\ROOT\CIMV2:win32_process").Create("msiexec.exe `/x{$GUID `/norestart `/qn")

我可以成功执行该过程并收到 return 值 0

__GENUS          : 2
__CLASS          : __PARAMETERS
__SUPERCLASS     : 
__DYNASTY        : __PARAMETERS
__RELPATH        : 
__PROPERTY_COUNT : 2
__DERIVATION     : {}
__SERVER         : 
__NAMESPACE      : 
__PATH           : 
ProcessId        : 9580
ReturnValue      : 0
PSComputerName   : 

我遇到的问题是似乎没有明显的方法来获取该过程的输出并将其 return 到我当前的 shell

一个选项,虽然不是我想要的

.Create("cmd /c msiexec.exe `/x{$GUID} `/norestart `/qn > $MyLog")
Get-Content -Path \$ComputerName$MyLog

我更喜欢一种将 STDOUT\STDERR 重定向到我的 shell 的方法,而无需创建文件然后从该文件读取。这可能吗?

您不能为通过 Win32_Process 创建的进程重定向 STDOUT 或 STDERR。如果您需要在控制台中输出该过程,请通过 Invoke-Command:

启动它
Invoke-Command -Computer $computerName -ScriptBlock {
  msiexec.exe /x$GUID /norestart /qn
}

或使用PsExec:

psexec.exe \$computerName msiexec.exe /x$GUID /norestart /qn

除此之外,您的选项仅限于记录到文件并读取该文件,AFAICS。

顺便说一句,msiexec.exe 有一个用于日志记录的参数,所以你真的不需要输出重定向:

 msiexec.exe /x$GUID /norestart /qn /l*v $MyLog

我偶然发现了解决我的问题的方法和解决方法。解决方案是创建一个命名管道服务器应用程序,将 STDOUT\STDERR 的输出管道输出到所述应用程序,而不是从服务器到客户端的流输出。

以下 link 提供了一种将 STDOUT 通过管道传输到应用程序的方法,在本例中是命名管道服务器:

https://superuser.com/a/430475

几个 methods\references 在 powershell 中创建命名管道 server\clients:

How to use named pipes over network?

https://rkeithhill.wordpress.com/2014/11/01/windows-powershell-and-named-pipes/

还有其他解决方法,包括前面提到的 PsExec。 最终,我选择的解决方法涉及设置一个 tcp server\client,这克服了在较慢的网络中 TCP\IP 上命名管道的缺点,并且不需要第三方软件。

http://learn-powershell.net/2014/02/22/building-a-tcp-server-using-powershell/