在简单的 WMI 查询中'Invalid class' C#



我想在这个查询之后找到一些结果,但是在foreach循环的开始,出现错误"invalid class"。

string wmiQuery = string.Format("SELECT * FROM Win32_Process");
var searcher = new ManagementObjectSearcher(wmiQuery);
var wmiResults = searcher.Get();
foreach (ManagementObject retObject in wmiResults)
 {
   Console.WriteLine("[{0}]tName: {1}", retObject["ProcessID"], retObject["Name"]);
 }

我使用windows 7 64,我想知道Win32_Process是否存在。我也使用wmi代码创建器从http://www.microsoft.com/downloads/en/details.aspx?familyid=2cc30a64-ea15-4661-8da4-55bbc145c30e&displaylang=en下载它但是我没有找到任何Win32_Process.

有人有主意吗?

我的问题解决了。看来我的WMI是腐败的。使用以下步骤测试WMI后:

  1. 单击"开始",单击"运行",输入wmimgmt。,然后单击OK。
  2. 右键单击"WMI控制(本地)",单击"属性"。

我看到Win32_Process是一个无效类我按照这个步骤修复我的WMI,它工作了

1)在开始菜单中输入cmd

2)输入"net stop winmgmt"并按Enter

3)打开Windows资源管理器,找到路径C: Windows system32WBEM文件夹,并将Repository文件夹重命名为RepositoryOLD(右键单击并选择"重命名文件夹")。

重新启动计算机

5)在开始菜单中输入cmd

6)输入"net stop winmgmt"并回车

7)输入"winmgmt/resetrerepository"并重新启动计算机。

按照dominus的建议,使用Process类:

...
Process[] processes = Process.GetProcesses();
foreach (Process process in processes)
    Console.WriteLine(process.ProcessName);
...

在我看来,这个例外并没有充分说明问题。下面的代码可以工作。例如,如果在作用域中省略"cimv2",则会发生异常。例如,如果您错误地从"Win32_Processes"中选择,也会出现异常。因此,至少要确保作用域和查询是正确的。

ManagementScope scope = new ManagementScope(@"\localhostrootcimv2");
ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_Process");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
foreach (ManagementBaseObject eachObject in searcher.Get())
{
    Console.WriteLine("Value: {0}", eachObject);
}

添加一下因为这是谷歌搜索中出现的第一件事我在这里遇到了c# wmi查询异常无效类使用ManagmentObjectSearcher

不是所有的WMI提供程序都有32位和64位版本。如果在64位机器上运行32位应用程序,可能会得到无效的类。我知道在这种特殊情况下并非如此,因为Win32_Process有32位和64位提供程序,但认为它可能对一些到达这里的人有用。

最新更新