使用案例:我通过PsExec运行命令检查远程系统上的某些凭据(例如,我试图检索当前安装在远程系统上的知识库文章)。
我有以下内容来检索命令输出:
public string GetCmDOutput(string cmd)
ProcessStartInfo startInfo = new ProcessStartInfo("control", cmd)
{
WindowStyle = ProcessWindowStyle.Hidden,
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true
};
string output = string.Empty;
Process process = Process.Start(startInfo);
process.OutputDataReceived += (sender, e) => output = string.Concat(output, e.Data);
process.BeginOutputReadLine();
process.Start();
process.WaitForExit();
Delay.Milliseconds(1500) //API-specific delay
return output;
}
每当我使用GetCmdOutput()
在本地运行命令时它就像魅力一样,但如果我尝试用PsExec运行命令,我的输出就是空的。
例如,我运行了以下内容:
string cmd = @"\psexec.exe \\remoteComputerName -u username -p password -c cmd /c wmic qfe";
GetCmdOutput(cmd);
Report.Info(cmd); //API-specific reporting
返回一个空字符串。
在玩了几个小时后,我觉得我可能需要第二眼。可能导致此问题的原因是什么?
答案 0 :(得分:2)
我遇到了同样的问题。我的解决方案是运行cmd并让它调用psexec。我将psexec的输出保存到临时文件中以便进一步操作。我的代码返回一个List。
public List<string> ExecutePSExec(string hostname)
{
List<string> recordNames = new List<string>();
string command = @"\\path\to\psexec.exe /accepteula \\" + hostname + ". exe-to-run-remotely";
try
{
string location = AppDomain.CurrentDirectory.BaseDirectory;
string cmdWithFileOutput = string.Format("{0} >{1}temp.log", command, location);
procStartInfo.UseShellExecute = true;
procStartInfo.CreateNoWindow = true;
procStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
Process proc = new Process();
proc.StartInfo = procStartInfo;
proc.Start();
proc.WaitForExit();
// Read file contents, manipulate data and then delete temp file here
}
catch (Exception e)
{
Console.WriteLine("Failure to run psexec: {0}", e.Message);
}
return recordNames;
}
注意:我遇到了另一个问题,发现以这种方式运行psexec要求命令中的远程主机名(而不是IP地址)在句号\\" + hostname + ".
此代码假定您可以作为当前用户在远程计算机上运行psexec。