如何用wmi杀死远程计算机上的进程

时间:2015-09-17 19:21:20

标签: c# 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上的所选项目获取的进程名称

有人知道这里有什么问题吗?

3 个答案:

答案 0 :(得分:3)

  

我没有任何错误

那是因为你实际上没有检查错误。你可能希望有一个异常,但这不是Terminate方法的作用。它返回错误代码。您不能忽略ManagementObject.InvokeMethod()的返回值。

因此,通过获取您现在没有的异常开始解决问题:

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;
    }
}

现在你知道从哪里开始寻找。

答案 1 :(得分:2)

您的问题来自参数:

  • txtMaquina.Text:必须是计算机名称。
  • lstProcessos.SelectedItem.ToString():必须是exe名称,例如 Taskmgr.exe

我在我的计算机上运行你的代码,我在输入参数中使用正确的值可以正常工作。 正如Brett所说,您可以调试它,使用即时窗口或在单元测试夹具中运行代码片段。

答案 2 :(得分:2)