运行Remote Powershell包装进程的Commandlet在完成之前退出

时间:2013-05-01 18:20:00

标签: c# powershell powershell-v3.0 powershell-remoting visual-studio-test-runner

我有一个我在C#中创建的自定义PowerShell命令行开关,它会旋转一些vstest.console.exe实例,并将测试结果发布到.trx文件或tfs。 在本地使用PowerShell时,此命令行开关是独立工作的。

但是,当我使用v3 PowerShell远程处理远程运行命令行开关时,invoke-command完成,但有2个问题:

  1. 测试运行过程未完成,因为没有发布结果文件
  2. 我没有在远程控制台上获得结果,而在本地情况下,它们从新启动的进程中冒出来
  3. 这是我在远程PowerShell调用脚本中使用的远程调用

    $j = Invoke-Command -Session $currentPSSession -AsJob -ScriptBlock {
        Add-PSSnapin "IntegrationTestTools"
        Start-IntegrationTests -someotherUnimportantArgs
    } | Wait-Job
    
    $results = $j | Receive-Job
    

    从单步执行脚本确实等待作业,但结果是空的。

    要注意我已根据Keith Hill's post设置了远程处理 。我也设置了Wsman

    set-item WSMan:\localhost\Shell\MaxMemoryPerShellMB 0
    set-item WSMan:\localhost\Shell\MaxProcessesPerShell 0
    set-item WSMan:\localhost\Shell\MaxShellsPerUser 0
    

    所以进程和允许的记忆不应该限制这个特定的练习。

    有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我想我会分享以防万一有人不幸在某些时候发生这种情况。如果在连接到远程PowerShell会话时使用credssp作为身份验证枚举,则您的用户令牌被标记为“impersonate”,这意味着您是NETWORK USER组的一部分,这意味着不能将WCF命名管道作为SID 5-1的可见性-5-2(more commonly known as the Network SID)被拒绝访问命名管道。这是关于这个主题的启发性文章:KennyW's blog

我从PowerShell命令行开始远程启动的进程启动了通过命名管道进行通信的子进程:(
因此最终必须将psexec(sysinternals)作为系统来使该进程在远程会话中本地执行。不优雅,但这是我所有的。

还要感谢Keith Hill对PowerShell疑难解答的帮助!

我的博客文章详细介绍了我的发现 - http://josephkirwin.com/2013/05/06/the-named-pipes-had-a-party-and-imposters-were-not-invited/