C# 正在运行包装进程的远程Powershell Commandlet在完成之前退出

C# 正在运行包装进程的远程Powershell Commandlet在完成之前退出,c#,powershell,powershell-3.0,powershell-remoting,visual-studio-test-runner,C#,Powershell,Powershell 3.0,Powershell Remoting,Visual Studio Test Runner,我在C#中创建了一个自定义PowerShell commandlet,它可以启动vstest.console.exe的一些实例,并将测试结果发布到.trx文件或tfs。 在本地使用PowerShell时,此commandlet可以独立工作 但是,当我使用v3 PowerShell远程处理远程运行commandlet时,invoke命令完成,但有两个问题: 测试运行过程未完成,因为没有发布结果文件 我不会在远程控制台上获得结果,而在本地情况下,它们会从新启动的进程中冒泡出来 这是我在远程Power

我在C#中创建了一个自定义PowerShell commandlet,它可以启动vstest.console.exe的一些实例,并将测试结果发布到.trx文件或tfs。 在本地使用PowerShell时,此commandlet可以独立工作

但是,当我使用v3 PowerShell远程处理远程运行commandlet时,invoke命令完成,但有两个问题:

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

    $j = Invoke-Command -Session $currentPSSession -AsJob -ScriptBlock {
        Add-PSSnapin "IntegrationTestTools"
        Start-IntegrationTests -someotherUnimportantArgs
    } | Wait-Job
    
    $results = $j | Receive-Job
    
    通过单步执行脚本,它确实会等待作业,但是结果是空的

    请注意,我已按照设置远程处理 . 我还设置了Wsman

    set-item WSMan:\localhost\Shell\MaxMemoryPerShellMB 0
    set-item WSMan:\localhost\Shell\MaxProcessesPerShell 0
    set-item WSMan:\localhost\Shell\MaxShellsPerUser 0
    
    因此,进程和允许的内存不应该限制这个特定的练习


    有什么想法吗?

    我想我会和大家分享,以防有人不幸在某个时候发生这种情况。如果在连接到远程PowerShell会话时使用credssp作为身份验证枚举,则您的用户令牌将标记为“模拟”,这意味着您是网络用户组的一部分,这意味着由于SID 5-1-5-2()被拒绝访问命名管道,因此无法看到WCF命名管道。这里有一篇关于这个主题的启发性文章:

    我用PowerShell commandlet远程启动的进程启动了通过命名管道进行通信的子进程:(
    因此,最终我不得不将(系统内部)作为系统,以使该进程在远程会话中本地执行。这并不优雅,但这是我所拥有的一切

    还感谢他对PowerShell故障排除的帮助


    我的博客文章详细介绍了我的发现-

    只是为了确保引用了正确的作业对象,请执行以下操作
    $job=Invoke Command…-AsJob…
    。然后
    等待job$job
    接收job$job
    。此外,管理单元是否特定于位(32位或64位)?谢谢Keith,在您的回复之前,我确实更改了获取作业对象的方式,我在上面进行了更新。管理单元在目标计算机上的x64和x86中都注册了。通过监视任务管理器,我的commandlet调用的进程精确地旋转60秒,然后被终止。因此,我试图确定是什么导致了该时间ut.您知道有任何WSMan设置可能导致子流程出现这种情况吗?您认为这可能是原因吗?不确定。您可以尝试更改该值。顺便问一下,如果您在PSSession配置为使用localhost的情况下运行此设置,会发生什么情况?只是尝试消除一些变量。如果我使用
    $currentPSSession=New PSSession localhost,则是,在目标机器上运行脚本,然后commandlet调用的子进程仍在60秒时退出。