使用 ASP .Net 管理本地机器上的进程

Posted

技术标签:

【中文标题】使用 ASP .Net 管理本地机器上的进程【英文标题】:Manage processes on local machine using ASP .Net 【发布时间】:2012-01-05 01:58:30 【问题描述】:

我正在尝试通过 ASP .Net Web 应用程序在远程服务器中执行进程(请注意,Web 应用程序与进程驻留在同一台服务器上)。我正在运行的代码如下:

 ConnectionOptions conO = new ConnectionOptions();
          //  conO.Username = txtUser.Text;
          // conO.Password = txtPassword.Text;

            ManagementPath path = new ManagementPath(@"\\" + txtRemoteComputer.Text + @"\root\cimv2");

            System.Management.ManagementScope oMs = new System.Management.ManagementScope(path, conO);
            oMs.Connect();

            ObjectGetOptions opt = new ObjectGetOptions();
            ManagementClass classInstance = new ManagementClass(oMs, path, opt);
            ManagementBaseObject inParams = classInstance.GetMethodParameters("Create");
            inParams["CommandLine"] = txtPath.Text;
            ManagementBaseObject outParams = classInstance.InvokeMethod("Create", inParams, null);
            lblInfo.Text = outParams["returnValue"].ToString() + " Process ID: 0" + outParams["processId"].ToString();

但是,我收到以下错误:

由于对象的当前状态,操作无效。

有没有人有更好的解决这个问题的方法?

顺便说一句,我有以下情况:

我的客户运行一个服务器,其中他有一些应用程序可以做许多不同的事情(日志记录、计算......)。他希望能够监控并在需要时从基于 Web 的客户端(甚至他的手机)重新启动这些应用程序。

我试图使用这个应用程序来完成一个进程并启动同一个进程。使用 System.Diagnostics 我能够查询当前正在运行的进程,但这显然不是一个解决方案,因为对于远程机器 System.Diagnostics 只能查看进程,而不能与它们交互。

【问题讨论】:

你在服务器端做的任何事情都会在服务器端运行。如果您想在客户端上运行任意代码,那么您需要在客户端有一些应用程序,该应用程序能够根据代码 sn-ps 动态确定您要执行的操作。也许在客户端上运行的服务器中集成类似CSScript 项目的东西会有所帮助。 我试图实现的网站和正在运行的应用程序实际上都在服务器上运行。现在,如果我必须重新实现这些应用程序,我可能会选择将它们实现为 Windows 服务,但不幸的是,这些应用程序很久以前就已经实现了,而且我没有可用的源代码。一个问题是这些应用程序容易崩溃。要求是能够检测一个是否已经崩溃,并重新启动它。 那么你真的想“使用 ASP .Net 在远程机器上执行一个进程”吗?如果您的客户端和服务器在同一台机器上,那么它并不是真正的“远程”,是吗? :) 抱歉,这个标题具有误导性……我试图做的是从同一台机器管理进程。 别告诉我...修复你的标题。 【参考方案1】:

当您处理 WMI 并收到您列出的错误时,通常意味着您的查询没有返回数据。查看您的代码,您似乎从未调用过存储过程数据的位置。您需要在代码中的某处调用 Win32_Process。获取进程信息的代码如下所示:

ManagementPath path = new ManagementPath(@"\\" + txtRemoteComputer.Text + @"\root\cimv2");
System.Management.ManagementScope oMs = new System.Management.ManagementScope(path, conO);
oMs.Connect();
ObjectQuery query = new ObjectQuery(
                "SELECT * FROM Win32_Process");
ManagementObjectSearcher searcher =
                new ManagementObjectSearcher(oMs, query);
foreach (ManagementObject queryObj in searcher.Get())

之后,您可以对代码执行任何操作。请注意,此代码仅用于获取进程,我没有发送调用以远程结束进程的经验,但至少可以开始检查远程计算机是否在晚上运行某个进程。

【讨论】:

以上是关于使用 ASP .Net 管理本地机器上的进程的主要内容,如果未能解决你的问题,请参考以下文章

小5聊Asp.Net Core基础之发布不成功或者覆盖IIS上的DLL提示程序正在打开

在 ASP.NET 中以不同用户身份启动进程

在 .NET 中,同一台机器上的两个进程进行通信的最佳方式是啥?

从 Linux 机器上的 .Net Core 应用程序获取进程的内存使用情况

HTTP 错误 502.5 - 升级到 ASP.NET Core 2.2 后 ANCM 进程外启动失败

在 ASP.Net MVC5 中管理长时间运行的进程