将STDOUT \ STDERR从远程计算机上的win32_process create重定向到当前shell

时间:2016-01-08 22:41:22

标签: powershell cmd wmi powershell-v2.0 stdout

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

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

我可以成功执行该过程并接收返回值0

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

您无法为通过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。

BTW,msiexec.exe有一个日志记录参数,所以你真的不需要输出重定向:

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

答案 1 :(得分:0)

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

以下链接提供了一种将STDOUT传递给应用程序的方法,在本例中为命名管道服务器:

https://superuser.com/a/430475

在powershell中创建命名管道服务器\客户端的几个方法\引用: https://stackoverflow.com/a/24111270/4292988

https://stackoverflow.com/a/719397

How to use named pipes over network?

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

还有其他解决方法,包括上述PsExec。 最终我选择的解决方法涉及设置tcp服务器\客户端,这可以在较慢的网络中克服TCP / IP上命名管道的瘫痪,并且不需要第三方软件。

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