c#简单WMI查询中的“无效类”

时间:2011-08-02 20:35:59

标签: c# windows wmi wmi-query

我想在此查询后找到一些结果,但在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"]);
 }

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

有人有想法吗?

4 个答案:

答案 0 :(得分:12)

我解决了我的问题。看来我的WMI已经腐败了。 在使用此步骤测试WMI之后:

  1. 单击“开始”,单击“运行”,键入wmimgmt.msc,然后单击“确定”。
  2. 右键单击“WMI控件(本地)”,然后单击“属性”。
  3. 我看到Win32_Process是一个无效的类 我按照这一步修复我的WMI,它可以正常工作

    1)在开始菜单中输入“cmd”

    2)键入“net stop winmgmt”并按Enter键

    3)打开Windows资源管理器并找到C:\ windows \ system32 \ WBEM \文件夹的路径,并将Repository文件夹重命名为RepositoryOLD之类的其他内容(右键单击并选择“重命名文件夹”)。

    4)重启电脑

    5)在开始菜单中输入“cmd”

    6)输入“net stop winmgmt”并按Enter键

    7)输入“winmgmt / resetRepository”并重新启动计算机。

答案 1 :(得分:2)

正如dominus建议的那样,使用Process类:

...
Process[] processes = Process.GetProcesses();

foreach (Process process in processes)
    Console.WriteLine(process.ProcessName);
...

答案 2 :(得分:0)

在我看来,例外并没有充分说明问题。以下代码有效。例如,如果您在范围中省略“\ cimv2”,则会发生异常。例如,如果您错误地从“Win32_Processes”中选择,则也会发生异常。因此,至少要确保范围正确且查询正确。

ManagementScope scope = new ManagementScope(@"\\localhost\root\cimv2");
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);
}

答案 3 :(得分:0)

只需添加一下,因为这是Google搜索上弹出的第一件事,{@ 3}}在这里发布了自己

并非所有WMI提供程序都具有32位和64位版本。如果在64位计算机上运行32位应用程序,则可能会得到无效的类。我知道在这种特殊情况下情况并非如此,因为Win32_Process具有32位和64位提供程序,但认为对于到达此处的用户可能有用。