从代码运行PsExec进程的问题

尝试使用PsExec远程运行.NET命令行工具时,我遇到了一个奇怪的问题。

  1. 从命令行运行PsExec时,它运行并完成正常。

  2. 从控制台应用程序运行它时(创建一个进程,运行带有必要参数的PsExec.exe) – 它运行正常。

  3. 从我们用于运行不同任务的内部自定义工具运行它时,它会超时或无法成功完成。

这是我正在使用的代码:

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行或独立应用程序运行良好!

我不知道这里还有什么不对。

我们的内部工具生成一个新线程并在其中运行此代码。

更新:

命令行+命令行窗口中的args – 工作。 相同的cmd + args,作为带有RedirectOutput的进程运行 – 停止并在超时时返回。

这可能是.NET中的一个错误吗? (这适用于其他程序,批处理文件等)。

我不知道错误什么,但我有一种预感,如果你重定向stderr( RedirectStandardError = true )并读取stderr流(就像你使用stdout一样)它会告诉你。 或者,在调试时让CreateNoWindow = false并且您可能会看到控制台消息(特别是如果它正在等待按键;否则它可能会消失太快而无法注意到)。

请注意,如果进程未终止,则可能需要在stdout / stderr上设置异步读取器。 您可以在额外的线程上执行此操作,也可以通过OutputDataReceived / ErrorDataReceived事件执行此操作(您还需要将EnableRaisingEvents设置为true )。


如果仍然不起作用; 您可以尝试使用UseShellExecute=true运行。 这意味着您将无法重定向IO,因此您可能必须使用> / >> etc将输出传输到文件(理想情况下为temp),然后读取该文件。

尝试将-accepteula添加到psexec的参数中