使用 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提示程序正在打开
在 .NET 中,同一台机器上的两个进程进行通信的最佳方式是啥?
从 Linux 机器上的 .Net Core 应用程序获取进程的内存使用情况