【发布时间】:2017-02-16 17:07:10
【问题描述】:
问题
在启用异步重定向的情况下从 C# 作为进程执行 PSExec 我的数据接收事件处理程序永远不会被调用。
上下文
我有一个 C# 应用程序,用于连接和管理同一本地网络上多台其他计算机上的从属应用程序。主应用程序和从属应用程序都是 Windows 窗体应用程序。我的应用程序的一项功能是能够远程启动从属应用程序。因为这样做需要一些时间,所以我希望使用 PSexec 的输出来表明确实发生了一些事情。下面是我用来启动远程应用程序的代码。
ProcessStartInfo start = new ProcessStartInfo();
start.CreateNoWindow = true;
start.RedirectStandardError = true;
start.RedirectStandardOutput = true;
start.RedirectStandardInput = true;
start.UseShellExecute = false;
start.WorkingDirectory = System.Windows.Forms.Application.StartupPath + "\\PSTools\\";
start.FileName = start.WorkingDirectory + "PsExec.exe";
start.Arguments = "\\\\" + ComName + " -u \"" + UserName + "\" -p \"" + Password +
"\" -i -w " + RemoteDrectory + "\" \"" + RemoteDrectory + "\\" + ApplicationName + "\"";
try
{
if (proc != null)
{
if (proc.HasExited == false)
{
proc.Kill();
proc.Close();
}
proc.Dispose();
proc.OutputDataReceived -= ProcDataReceaved;
proc.ErrorDataReceived -= ProcDataReceaved;
}
proc = new Process();
proc.EnableRaisingEvents = true;
proc.OutputDataReceived += new DataReceivedEventHandler(ProcDataReceaved);
proc.ErrorDataReceived += new DataReceivedEventHandler(ProcErrorReceaved);
proc = Process.Start(start);
proc.BeginOutputReadLine();
proc.BeginErrorReadLine();
}
catch(Exception e)
{
Console.WriteLine("An error occurred while launching slave application\r\n" + e.ToString());
}
这实际上具有在远程计算机上启动从属应用程序而没有问题的预期效果。此外,如果我禁用输出重定向,控制台会显示以下内容:
PsExec v2.2 - 远程执行进程 版权所有 (C) 2001-2016 标记 Russinovich Sysinternals - www.sysinternals.com
正在 ComName 上启动 PSEXESVC 服务...
一旦建立连接,最后一行将被删除。如果现在重要的话,事件处理程序定义如下:
public void ProcDataReceaved(object sender, DataReceivedEventArgs e)
{
Console.WriteLine("Data Received from process\r\n" + e.Data);
}
public void ProcErrorReceaved(object sender, DataReceivedEventArgs e)
{
Console.WriteLine("Data Received from process\r\n" + e.Data);
}
可选目标
如果有的话,从属应用程序预计不会有太多控制台输出。但是,如果我也可以通过 PSexec 输出准备好从服务器的任何输出,那就太好了。
潜在领先 3/8/17
今天我与https://www.poweradmin.com/paexec/ 的代表进行了交谈,特别是一位名叫大卫的代表。 PSExec (PAExec) 的版本使用 WriteConsole 命令来写入我试图接收的输出。因此,此输出不会写入 stderr 或 stdout,而是直接写入控制台的屏幕缓冲区。显然,这并没有说明任何 PSExec,因为他们不是同一个人。但这确实表明这可能是我的问题。如果是这样,我需要另一种方法来跟踪连接进度。
【问题讨论】:
-
只是在这里大声思考......如果不是启动和监视 PSExec,而是启动 CMD,然后在 CMD 中启动 PSExec。难道你不能从 CMD 中获取输出,这将具有 PSexec 的输出吗?
-
@blaze_125 奇怪的是,我没有看到应用程序的行为有任何显着差异。
标签: c# asynchronous io-redirection psexec