3

我正在使用 PowerShell Remoting(直接从 C# 代码)从 C# 应用程序连接到远程计算机。这很好用,但是每个这样的连接都会在目标计算机上留下一个新的进程wsmprovhost.exe(WSMan 主机进程)实例。它们从不退出并消耗少量(<0.1%)的 CPU 时间。

这是我用来打开 PowerShell 会话的示例代码:

 WSManConnectionInfo ci = new WSManConnectionInfo(
       false, host, 5985, 
       "/wsman", "http://schemas.microsoft.com/powershell/Microsoft.PowerShell", 
       credential
 );
 ci.AuthenticationMechanism = AuthenticationMechanism.Credssp;
 runspace = RunspaceFactory.CreateRunspace(ci);
 runspace.ApartmentState = Thread.CurrentThread.GetApartmentState();
 runspace.Open();

...这是我目前关闭该会话的方式:

 runspace.Disconnect();
 runspace.Close();
 runspace.Dispose();

我排除了我们在此运行空间中所做的任何事情导致这种情况的可能性,因为即使我们不对其执行任何操作, wsmprovhost.exe 也会保留在那里 - 即简单地连接然后断开连接。

当我从 PS 命令行手动执行等效操作时,问题不会发生- 即:

Enter-PSSession $host -Credential $cred -Authentication CredSSP
...
Exit-PSSession

在后一种情况下,wsmprovhost.exe的实例出现在Enter-PSSession之后,然后在Exit-PSSession之后立即关闭。

到目前为止,我尝试了以下方法,但都没有帮助:

  • 使用RunspacePool代替Runspace
  • Disconnect/ Close/的所有组合和排列Dispose
  • 设置CancelTimeoutWSManConnectionInfo小值(1ms)

我错过了一些简单的东西吗?关闭以编程方式打开的 PowerShell 会话的正确方法是什么?


编辑:所有系统上的 Windows 7、PowerShell 3.0 和 .Net 4.0。

编辑 2:我发现设置IdleTimeoutWSManConnectionInfo60000(60 秒 - 允许的最低值)会使wsmprovhost.exe在断开连接后一分钟退出。但是,在命令行方案中,IdleTimeout 为 2 小时,但 wsmprovhost.exe 在断开连接后立即终止。另外,我现在注意到响应 C# 操作而启动的 wsmprovhost.exe 毕竟确实退出了,但仅在 2 小时内。一分钟肯定比 2 小时好,但在重负载场景中,我们的应用程序可能必须频繁地运行 PowerShell,以使 1 分钟的关闭时间成为问题。

4

0 回答 0