当 运行 作为其他用户时无法捕获输出

Unable to Capture Output When Running as Other User

我正在制作一个应用程序,允许客户在对话框中列出所有 运行 进程。我目前有以下代码,但我不知道为什么它不起作用。

我没有看到任何输出,无论是 sderr 还是 stdout。有人可以给我指出正确的方向吗?

private void button1_Click(object sender, EventArgs e)
{            
    string test = " ";

    var ss = new SecureString();
    ss.AppendChar('T');
    ss.AppendChar('a');
    ss.AppendChar('k');
    ss.AppendChar('e');
    ss.AppendChar('c');
    ss.AppendChar('a');
    ss.AppendChar('r');
    ss.AppendChar('e');
    ss.AppendChar('9');
    ss.AppendChar('9');
    ss.MakeReadOnly();

    var serverName = "SERVER-NAME";
    var sessionID = "2";
    var PID = "6816";

    var startInfo = new ProcessStartInfo("cmd", "/C tasklist /S " + serverName + " /FI \"SESSION eq " + sessionID + "\" >C:\users\test.account\desktop\NEWEWE.txt")
    {
        WorkingDirectory = @"C:\windows\system32",
        Verb = "runas",
        Domain = "BARDOM1",
        UserName = "XATest",
        Password = ss,

        WindowStyle = ProcessWindowStyle.Hidden,
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true
    };

    var proc = Process.Start(startInfo);
    proc.OutputDataReceived += (x, y) => test += (y.Data);
    proc.BeginOutputReadLine();
    proc.WaitForExit();

    MessageBox.Show(test);
    MessageBox.Show("done");
}

我已尝试将重定向输出设置为 truefalse,并且我已尝试在具有各种属性的 CMD 命令中设置 >c:\...,但看不到任何输出完全没有。

问题是命令行指定输出应该转到一个文件。我还建议使用 StringBuilder 来收集输出。它比用 +=.

连接字符串更有效

这是一个显示工作版本的示例,后面是一个展示您所看到的行为的版本。

StringBuilder test = new StringBuilder();

// Not redirected
ProcessStartInfo psi = new ProcessStartInfo("cmd", "/c echo yes")
{
    UseShellExecute = false,
    RedirectStandardOutput = true,
    CreateNoWindow = true
};

Process proc = Process.Start(psi);
proc.OutputDataReceived += (x, y) => test.Append(y.Data);
proc.BeginOutputReadLine();
proc.WaitForExit();

Console.WriteLine(test.ToString()); // Output: yes

test.Clear();

// Redirected
psi = new ProcessStartInfo("cmd", "/c echo yes > NUL")
{
    UseShellExecute = false,
    RedirectStandardOutput = true,
    CreateNoWindow = true
};

proc = Process.Start(psi);
proc.OutputDataReceived += (x, y) => test.Append(y.Data);
proc.BeginOutputReadLine();
proc.WaitForExit();

Console.WriteLine(test.ToString()); // Blank line