【问题标题】:How to kill process on remote computer with wmi如何使用 wmi 杀死远程计算机上的进程
【发布时间】:2015-09-17 19:21:20
【问题描述】:

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

            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 上的选定项目中获取的进程名称

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

【问题讨论】:

  • lstProcessos.SelectedItem.ToString() 可能不正确..它可能返回类型名称..(又名ListViewItem)..显然这不是您想要的.. ListViews 可以是相当复杂的控件(即, 如果这是一个列表框控件,则 selectedItem 上可能会有一个Text 属性..)
  • 如果是绑定控件,值一般在dataItem属性中;您将明确地从对象转换为字符串.....只需放下一个调试点并查看lstProcessos.SelectedItem 实例(使用本地/监视窗口..或将鼠标悬停在代码sn-p本身上..或使用即时控制台..

标签: c# wmi


【解决方案1】:

我没有任何错误

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

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

【讨论】:

  • 它甚至没有进入 foreach。
  • 啊,是的,您将其发布到评论而不是您的问题中非常有帮助。在必须修复 ListView 或修复事件处理程序或使用 MessageBox.Show("Process no longer running") 之间有点折腾。
【解决方案2】:

你的问题来自于参数:

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

我已经在我的计算机上运行了您的代码,并且在输入参数中使用正确的值可以正常工作。 正如 Brett 所说,您可以调试它、使用即时窗口或在单元测试夹具中运行代码 sn-p。

【讨论】:

    【解决方案3】:

    我在代码项目中使用此解决方案解决了我的问题:http://www.codeproject.com/Articles/18146/How-To-Almost-Everything-In-WMI-via-C-Part-Proce

    【讨论】:

    • 您好,为什么不更好地解释一下您的具体问题是什么以及如何解决呢?
    • @JuanRuizdeCastilla 因为这是一个太长的解决方案。在这里无法更好地解释。
    猜你喜欢
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 2015-06-30
    相关资源
    最近更新 更多