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

本文关键字:未处理 异常 文件 exe 计算机 运行 | 更新日期: 2023-09-27 18:15:06

我在这个代码上得到一个错误。我试图终止远程机器上正在运行的进程。我用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");

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

您应该意识到,您不能保证这工作,因为您正在硬编码进程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的博客

当您从工作站运行时,您在本地机器上执行kill程序,并试图在本地机器上杀死进程2775,而不是在服务器上。