在远程计算机上运行exe文件时出现未处理的异常

时间:2014-07-28 07:31:10

标签: c#

我在这段代码上收到错误。我试图杀死远程计算机上正在运行的进程。我使用getprocessbyid,然后我终止了这个过程。

int pidKill = 2775;
Process p = Process.GetProcessById(pidKill);
p.Kill();

当我直接在机器上运行此脚本时,它运行正常,但是当我尝试从远程运行.exe文件时,我得到了一个异常:

Unhandled exception: System.ArgumentException: Process with an Id of
2775 is not running at System.Diagnostics.process.GetProcessById(Int
32 ProcessId, string MachineName)

错误在哪里?当我尝试直接在服务器上运行时,一切正常,但是当我从工作站运行时,我收到了错误。我使用此脚本运行.exe文件 我有一个按钮,用这段代码运行脚本:

System.Diagnostics.Process.Start(@"\\SERVERNAME\C$\temp\kill.exe");

2 个答案:

答案 0 :(得分:1)

您应该知道,由于您正在对进程ID进行硬编码,因此无法保证此功能正常运行。进程ID不是您可以依赖的东西,因为它是由操作系统自动生成的。也就是说,2775可能是本地计算机上的进程ID,但它并不代表它在远程计算机上是相同的

解决方案

使用Process类的其他方法,而不是GetProcessById使用GetProcessesByName时使用GetProcessesByName的一个重载,您可以指定IP地址远程机器

Process[] processes = Process.GetProcessByName("processName", "0.0.0.0"); 
 if(processes != null && processes.Length > 0)
    processes[0].Kill();

确保指定正确的进程名称和IP地址

更新

我刚刚意识到/记得根据MSDN文档,您无法使用System.Diagnostics.Process API终止远程进程。它有点误导,因为他们没有明确提到你不能杀死远程进程,而是提到你可以读取本地和远程进程

  

提供对本地和远程进程的访问,使您能够启动和停止本地系统进程。

但是当涉及到远程进程时,你只能阅读它们,你无法杀死它们。这样您就可以在Instrumentation API中找到另一个选项,了解如何实现进程终止...

using System.Management;
using System.Management.Instrumentation;

ManagementScope scope = new ManagementScope("\\\\RemoteMachine\\root\\cimv2");
scope.Connect();
QueryObject query = new QueryObject("SELECT * FROM Win32_Process WHERE Name ='ProcessName'");

ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection collection = searcher.Get();

foreach(ManagementObject obj in collection)
{
    obj.InvokeMethod("Terminate", null);
}

这是Stanley Gu's Blog

的参考

答案 1 :(得分:0)

当您从工作站运行时,您在本地计算机上执行kill程序并尝试终止本地计​​算机上的进程2775,而不是服务器上的进程。