如何使用 wmi 终止远程计算机上的进程
How to kill process on remote computer with wmi
我正在尝试终止远程计算机上的进程,但它不工作,而且我没有收到任何错误。
我正在使用此代码:
ManagementScope scope = new ManagementScope("\\" + txtMaquina.Text + "\root\cimv2");
scope.Connect();
ObjectQuery query = new ObjectQuery("select * from Win32_process where name = '" + lstProcessos.SelectedItem.ToString() + "'");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection objectCollection = searcher.Get();
foreach (ManagementObject managementObject in objectCollection)
managementObject.InvokeMethod("Terminate", null);
计算机名称是 txtMaquina.Text
,我从 ListView
上的选定项目中获取的进程名称
有人知道这里出了什么问题吗?
and i'm not having any error
那是因为您实际上并没有检查错误。您可能希望出现异常,但这不是 Terminate 方法的作用。它 return 是一个错误代码。您不能忽略 ManagementObject.InvokeMethod() 的 return 值。
因此,通过获取您现在没有的异常来开始解决问题:
foreach (ManagementObject managementObject in objectCollection) {
int reason = (int)managementObject.InvokeMethod("Terminate", null);
switch (reason) {
case 0: break;
case 2: throw new Exception("Access denied"); break;
case 3: throw new Exception("Insufficient privilege"); break;
case 8: throw new Exception("Unknown failure"); break;
case 9: throw new Exception("Path not found"); break;
case 21: throw new Exception("Invalid parameter"); break;
default: throw new Exception("Terminate failed with error code " + reason.ToString()); break;
}
}
现在您知道从哪里开始寻找了。
您的问题来自参数:
- txtMaquina.Text:必须是机器名。
- lstProcessos.SelectedItem.ToString(): 必须是像 Taskmgr.exe
这样的 exe 名称
我已经 运行 你的代码在我的电脑上,我在输入参数中使用正确的值工作正常。
正如 Brett 所说,您可以调试它,使用立即 windows 或 运行 单元测试夹具中的代码片段。
我在代码项目上使用这个解决方案解决了我的问题:http://www.codeproject.com/Articles/18146/How-To-Almost-Everything-In-WMI-via-C-Part-Proce
我正在尝试终止远程计算机上的进程,但它不工作,而且我没有收到任何错误。 我正在使用此代码:
ManagementScope scope = new ManagementScope("\\" + txtMaquina.Text + "\root\cimv2");
scope.Connect();
ObjectQuery query = new ObjectQuery("select * from Win32_process where name = '" + lstProcessos.SelectedItem.ToString() + "'");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection objectCollection = searcher.Get();
foreach (ManagementObject managementObject in objectCollection)
managementObject.InvokeMethod("Terminate", null);
计算机名称是 txtMaquina.Text
,我从 ListView
有人知道这里出了什么问题吗?
and i'm not having any error
那是因为您实际上并没有检查错误。您可能希望出现异常,但这不是 Terminate 方法的作用。它 return 是一个错误代码。您不能忽略 ManagementObject.InvokeMethod() 的 return 值。
因此,通过获取您现在没有的异常来开始解决问题:
foreach (ManagementObject managementObject in objectCollection) {
int reason = (int)managementObject.InvokeMethod("Terminate", null);
switch (reason) {
case 0: break;
case 2: throw new Exception("Access denied"); break;
case 3: throw new Exception("Insufficient privilege"); break;
case 8: throw new Exception("Unknown failure"); break;
case 9: throw new Exception("Path not found"); break;
case 21: throw new Exception("Invalid parameter"); break;
default: throw new Exception("Terminate failed with error code " + reason.ToString()); break;
}
}
现在您知道从哪里开始寻找了。
您的问题来自参数:
- txtMaquina.Text:必须是机器名。
- lstProcessos.SelectedItem.ToString(): 必须是像 Taskmgr.exe 这样的 exe 名称
我已经 运行 你的代码在我的电脑上,我在输入参数中使用正确的值工作正常。 正如 Brett 所说,您可以调试它,使用立即 windows 或 运行 单元测试夹具中的代码片段。
我在代码项目上使用这个解决方案解决了我的问题:http://www.codeproject.com/Articles/18146/How-To-Almost-Everything-In-WMI-via-C-Part-Proce