从代码运行PsExec进程的问题

时间:2011-07-25 06:53:27

标签: c# .net process psexec start-process

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

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

  2. 从控制台应用程序运行时(创建进程,     运行带有必要参数的PsExec.exe) - 它是     运行OK。

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

  4. 以下是我正在使用的代码:

    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中的错误吗? (这适用于其他程序,批处理文件等)。

2 个答案:

答案 0 :(得分:3)

尝试在您的psexec

参数中添加-accepteula

答案 1 :(得分:2)

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

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


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

相关问题