C# Невозможно захватить вывод при запуске от имени другого пользователя
Я делаю приложение, которое позволяет клиенту перечислить все свои запущенные процессы в диалоговом окне. В настоящее время у меня есть код ниже, и я не могу понять, почему он не работает.
Я не вижу никакого выхода, будь то 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 с различными свойствами, но не вижу никакого вывода вообще.
Любая помощь с этим очень ценится! Большое спасибо
1 ответ
Проблема в том, что командная строка указывает, что вывод должен идти в файл. Я также рекомендовал бы использовать 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