在远程计算机上运行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");
您应该意识到,您不能保证这工作,因为您正在硬编码进程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,而不是在服务器上。