4

リモート マシンへのリモート デスクトップ セッションにすばやくアクセスできる管理アプリケーションも作成しました。プロセスが終了するまで待つ必要があるため、リモート サーバーへの VPN 接続を閉じることができます。プロセスが終了するのを待つことを除いて、すべてが正常に機能します。

次のコードは、MSTSC プロセスを開始し、終了するまで待機するために使用されています。

var process = new Process
{
  StartInfo = new ProcessStartInfo("mstsc.exe"),
  EnableRaisingEvents = true
};
process.Exited += (o, e) => Console.WriteLine("Process stopped.");
process.Start();
Console.ReadLine();

イベントは、Exitedプログラムの開始直後に発生します。すべてを置き換えるmstsc.exeと、期待どおりに機能します。notepad.exeMSTSC が自分自身を fork し、最初のプロセスを中止するのではないかと考えました。

ただし、(コマンドラインから) 次のコマンドを使用して、MSTSC が終了するのを待つことができます。

start /wait mstsc.exe

このコマンドは、リモート デスクトップ セッションを終了するまで戻りません。その情報を考慮して、コードを次のように置き換えました。

var process = new Process
{
  StartInfo = new ProcessStartInfo("cmd.exe"),
  Arguments = "/c start /wait mstsc.exe",
  EnableRaisingEvents = true
};
process.Exited += (o, e) => Console.WriteLine("Process stopped.");
process.Start();
Console.ReadLine();

これにより CMD.exe が実行され、start /wait mstsc.exeコマンドが発行されます。それが終了すると、CMD プロセスも終了し、問題ありません (厄介な回避策がありますが、問題ありません)。残念ながら、これは起こりません。CMD プロセスはただちに終了します。誰かが私が間違っていることを知っていますか?

4

6 に答える 6

5
process.WaitForExit();

起動時に mstsc がそれ自体の新しいコピーを開き、元のコピーを閉じるため、機能しません。

process.WaitForExit();    
process = Process.GetProcessesByName(process.ProcessName).First();
process.WaitForExit();

うまくいきますが、それはひどい回避策です。

更新 1:

mstsc は元のプロセスを閉じているようですが、出力ストリームではありません! そのため、プロセス StandardOutput が閉じるのを待つことができます。

var process = new Process
{
    StartInfo = new ProcessStartInfo("mstsc.exe") { UseShellExecute = false, RedirectStandardOutput = true }
};
process.Start();
process.StandardOutput.ReadToEnd(); //This will wait for stream to close.

または、現在のスレッドをブロックしたくない場合:

var process = new Process
{
    StartInfo = new ProcessStartInfo("mstsc.exe") { UseShellExecute = false, RedirectStandardOutput = true }
};

process.Start();

var outputResultPromise = process.StandardOutput.ReadToEndAsync();
outputResultPromise.ContinueWith(o=> Console.WriteLine("Stream closed"));

Console.ReadLine();
于 2013-08-23T15:21:01.923 に答える
0

これは私と一緒に働いた:

process.Start();
Thread.Sleep(2000);
while(getNumProcesses() > 0)
   process.WaitForExit();


private static int getNumProcesses()
{
    Process[] myProcesses = Process.GetProcessesByName("mstsc");
    return myProcesses.Length;
}
于 2014-11-18T14:54:58.180 に答える
0

複数の MSTSC プロセスが実行されているため、1 つを待つのは困難です。私が理解していないのは、start /waitコマンドを使用するとCMD.EXEがそれを実行できるということです。

于 2013-08-23T22:08:27.013 に答える
0

mstsc.exe プロセスを待つことはできません。正確に言うと、リモート デスクトップが終了するのをただ待つことはできません。プロセス モニターで mstsc.exe プロセスを観察したところ、mstsc は自分の作業を svchost に渡し、mstsc.exe は終了しましたが、リモート デスクトップはまだ実行されていました。

しかし、リモートアプリケーション用のスクリプトを書きました。スクリプト remoteCmd.cmd は remoteApplication を開始し、リモート マシンは一時ファイル (\\tsclient\c..\temp\xxx) を作成し、remoteCmd.cmd は一時ファイルが存在するまで待機します。https://github.com/turzik/WindowsScripts/tree/master/remoteAppを参照して ください

于 2020-04-20T12:17:35.517 に答える