【问题标题】:ManagementObjectSearcher Get() method returns no resultsManagementObjectSearcher Get() 方法不返回任何结果
【发布时间】:2015-05-06 11:41:47
【问题描述】:

我正在尝试使用 .NET 4.5 上的 WMI/C# 终止远程计算机上的进程。在下面的代码中,当对 ManagementObjectSearcher 实例调用 Get 方法时,没有返回任何内容,因此未到达 foreach 内的行。 ManagementScope 已连接,并且查询变量包含要终止的进程的名称。 感谢您的帮助。

try
        {
            ConnectionOptions connOptions = new ConnectionOptions();
            connOptions.Impersonation = ImpersonationLevel.Impersonate;
            connOptions.EnablePrivileges = true;
            ManagementScope manScope = new ManagementScope(String.Format(@"\\{0}\ROOT\CIMV2", NetworkName), connOptions);
            manScope.Connect();
            var query = new SelectQuery("select * from Win32_process where name = '" + ProcessName + "'");

            using (var searcher = new ManagementObjectSearcher(manScope, query))
            {
                foreach (ManagementObject process in searcher.Get())
                {
                    process.InvokeMethod("Terminate", null);
                }
            }
        }
        catch (ManagementException err)
        {
            //Do something with error message here
        }

【问题讨论】:

    标签: c# .net wmi


    【解决方案1】:

    正如我在上面的评论中所概述的,为了完整起见,我的代码如下所示。

            try
            {
                ConnectionOptions connOptions = new ConnectionOptions();
                connOptions.Impersonation = ImpersonationLevel.Impersonate;
                connOptions.EnablePrivileges = true;
                ManagementScope manScope = new ManagementScope(String.Format(@"\\{0}\ROOT\CIMV2", NetworkName), connOptions);
                manScope.Connect();
                ProcessName = ProcessName + ".exe";
    
                using (var searcher = new ManagementObjectSearcher(manScope, new SelectQuery("select * from Win32_Process where Name = '" + ProcessName + "'")))
                {
                    foreach (ManagementObject process in searcher.Get())
                    {
                        process.InvokeMethod("Terminate", null);
                    }
                }
            }
            catch (ManagementException err)
            {
                //Do something with error message here
            }
    

    【讨论】:

      【解决方案2】:

      在我的情况下,我无法使用 WMI 查询远程接收 CPU 利用率值:

      SELECT PercentProcessorTime FROM Win32_PerfFormattedData_PerfOS_Processor WHERE Name='_Total'
      

      我将项目构建平台目标从 Any CPU 更改为 x64 以匹配我的系统位数,问题得到解决。另一种方法是在选择 Any CPU 时取消选中 Prefer 32-bit 复选框。

      【讨论】:

        【解决方案3】:

        使用Count 属性检查它是否包含任何 记录。也就是说,if(searcher.Get().count == 0) 返回true,表示没有记录

        【讨论】:

        • 谢谢,Count 属性返回 0,这表明实际上查询结果为空。我猜在我的代码中,只要 var query = new SelectQuery(...) 被命中,查询就会在本地机器上执行。无论如何,我已经删除了查询变量,将新的 SelectQuery(...) 声明移到了 ManagementObjectSearcher 构造函数中,并且它正在工作。耶!感谢您为我指明正确的方向。
        • 欢迎 :)..很高兴..我帮助了你..:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-19
        • 1970-01-01
        • 2018-05-01
        • 2020-11-22
        • 1970-01-01
        • 2011-08-17
        相关资源
        最近更新 更多