封装进程的远程Powershell命令行在完成前退出
本文关键字:退出 命令行 Powershell 进程 封装 | 更新日期: 2023-09-27 18:11:37
我有一个自定义的PowerShell命令let,我在c#中创建了它,它启动了一些vest .console.exe的实例,并将测试结果发布到.trx文件或tfs。在本地使用PowerShell时,这个命令集是独立工作的。
然而,当我使用v3 PowerShell远程运行命令let时,调用命令完成,但有2个问题:
- 测试运行进程未完成,因为没有发布结果文件
- 我在远程控制台上没有得到结果,而在本地情况下,它们从新启动的进程中冒泡出来
下面是我在远程PowerShell调用脚本
中使用的远程调用$j = Invoke-Command -Session $currentPSSession -AsJob -ScriptBlock {
Add-PSSnapin "IntegrationTestTools"
Start-IntegrationTests -someotherUnimportantArgs
} | Wait-Job
$results = $j | Receive-Job
从逐步执行脚本,它确实等待作业,但是结果是空的。
要注意的是,我已经按照Keith Hill的帖子设置了远程控制. 我还设置了Wsman
set-item WSMan:'localhost'Shell'MaxMemoryPerShellMB 0
set-item WSMan:'localhost'Shell'MaxProcessesPerShell 0
set-item WSMan:'localhost'Shell'MaxShellsPerUser 0
所以进程和允许的内存不应该限制这个特殊的练习。
任何想法?
我想我应该分享一下,以防有人不幸在某个时候发生这种情况。如果您在连接到远程PowerShell会话时使用credssp作为身份验证enum,则您的用户令牌被标记为"impersonate",这意味着您是NETWORK user组的一部分,这意味着WCF命名管道不可见,因为SID 5-1-5-2(更通常称为NETWORK SID)被拒绝访问命名管道。这里有一篇关于这个主题的启发性文章:KennyW的博客。
我用PowerShell命令远程启动的进程启动了通过命名管道通信的子进程:(
因此,最终必须psexec (sysinternals)作为system,以使该进程在远程会话中本地执行。不是很优雅,但这是我唯一可用的。
还要感谢Keith Hill在PowerShell故障排除方面的帮助!
我的博客文章详细介绍了我的发现- http://josephkirwin.com/2013/05/06/the-named-pipes-had-a-party-and-imposters-were-not-invited/