Несколько процессов wsmprovhost.exe не завершаются после закрытия удаленных сеансов PowerShell

Я подключаюсь к удаленным компьютерам из приложения C# с помощью PowerShell Remoting (непосредственно из кода C#). Это работает нормально, однако каждое такое соединение оставляет новый экземпляр процесса wsmprovhost.exe (хост-процесс WSMan) на целевом компьютере. Они никогда не выходят и потребляют небольшое количество (<0,1%) процессорного времени.

Вот пример кода, который я использую для открытия сеансов 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
  • настройка CancelTimeout на WSManConnectionInfo до небольших значений (1 мс)

Я что-то упустил? Как правильно закрыть программно открытые сессии PowerShell?


Изменить: Windows 7, PowerShell 3.0 и.Net 4.0 на всех системах.

Изменить 2: я нашел эту настройку IdleTimeout на WSManConnectionInfo до 60000 (60 секунд - минимально допустимое значение) заставляет wsmprovhost.exe завершать работу через одну минуту после отключения. Однако в сценарии командной строки IdleTimeout составляет 2 часа, и все же wsmprovhost.exe завершает работу сразу после отключения. Кроме того, теперь я заметил, что wsmprovhost.exe, запущенный в ответ на действия C#, в конце концов завершается, но только через 2 часа. Одна минута, безусловно, лучше, чем 2 часа, но в сценариях с высокой нагрузкой нашему приложению может потребоваться запускать PowerShell достаточно часто, чтобы 1-минутное закрытие могло стать проблемой.

0 ответов

Другие вопросы по тегам