我在这段代码上收到错误。我试图杀死远程计算机上正在运行的进程。我使用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");
答案 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);
}
的参考
答案 1 :(得分:0)
当您从工作站运行时,您在本地计算机上执行kill程序并尝试终止本地计算机上的进程2775,而不是服务器上的进程。