我正在尝试从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只能查看进程,而不能与它们进行交互。
答案 0 :(得分:0)
当您处理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())
{
之后你用代码做任何事情。请注意,此代码仅用于获取进程,我没有远程结束进程发送呼叫的经验,但至少在此情况下,您可以开始检查远程计算机是否正在运行某个进程。