从远程服务器上运行的控制台应用程序捕获输

时间:2013-02-07 22:21:28

标签: c# wmi remote-server

我正在使用WMI(C#代码)

在远程服务器上运行控制台应用程序

我想捕获流程的输出。

有人可以帮我这样做吗?

情境:

我有一个网页,用户可以在其中提供服务器详细信息。当用户点击提交时,我想在远程服务器上调用app并传递参数。远程服务器上的应用程序将执行操作并将返回输出(输出可以是数字,字符串或布尔值)。

根据输出,我需要提示用户提供更多详细信息或显示错误。

object[] processToRun = new[] { "\"Path to exe\" \"Param1\" \"Param2\"" };
ConnectionOptions connection = new ConnectionOptions();
connection.Username = "username";
connection.Password = "password";
ManagementScope wmiScope = new ManagementScope(String.Format("\\\\{0}\\root\\cimv2", "ServerName"), connection);
ManagementClass wmiProcess = new ManagementClass(wmiScope, new ManagementPath("Win32_Process"), new ObjectGetOptions());
wmiProcess.InvokeMethod("Create", processToRun);

我想得到这个的输出。

临时解决方案:但无法正常工作

作为临时解决方案,我添加了代码以在共享路径上创建日志文件,每个人都可以访问。但在这里我再次面临问题,当我在远程服务器上调用exe来写入共享路径时,我总是得到错误,说“访问被拒绝”。但是当我从服务器本身运行exe时,它运行正常。

2 个答案:

答案 0 :(得分:1)

我过去曾使用PsExec。当防火墙阻止WMI请求时,这有帮助。您应该能够启动PsExec,就像从C#启动任何其他进程一样,只需重定向标准输出。我认为你在PsExec本身的输出流中会有一些额外的字节和比特,但它应该可以让你在修剪后需要去的地方。

答案 1 :(得分:0)

假设您想从第二台机器收集输出,一种方法是使用套接字。第二台机器将托管基于套接字的侦听服务绑定预定义端口。

一旦您的控制台应用程序有东西要发回,它就会打开与第二台机器的连接并发送数据。

如果有很多客户端,并且您希望他们经常与他们进行通信,那么您可以使用基于WCF或Web服务的解决方案,这些解决方案可以提供许多现成的框架

根据您提供的附加信息

创建远程控制台进程时,将其传递给唯一ID(GUID),该ID将其与Web服务器上发起的客户端请求联系起来。您的控制台应用程序现在将捕获输入并通过套接字和guid将其发送到服务器。

服务器可以使用GUID将每个输出记录到数据库表中以标识每个会话。 现在,启动的用户可以使用相同的GUID查询输出(记住在用户创建请求时生成GUID,因此用户将始终拥有它),服务器将从表中获取输出并显示

此外,您可以使用管理任务来清除超过x天数的所有结果的输出表

希望这有帮助