0

我正在使用 WMI(C# 代码)在远程服务器上运行控制台应用程序

我想捕获该过程的输出。

有人可以帮我这样做吗?

设想:

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

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

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 时,它​​工作正常。

4

2 回答 2

1

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

于 2013-02-07T22:32:26.477 回答
0

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

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

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

根据您提供的附加信息

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

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

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

希望这可以帮助

于 2013-02-07T23:27:05.493 回答