关闭远程PowerShell会话后,多个进程wsmprovhost.exe不会终止

时间:2014-03-13 03:35:39

标签: c# session powershell powershell-remoting wsman

我使用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

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

到目前为止,我尝试了以下内容,其中没有一项有帮助:

  • 使用RunspacePool代替Runspace
  • Disconnect / Close / Dispose
  • 的所有组合和排列
  • CancelTimeout上的WSManConnectionInfo设置为较小的值(1毫秒)

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


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

编辑2: 我发现将IdleTimeout上的WSManConnectionInfo设置为60000(60秒 - 允许的最低值)会使 wsmprovhost.exe 在断开连接后一分钟退出。但是,在命令行方案中,IdleTimeout为2小时,但断开连接后wsmprovhost.exe会立即终止。另外,我现在注意到响应C#操作而启动的wsmprovhost.exe确实会退出,但仅在2小时内完成。 一分钟肯定好于2小时,但在重负载情况下,我们的应用程序可能需要经常运行PowerShell,以便在1分钟的关闭时间内成为问题。

0 个答案:

没有答案