2017-01-19 15 views
2

Так что это мой код:Невозможно получить CMD выход

private void CheckLastLogon(string computername) 
{ 
    string cmd = $"/C query user /server:{computername}"; 
    System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
    proc.StartInfo.FileName = "cmd.exe"; 
    proc.StartInfo.Arguments = cmd; 
    proc.StartInfo.UseShellExecute = false; 
    proc.StartInfo.CreateNoWindow = true; 
    proc.StartInfo.RedirectStandardOutput = true; 
    proc.Start(); 

    string output = proc.StandardOutput.ReadToEnd(); 

    proc.WaitForExit(); 
} 

output всегда string.Empty и я не получил никакого понятия, почему ... (Это работает в CMD).

Возможно, причина в /c в моей команде? заканчивается ли он быстро?

Где моя ошибка?


UPDATE 1: После перенаправлять ErrorOutput я получил некоторую дополнительную информацию.

Я добавил ErrorOutputand это говорит Команда «запрос» не найден

Так что проблема с моей командой?

Здесь вы видите, что он работает в ЦМД:

enter image description here


Update 2: Если удалить /c из моей команды это не делает ничего. Если я нарушу отладчик он ждет на proc.StandardOutput.ReadToEnd();

Некоторое время спустя я получаю ContextSwitchDeadlock ...

Что так ужасно неправильно об этом?

+0

Что делать, если вы удалите '/ C' тогда? – nozzleman

+0

, то он не будет прерван каким-то образом ... –

+0

попробуйте имя файла 'C: \ Windows \ System32 \ query.exe' Args' user/server: {computername} ', оставьте остальные как – nozzleman

ответ

2

Если вы ищете ошибки, которые нужно сделать:

proc.StartInfo.RedirectStandardError = true; 

А потом читать proc.StandardError.

UPDATE 1:

cmd При использовании в качестве посредника не работает. Вы можете попробовать запустить C:\Windows\System32\query.exe непосредственно в качестве автономного .exe. Это позволяет избежать использования cmd и всех проблем, которые это может вызвать.

Таким образом, вы бы смотреть на что-то вроде:

ProcessStartInfo procstart = new ProcessStartInfo 
{ 
      FileName = @"C:\Windows\System32\query.exe", 
      Arguments = $"user /server:{computername}", 
      UseShellExecute = false, 
      CreateNoWindow = true, 
      RedirectStandardOutput = true, 
      RedirectStandardError = true 
}; 
Process proc = new Process{StartInfo = procStart}; 
proc.Start(); 
string[] output = proc.StandardOutput.ReadAllLines(); 

UPDATE 2:

system32 может быть доступен только программами x64, x32 программа попадет на syswow64.

Если вы строите для x64только, следующий код работает:

 ProcessStartInfo procstart = new ProcessStartInfo 
     { 
      FileName = "query", 
      Arguments = "$"user /server:{computername}"", 
      UseShellExecute = false, 
      CreateNoWindow = true, 
      RedirectStandardOutput = true, 
      RedirectStandardError = true 
     }; 
     Process proc = new Process {StartInfo = procstart}; 
     proc.Start(); 
     Console.WriteLine(proc.StandardOutput.ReadToEnd()); 
     Console.WriteLine(proc.StandardError.ReadToEnd()); 
     Console.Read(); 

TLDR:

Если вы пытаетесь использовать команду cmd, не используйте cmd, как промежуточный, просто поместите его в StartInfo.FileName. Если эта команда находится в system32, убедитесь, что вы построили для x64.

+0

. Я просто ожидаю увидеть последний вход в эту машину. Поскольку он работает с CMD, я не ожидаю здесь ошибок ... –

+0

Я добавил «ErrorOutput», и он говорит: «Запрос команды« не найден ».. –

+0

Тогда есть проблемы с вашей командой, а не с тем, как вы получение –