繁体   English   中英

为什么Process.StandardOutput与实际输出不同和/或不完整?

[英]Why is Process.StandardOutput different from the actual output and/or incomplete?

好吧,首先,当从C#执行PsExec命令时,输出的一部分在StandardOutput而另一部分由于某些原因StandardError ,如其他文章所述 ,但这没什么大不了的。

现在,问题是:即使将两个部分组合在一起,“输出”与“命令提示符”窗口中显示的内容也不完全相同。 有时是不同的,有时是不完整的。

这是我的代码:

string args = $@"{computerName} -u ""{username}"" -p ""{password}"" {pathOrCommand}";
var pi = new ProcessStartInfo("PsExec.exe", args);
pi.CreateNoWindow = true;
pi.WindowStyle = ProcessWindowStyle.Hidden;
pi.UseShellExecute = false;
pi.RedirectStandardOutput = true;
pi.RedirectStandardError = true;
using (Process p = Process.Start(pi))
{
    var resultLines = new List<string>();
    var handler = new DataReceivedEventHandler(delegate (object o, DataReceivedEventArgs e)
    {
        resultLines.Add(e.Data);
    });
    p.ErrorDataReceived += handler;
    p.OutputDataReceived += handler;
    p.BeginErrorReadLine();
    p.BeginOutputReadLine();

    p.WaitForExit();   
    string result = string.Join("\r\n", resultLines);
}
  • 一个不同的例子:

    输入错误的用户名或密码时,命令提示符将显示以下消息: *

    登录失败:用户名未知或密码错误。

    ..而上述代码的输出将是:

    句柄无效。

  • 一个不完整的例子(这很重要)

    执行此命令PsExec \\\\computer -u username -p password query session ,结果看起来像这样: *

      SESSIONNAME USERNAME ID STATE TYPE DEVICE >services 0 Disc console someUserName 1 Active rdp-tcp 65537 Listen 

    ..但是从C#执行时的输出仅为:

      SESSIONNAME USERNAME ID STATE TYPE DEVICE 

因此,我的问题是:

  • 为什么Process.StandardOutput / Process.StandardError与实际输出不同?

  • 有没有办法解决?


* 我仅在此处介绍输出的相关部分。

我仍然不明白为什么输出会有所不同,但是我设法创建了一个解决方法,除非有人提供更好的解决方案,否则我将使用该解决方法。

我使用cmd.exestdoutstderr重定向到临时文件。 该过程退出后,我读取了文件的内容,然后将其删除:

string tempFile = Path.GetTempFileName();
string args = $@"/c PsExec.exe {computerName} -u ""{username}"" -p ""{password}"" {pathOrCommand}";
var pi = new ProcessStartInfo("cmd.exe", $"{args} 1> {tempFile} 2>&1");
pi.CreateNoWindow = true;
pi.WindowStyle = ProcessWindowStyle.Hidden;
using (Process p = Process.Start(pi))
{
    p.WaitForExit();

    string result = File.ReadAllText(tempFile);
    File.Delete(tempFile);
}

希望这可以帮助其他有同样问题的人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM