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
- 小さい値 (1ms)
CancelTimeout
に設定WSManConnectionInfo
簡単なものがありませんか?プログラムで開いた PowerShell セッションを閉じる正しい方法は何ですか?
編集: すべてのシステムで Windows 7、PowerShell 3.0、および .Net 4.0。
編集 2: 60000 (60 秒 - 最小許容値) に設定すると、IdleTimeout
wsmprovhost.exeが切断の 1 分後に終了することがわかりました。ただし、コマンド ライン シナリオでは、IdleTimeout は 2 時間ですが、wsmprovhost.exe は切断直後に終了します。また、C# のアクションに応答して開始された wsmprovhost.exe が終了することに気付きましたが、結局 2 時間しかかかりませんでした。2 時間よりも 1 分間の方が良いのは確かですが、負荷の高いシナリオでは、アプリケーションが PowerShell を頻繁に実行しなければ、1 分間の終了時間が問題になる場合があります。WSManConnectionInfo