コードから PsExec プロセスを実行する際の問題
-
25-10-2019 - |
質問
PsExec を使用して .NET コマンド ライン ツールをリモートで実行しようとすると、奇妙な問題が発生します。
コマンド ラインから PsExec を実行すると、正常に実行され、完了します。
コンソールアプリケーションから実行するとき(プロセスを作成し、必要な引数を使用してpsexec.exeを実行します) - それは実行されています。
さまざまなタスクを実行するために使用されるHouse In Houseカスタムツールから実行すると、時間が外れるか、正常に完了しません。
私が使用しているコードは次のとおりです。
Process p = new Process();
p.StartInfo.FileName = @"C:\PsExec.exe";
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
string arg = "-snapshot -display C:\*.msi -s";
p.StartInfo.Arguments = @"\\10.161.203.106 -u user -p pwd -cf C:\FVT.exe " + arg;
Logger.Info(this, "Starting process");
p.Start();
var ended = p.WaitForExit(60 * 1000);
if (!ended)
{
throw new Exception("Process timed out.");
}
Logger.Info(this, "Process ended");
using (StreamReader sr = p.StandardOutput)
{
string buffer = sr.ReadToEnd();
Logger.Info(this, buffer);
}
このコードは、cmd ラインまたはスタンドアロン アプリから正常に実行されます。
ここで他に何が間違っているのかわかりません。
私たちの社内ツールは新しいスレッドを生成し、その中でこのコードを実行します。
アップデート:
コマンドライン + コマンドラインウィンドウの引数 -- 動作します。同じ cmd + args、RedirectOutput を使用してプロセスとして実行 - タイムアウトで停止して戻ります。
これは .NET のバグでしょうか?(これは他のプログラム、バッチ ファイルなどでも発生します)。
解決
何がエラーなのか分かりません は, 、しかし、stderrをリダイレクトするとそうなる予感がします(RedirectStandardError = true
) そして (stdout で行うのと同じように) stderr ストリームを読み取ると、それがわかります。あるいは、デバッグ中にそのままにしておきます CreateNoWindow = false
そしておそらく、コンソール メッセージが表示されるでしょう (特にキー入力を待っている場合)。そうしないと、すぐに消えて気づかなくなる可能性があります)。
プロセスが終了しない場合は、stdout/stderr で非同期リーダーを設定する必要がある場合があることに注意してください。これは追加のスレッド上で行うことも、 OutputDataReceived
/ ErrorDataReceived
イベント (設定する必要があります) EnableRaisingEvents
に true
また)。
もしそうなら まだ 機能しません。一緒に走ってみるのもいいかもしれません UseShellExecute=true
. 。これは、IO をリダイレクトできないことを意味するため、使用する必要がある場合があります。 >
/ >>
etc を実行して出力をファイル (理想的には一時ファイル) にパイプし、そのファイルを読み取ります。
他のヒント
-accepteulaをあなたの議論にpsexecに追加してみてください