当 运行 作为其他用户时无法捕获输出
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");
}
我已尝试将重定向输出设置为 true
和 false
,并且我已尝试在具有各种属性的 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
我正在制作一个应用程序,允许客户在对话框中列出所有 运行 进程。我目前有以下代码,但我不知道为什么它不起作用。
我没有看到任何输出,无论是 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");
}
我已尝试将重定向输出设置为 true
和 false
,并且我已尝试在具有各种属性的 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