Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用wmi终止远程计算机上的进程_C#_Wmi - Fatal编程技术网

C# 如何使用wmi终止远程计算机上的进程

C# 如何使用wmi终止远程计算机上的进程,c#,wmi,C#,Wmi,我试图杀死远程计算机上的一个进程,但它不起作用,而且我没有收到任何错误。 我正在使用以下代码: ManagementScope scope = new ManagementScope("\\\\" + txtMaquina.Text + "\\root\\cimv2"); scope.Connect(); ObjectQuery query = new ObjectQuery("select * from Win32_pro

我试图杀死远程计算机上的一个进程,但它不起作用,而且我没有收到任何错误。 我正在使用以下代码:

            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
,进程名来自
列表视图中的选定项

有人知道这里出了什么问题吗

我没有任何错误

那是因为你实际上没有检查错误。您可能希望出现异常,但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;
    }
}

现在您知道从何处开始查找。

您的问题来自以下参数:

  • txtMaquina.Text:必须是机器名
  • lstprocess.SelectedItem.ToString():必须是类似Taskmgr.exe的exe名称
我已经在我的计算机上运行了你的代码,我可以在输入参数中使用正确的值。
正如Brett所说,您可以调试它,使用即时窗口或在单元测试夹具中运行代码片段。

我在代码项目上使用此解决方案解决了我的问题:

可能重复
lstprocess。SelectedItem.ToString()
可能不正确。。它可能正在返回类型名。。(又名
ListViewItem
)。。显然那不是你想要的。。ListView可以是相当复杂的控件(也就是说,如果这是一个listbox控件,selectedItem上可能会有一个
Text
属性。)如果绑定控件,该值通常在dataItem属性中;您将显式地从对象转换为字符串。。。。。只需向下放置一个调试点,查看
lstprocess。选择editem
实例(使用本地/监视窗口..或将鼠标悬停在代码段本身..或使用Immidate控制台..它甚至没有进入foreach。啊,是的,您将其发布到注释中而不是您的问题中非常有帮助。在修复ListView或修复事件处理程序或使用MessageBox.Show之间有点纠缠不清(“流程不再运行”)。嗨,为什么不更好地解释一下哪一个是您的具体问题以及如何解决它?@JuanRuizdeCastilla,因为这是一个太长的解决方案。在这里无法更好地解释。