C#作为其他用户运行时无法捕获输出
我正在制作一个应用程序,它允许客户端在对话框中列出所有正在运行的进程。我目前有下面的代码,我无法找出为什么它不工作 我没有看到任何输出,无论是sderr还是stdout。有人能给我指一下正确的方向吗 非常感谢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
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能够重新获得其管理权限!我将在几分钟内把这个评论扩展成一个实际的答案。