Несколько процессов 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-минутное закрытие могло стать проблемой.