所以这是我的代码:
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
的原因?它会终止快速吗?
我的错误在哪里?
更新1:
重定向ErrorOutput
后,我得到了一些额外的信息。
我添加了ErrorOutput并且它说了命令'查询'找不到
那么我的命令是什么问题?
在这里,您可以看到它在cmd中工作:
更新2:如果我从命令中删除了/c
,它就没有做任何事情。如果我打破调试器,它会在proc.StandardOutput.ReadToEnd();
一段时间后,我得到ContextSwitchDeadlock
...
这有什么可怕的错误?
答案 0 :(得分:2)
如果您正在寻找错误,请执行以下操作:
proc.StartInfo.RedirectStandardError = true;
然后从proc.StandardError
读取。
更新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();
更新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
构建。