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

C#作为其他用户运行时无法捕获输出,c#,cmd,citrix,tasklist,C#,Cmd,Citrix,Tasklist,我正在制作一个应用程序,它允许客户端在对话框中列出所有正在运行的进程。我目前有下面的代码,我无法找出为什么它不工作 我没有看到任何输出,无论是sderr还是stdout。有人能给我指一下正确的方向吗 非常感谢 private void button1_Click(object sender, EventArgs e) { string test = " "; var ss = new SecureString(); ss.AppendC

我正在制作一个应用程序,它允许客户端在对话框中列出所有正在运行的进程。我目前有下面的代码,我无法找出为什么它不工作

我没有看到任何输出,无论是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";

        ProcessStartInfo 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
        };

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

        MessageBox.Show(test);
        MessageBox.Show("done");
我尝试将输出重定向设置为true和false,并尝试设置>c:。。。在CMD命令中使用各种属性,但根本看不到任何输出

非常感谢您的帮助!
非常感谢

问题在于命令行指定输出应转到文件。我还建议使用
StringBuilder
来收集输出。它比用
+=
连接字符串要高效得多

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";

        ProcessStartInfo 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
        };

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

        MessageBox.Show(test);
        MessageBox.Show("done");
下面是一个显示工作版本的示例,后面是一个显示您看到的行为的版本

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

问题是,命令行指定输出应转到文件。我还建议使用
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

可能没有输出,因为命令被重定向到文件。如果将其更改为
newprocessstartinfo(“cmd”、“/C tasklist/S”+serverName+“/FI\”SESSION eq“+sessionID)
有效吗?您好,不仅您是正确的,而且还需要重置服务器,以便Xtest可以重新获得其管理权限!我将在几分钟内将该注释扩展为实际答案。可能没有输出,因为命令被重定向到文件。如果您将其更改为
new ProcessStartInfo(“cmd”),则/C任务列表/S“+serverName+”/FI \“SESSION eq”+sessionID)
它能工作吗?嗨,B,不仅你说得对,而且还需要重置服务器,以便Xtest能够重新获得其管理权限!我将在几分钟内把这个评论扩展成一个实际的答案。